上一篇简要的回顾了一下FFT的基本原理,有人已经等不及了,抱怨说原理就不用多说了吧,期待的是如何实现FFT功能。其实我觉得有3个方面都是很重要的:算法的原理,算法的分析,算法的实现,这些暂时就不展开说了。接下来我将进一步的学习使用Quartus自带的IPcore来实现FFT功能的,同时学习一下如何进行仿真,如何相互印证结果的准确性等。
1、相关工具
quanrtus 14.0
Modelsim 10.1e
Maltab R2015
2、使用IPcore,生成FFT模块
1)打开Quartus,创建一个工程
2)在Quartus软件的右边有个IPcatalog,找到FFT v14.0
3)双击FFT v14.0,输入文件名,取名fft256.v,注意一下路径!
! B \( H4 j5 y; O/ ^" M" O
接着就出现FFT IPcore配置页面
思路还是很清晰:
Step1:设置相关参数
Step2:生成仿真所需要的文件
Step3:生成所需要的文件
1 z: T2 b8 u. U- C
接下来我们一一说明
Step1:参数设置如下
做个256点的FFT,数据输入长度16bit,旋转因子长度16bit,输出数据精度是29bit实际输出是16bit
IO Data Flow默认是Streaming模式,其它模式的功能详解可以参考
勾上了时钟使能功能,同时可以根据自己FPGA芯片资源你的使用情况,来选择是否使用内部RAM资源。
Step2:生成仿真文件
勾上Generate Simulation Model
Step3:生成全部文件
点击Generate
生成所有的文件如下所示:
3、仿真、仿真,还是仿真
上述配置完成以后,我相信很多人还是有很多的疑问,参数如何选择?不同的输出模式在什么场合应用?等等
1) Matlab仿真
涉及文件有两个fft256tb.m,fft256model.m;
其中fft256tb.m调用了fft256model函数,fft256model调用了Sfftmodel,Sfftmodel函数是Quartus自带一个库文件,没有找到相关的说明
我们来分析一下fft256tb.m文件
N=256;这个是需要进行FFT的点数 % Read input complex vector from source text files fidr = fopen('fft256_real_input.txt','r'); fidi = fopen('fft256_imag_input.txt','r'); xreali=fscanf(fidr,'%d'); ximagi=fscanf(fidi,'%d'); fclose(fidi); fclose(fidr); 以上是打开两个文件,并从两个文件中把实部和虚部的数据读入; % Create input complex row vector from source text files x = xreali' + j*ximagi'; xreal和ximage需要转置一下,然后组成复数x [y, exp_out] = fft256_model(x,N,0); 调用fft256_model函数,完成FFT操作 fidro = fopen('fft256_real_output_c_model.txt','w'); fidio = fopen('fft256_imag_output_c_model.txt','w'); fideo = fopen('fft256_exponent_out_c_model.txt','w'); fprintf(fidro,'%d\n',real(y)); fprintf(fidio,'%d\n',imag(y)); fprintf(fideo,'%d\n',exp_out); fclose(fidro); fclose(fidio); fclose(fideo); 把转换后的结果写入文件,可以用作后面的数据比较 |
用Matlab仿真的具体顺序,入下图所示:
1) 打开Matlab,
2) 双击fft256tb.m,在代码串口可以产看文件源码,可见图中1、2
3) 点击RUN,运行fft256tb.m,可以看到在文件目录下生成了3个文件:
fft256_real_output_c_model.txt,
fft256_imag_output_c_model.txt,
fft256_exponent_out_c_model.txt
可见图3、6
4) 图4和图5是中间变量的输出窗口和调试窗口
到此应该还是不够直观,我加入了原始信号的图形显示和FFT后的图形显示,如下所示:
好像看起来还是不够明显哦,暂时就这样吧,不知道为何altera提供这样的一个测试文件,细节暂时不表,Matlab的仿真暂时到这里,有了输入的文件,有了输出的结果。继续学习一下用Modelsim仿真能够得到什么样的结果,并比较一下和Matalb的仿真结果是否一致。
2) Modesim仿真
(一) 创建一个Project,取名fft256
名称可以随便取,但是ProjectLocation需要放在FFT的生成目录,要不然很多文件会找不到的
(二) 增加相关文件,并全部编译
相关的文件有6个,一个都不能少哦!!
如果丢了sgate.v这个文件会出现以下错误
(三) 编译完成后加载相关信号
(四) 开始运行,多么漂亮的结果
到这里就完成了吗?没有我们还有个很重要的事情,就是比较Matlab和Modelsim仿真结果的一致性!!
: Y% y4 q- e( S( o( E" h/ }2 ?$ T W
4、结果比较
先放大一下看看Modelsim的结果吧
再来看看Matlab仿真出来两个文件的结果吧
/ m) r+ W2 ~, f8 {6 K
睁大眼睛仔细的看看,是否有惊人的发现,两个结果完全一致!当然如果不一致,那一定是你操作错了,哈哈