CORDIC IP教程:创建一个NCO的正弦余弦生成
扫描二维码
随时随地手机看文章
学习如何在Vivado中使用CORDIC IP实现数控振荡器(NCO) !
本教程将引导您在FPGA上创建数字正弦和余弦波发生器。
你将学习:
•NCO组件如何协同工作-从频率控制字(FCW)到相位累加器和CORDIC IP
•在Vivado中逐步实现,包括VHDL模块集成
•使用ILA的实用仿真和调试技术
•在ZCU104板上的真实硬件实现
•提示提取正弦/余弦值和控制波的频率
设计框图
这个框图代表了一个数控振荡器(NCO),它被用来产生一个频率可变的数字正弦波。NCO的主要组成部分是:频率控制字(FCW)、相位累加器和CORDIC IP。
Vivado.png中CORDIC NCO的框图
•频率控制字(FCW - N位):
•FCW是控制产生的正弦波频率的输入值。
•为了增加正弦波的频率,增加FCW。对于较慢的正弦波,减小FCW。
•相位累加器:
•相位累加器是NCO的核心。它通过在每个时钟周期将FCW添加到其当前值来累积相位。
•相位累加器的输出表示正弦波的当前相位。
•该相位值持续增加,当达到π时,累加器将其重置为−π。
相位累加器输出增加到π,然后休息到-π。锯齿波的斜率取决于fw
•相位累加器产生一个相位斜坡信号,其值范围从−π到π。该阶段的阶跃增量由FCW决定。
CORDIC块:
CORDIC块将输入相位转换为相应的正弦和余弦值。
Vivado设计
具有CORDIC IP的NCO在Vivado中的框图
相位累加器和FCW块被实现为VHDL模块,您可以轻松地从GitHub下载它们并将它们添加到您的设计中。
Vivado中的CORDIC块生成32位输出,其中上16位表示正弦值,下16位表示余弦值。为了分别访问这些值,使用两个片来提取各自的部分。
Vivado中CORDIC IP的32位输出:16位数值较高的表示正弦值。
将VDHL代码作为模块添加到您的设计中
从GitHub存储库下载这两个VHDL文件,并将它们作为新源添加到项目中。接下来,右键单击块设计并将FCW和相位累加器作为模块添加到您的设计中。
在Vivado块设计中添加模块选项
将CORDIC IP添加到您的块设计中
从IP目录中,向设计中添加CORDIC IP块。修改CORDIC输出功能以生成正弦和余弦值。
在Vivado中设置CORDIC IP以生成正弦和余弦值
添加片
此外,在设计中包括两个切片:
•第一个切片提取31到16位作为正弦输出。
第一个切片从CORDIC IP输出中提取正弦值
•第二个切片提取15到0位作为余弦输出。
第二切片提取余弦值从CORDIC IP输出
在你的设计中添加模拟时钟
要运行模拟,只需添加一个时钟信号即可。
在所有模块和IP块就位后,正确连接它们。在设计中加入一些端口,使仿真结果的观察更加容易。
完整的框图CORDIC IP模拟在Vivado
添加顶级HDL包装器并运行仿真
最后,创建一个顶级包装器并运行模拟。
仿真结果
仿真结果验证了本文方法的有效性。FCW值越大,相位变化越快,产生频率越高的正弦波。相反,FCW值越小,相位变化越平滑,产生频率越低的正弦波。
我们再检查一下正弦和余弦波的过零点。我们可以观察到两条曲线之间有90度的相位差。另外,请注意,CORDIC块具有内部处理延迟,这会导致相位输入的过零点与生成的波形之间的相位偏移。
CORDIC NCO在Vivado中的仿真结果
Vivado的合成和实现。
FCW和相位发生器模块是完全可合成的,因此不需要修改它们。但是,您必须为设计提供时钟源。您可以使用任何时钟源,例如来自ZYNQ IP块的PS-PL时钟或使用时钟向导生成的外部时钟。
本文编译自hackster.io