[VHDL]

应用cordic算法实现atan2功能的VHDL代码

[复制链接]
1473|3
手机看帖
扫描二维码
随时随地手机跟帖
ucx|  楼主 | 2022-11-23 22:00 | 显示全部楼层 |阅读模式
本帖最后由 ucx 于 2022-11-23 22:10 编辑

在通信领域,相干或非相干解调中常会用到正交解调(一个I,一个Q)方法。
通过I和Q获得幅度和辐角信息。获得辐角的方法在matlab里就是P=atan2(Y,X)函数。
本帖提供的VHDL代码就是应用cordic算法完成atan2功能的模块,
模块的输入x,y是以1比特符号(0正1负)加16比特幅度的形式表示,bgn输入触发计算16个时钟后qTheta输出有效并保持不变直到下一次bgn输入触发更新。qTheta可以看作是0~360°范围的无符号18位整数,也可以看作是-180°到+180°的有符号整数。
由于本模块中用到的自定义函数库ucx_std库包含了使用VHDL2008语句的函数,所以本模块必须在VHDL2008环境下编译才能成功。当然,可以通过删除ucx_std中包含VHDL2008语句的部分即可使本模块在VHDL1993环境下编译通过。
如果同仁有需要,本人选个清闲的时间再把modelsim或vivado环境下的仿真结果贴上来。


atan2.rar

7.34 KB

使用特权

评论回复
评论
shiangX 2023-2-18 16:46 回复TA
你好楼主,可以发一下仿真结果吗 

相关帖子

ucx|  楼主 | 2023-2-27 11:55 | 显示全部楼层
本帖最后由 ucx 于 2023-3-2 12:01 编辑

其modelsim仿真结果如下
仿真中x输入固定为3000(本想用的是30000也就是下图中17D“30000”,但刚刚发现在仿真时误写成17D“3000”了)y值的变化使得(x,y)从第1象限跳跃到第4象限,
即qv[0:1]由0变成3。
图片最后是对atan2中出现溢出情况的修正,Xn,Yn由原附件中的20位变成了21位。 cordic工程设置.png



使用特权

评论回复
ucx|  楼主 | 2023-3-2 12:06 | 显示全部楼层
ucx 发表于 2023-2-27 11:55
其modelsim仿真结果如下
仿真中x输入固定为3000(本想用的是30000也就是下图中17D“30000”,但刚刚发现在 ...

例: arctan(63536 / 3000) *65536/90° = 63567

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

ucx

28

主题

85

帖子

5

粉丝