目录
1、Cordic算法介绍
2、Cordic IP核介绍
3、仿真
4、存在的问题
5、参考
1、Cordic算法介绍
cordic算法将正余弦计算转换为简单的迭代过程(一系列的加减和移位操作), 非常适合硬件实现,是对正余弦等数学计算的逼近。
以旋转过程为例,简述cordic算法思想(计算正余弦可以认为起始点P在x轴上,旋转结果的xy坐标即为旋转角度的cos、sin):
和差化积公式:
带入P点:
进一步:
伪旋转:
伪旋转不再考虑
,导致旋转后模值改变(变大):
旋转分解:
将旋转分解成为一系列的微旋转(直接旋转难以计算,将其分解为一系列易于计算的微旋转),实现了一系列加减和移位来逼近正切值计算。
第i+1 次旋转后的结果为:
微旋转角度选择, 正是它使得该算法非常易于硬件实现, 即令:
这里di∈{-1,1}, 结合式( 3.99), 式 (3.98) 可重新改写为:
不难看出, 每次微旋转在xy坐标上带来的影响是1/(2^i),因此只需要加法 、 减法和移位操作即可完成。
结论:
这一系列微旋转角已知,Cordic计算的过程就是通过一系列微旋转角度的旋转(根据理想角度与当前角度大小关系选择顺时针还是逆时针旋转),逼近计算角度的过程。
微旋转角度和存在极值,因此理想角度存在输入范围。超出范围的需要预处理。
伪旋转对模值的影响,近似为放大了1/K倍。K=0.607252935
2、Cordic IP核介绍
1、功能设置,包括旋转、正余弦计算、开方运算等,此处设置为正余弦计算
2、配置设置,选择为并行
3、数据形式设置,选择为有符号小数
4、相位格式设置,包括弧度(-3.14-3.14)和缩放(-1-1)
5、数据位宽设置(精度)
6、配置结束,可以看出输出延迟为20个clk
7、配置结束,对应的数据位宽和分配
3、仿真
可以看出:
1、正余弦计算正确
2、输出延迟确实为20clk
4、存在的问题
经过105ns以后的输入才有对应输出,这105ns如何确定?实际中如何处理这一段时间?
5、参考
CORDIC算法详解(一)-CORDIC 算法之圆周系统之旋转模式
Cordic v6.0 IP CORE使用说明
vivado中cordic IP 6.0 关于sin/cos输入输出位数问题