关于XILINX FPGA FFT IP核的学习笔记

时间:2021-04-22 14:50:05

最近在做载波同步锁相环的时候,需要用到FFT核对AD采样数据进行傅里叶变换,以得到锁相环中NCO的初始频率控制字。关于FFT蝶形算法,包括高版本的FFT核(带AXI4协议)在这先不阐述了。


本文主要是记录7.1版本的FFT核学习仿真记录,把摸索过程中遇到一些问题和解决方法都记录下来,方便以后借鉴和使用。


首先是IP核的配置:


关于XILINX FPGA FFT IP核的学习笔记


配置的第一页主要是通道数量设置,转换点数设置,目标时钟速率设置,还有IP核工作模式的选择。在这里我们只是验证用,只需要用一通道,做1024点FFT,以及流水线工作模式。关于工作模式,流水线速度最快,占用资源最多,突发基二速度最慢,资源最少,这是FPGA速度和面积转换的一个典型的例子,可以根据工程需求进行选择。


关于XILINX FPGA FFT IP核的学习笔记


第二页可以设置数据类型(定点Fixed Point或浮点Floating Point);数据位宽和相位因数位宽,这里我这边NCO产生的正弦波幅值位宽是17位,与之对应;凑整模式(Rounding Modes)选择(截断truncation或收敛舍入convergent rounding);输出指令(output ordering)选择:这里默认是倒位次序输出,这样的话输出的幅值是不按频率顺序排列的,选择自然顺序之后,输出的幅值才是按频率次序输出。没有提及到的都是我的工程中没有涉及到的选项,例如额外引脚选择,输入是否偏置都是按默认值走的。


关于XILINX FPGA FFT IP核的学习笔记


第三页也是按的默认值设置,没有变动。


生成IP核之后,需要对IP核的引脚及其功能进行了解。懒癌发作了,不自己码了。在网上找了图片一贴,这个比我码要详细得多:


关于XILINX FPGA FFT IP核的学习笔记关于XILINX FPGA FFT IP核的学习笔记

关于XILINX FPGA FFT IP核的学习笔记


接下来说下仿真的工程,我把IP核例化到顶层文件中,与此同时,根据正弦波信号的傅里叶变换为单位冲击响应函数,所以在工程里还设置了NCO模块产生正交正弦波给FFT核作为输入,目的是为了观测能否得到一个单位冲击函数的输出结果(实际做出来不会是理想冲击响应,会像频谱仪观测正弦波信号一样得到一个尖峰点频)。在仿真文件中,把顶层模块作为仿真文件的目标对象,仿真文件中设置好时钟复位,以及FFT核缩放因子等参数的设置。工程的具体构架如下(带仿真的testbench):


关于XILINX FPGA FFT IP核的学习笔记


一切准备就绪后,我们运行modelsim对工程进行仿真,仿真结果如下:


关于XILINX FPGA FFT IP核的学习笔记

关于XILINX FPGA FFT IP核的学习笔记


这里选择了顺序输出,缩放因子也需要经过好几次的尝试才能得到一个比较合适的值。由于在modelsim仿真结果中观察不是很直观,于是在仿真文件中加入如下代码将仿真结果导出到txt文件中,借助强大的MATLAB进行画图观察。


关于XILINX FPGA FFT IP核的学习笔记


网上还有另外一种在modelsim中输入指令将数据导出的方法,我试过也是可以的,但是感觉不如这种方法方便,按上面的代码会出现三个txt文本,对应三个不同信号的输出结果,MATLAB直接调用此文件就可以,感觉非常方便快捷。因为我这里需要大量的数据,因此我没有给i初始值,i就会一直是不定态这里不会触发$stop。在这里说一下中间遇到的问题,一开始我只导出了实部的数据,画出来的图非常奇怪,完全不是想要的结果。后来把虚部的也导出,实部虚部平方和开根号求出幅值之后再画图,最后终于得到比较满意的结果:


关于XILINX FPGA FFT IP核的学习笔记


这里可以看到最高幅值都集中在频点附近,同时,也能发现谐波的身影,和频谱仪的输出相近。


end