本文介绍如何调用Xilinx的CORDIC IP核生成某一频率的正弦波和余弦波。
主要是CORDIC IP核的设置,下面对其具体参数的设置进行了说明。
图1
标注1:选择函数的类型,这里选择sin和cos。
标注2:选择CORDIC的结构,是字串行还是并行,这里选择并行。
标注3:选择输出流水线类型,这里选择不要流水线。
图2
标注1:选择相位角格式,其中Radians单位为弧度,Scaled Radians单位为多少PI弧度,这里选择Scaled Radians。
标注2:选择输入相位角的数据位宽,我们选择16位。
标注3:舍位模式,选择近似值。
对于相位角的格式这里做具体详细说明:
当相位角设置为Radians时,相位角的取值范围为:-PI<=PHASE_IN<=PI;
当相位角设置为Scaled Radians时,相位角的取值范围为:-I<=PHASE_IN<=1。
数据有效值的定义:
相位角:第一位为符号位,第二、三位为整数位,其余为小数位;
X_out:第一位是符号位,第二位是整数位,其余为小数位;
Y_out:第一位是符号位,第二位是整数位,其余为小数位。
对于有符号数,整数部分为二进制补码。
图3
标注1:选择阶乘和精度,0表示根据数据来自动选择。
标注2:选择CORDIC算法的范围,将输出值控制在-PI/4~+PI/4之间还是-PI~+PI之间。
标注3:选择输出,此处选择RDY来查看什么时候输出数据有效。
如果要生成正余弦波,Coarse Rotation 必须选上,让输出数据是整个圆平面。
由于我们设置的数据为16位的Scaled Radians模式,所以PHASE_IN的取值范围从-1.0到+1.0对应的16进制为:
16'he000和16'h2000。假如我们的相位角从0开始以16‘h00c0自增,Modelsim仿真结果如图4所示:
图5
这是因为当phase_in的值大于+1.0或小于-1.0时,CORDIC IP核会当作+1和-1计算,一直保持相同的值。
从上述仿真结果可以看出,分段出现的波形是完整的,只是没有很好的衔接上。对此我们采用下面的方法使波形衔接。我们选取X_OUT的两个波谷做一个周期,找到两个波谷所对应的PHASE_IN,使两个波谷之间对应的PHASE_IN值不断重复,即可得到完美的正弦波。
为了方便查看,我们增加了cnt计数器。在第一个波谷附近我们找到正弦输出信号的最值点所对应的相位值。方法如下所示:先在仿真波形上选取一段完整的正弦波,如图6.1所示。然后,找出第一个波谷所对应的cnt值,大概在301左右,如图6.2所示。再将正弦输出信号转换为16进制有符号数,在301附近找到最值点-16379,找出此值对应的相位16'helc0。
图6.1
图6.2
图6.3
第二个波谷所对应的相位值的查找如下图所示:
图6.4
图6.5
第二个波谷所对应的cnt值大概为389,对应的正弦输出信号的最值为:-16384,对应的相位值为:16’h2180。
修改程序中的phase赋值部分,如下所示:
修改程序后,仿真得到的波形,如下图所示:
图7
图8