目录
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如何确定?实际中如何处理这一段时间?