【FPGA代码学习】之FFT(2) - IPcore
[复制链接]
本帖最后由 chenzhufly 于 2015-9-3 16:52 编辑
上一篇简要的回顾了一下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
fft1.png (18.13 KB, 下载次数: 1)
2015-9-1 18:47 上传
3)双击FFT v14.0,输入文件名,取名fft256.v,注意一下路径!
fft9.png (12.73 KB, 下载次数: 2)
2015-9-1 18:48 上传
接着就出现FFT IPcore配置页面
fft2.png (24.62 KB, 下载次数: 1)
2015-9-1 18:48 上传
思路还是很清晰:
Step1:设置相关参数
Step2:生成仿真所需要的文件
Step3:生成所需要的文件
接下来我们一一说明
Step1:参数设置如下
做个256点的FFT,数据输入长度16bit,旋转因子长度16bit,输出数据精度是29bit实际输出是16bit
fft3.png (28.04 KB, 下载次数: 2)
2015-9-1 18:49 上传
IO Data Flow默认是Streaming模式,其它模式的功能详解可以参考
fft4.png (28.77 KB, 下载次数: 2)
2015-9-1 18:50 上传
勾上了时钟使能功能,同时可以根据自己FPGA芯片资源你的使用情况,来选择是否使用内部RAM资源。
fft5.png (37.58 KB, 下载次数: 2)
2015-9-1 18:50 上传
Step2:生成仿真文件
勾上Generate Simulation Model
fft6.png (28.46 KB, 下载次数: 1)
2015-9-1 18:52 上传
Step3:生成全部文件
点击Generate
fft7.png (38.41 KB, 下载次数: 3)
2015-9-1 18:53 上传
生成所有的文件如下所示:
fft8.png (58.84 KB, 下载次数: 1)
2015-9-1 18:53 上传
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是中间变量的输出窗口和调试窗口
matlab.jpg (151.81 KB, 下载次数: 3)
2015-9-1 18:56 上传
到此应该还是不够直观,我加入了原始信号的图形显示和FFT后的图形显示,如下所示:
matlab1.jpg (41.74 KB, 下载次数: 1)
2015-9-1 18:57 上传
好像看起来还是不够明显哦,暂时就这样吧,不知道为何altera提供这样的一个测试文件,细节暂时不表,Matlab的仿真暂时到这里,有了输入的文件,有了输出的结果。继续学习一下用Modelsim仿真能够得到什么样的结果,并比较一下和Matalb的仿真结果是否一致。
2) Modesim仿真
(一) 创建一个Project,取名fft256
名称可以随便取,但是ProjectLocation需要放在FFT的生成目录,要不然很多文件会找不到的
modelsim-new.jpg (93.78 KB, 下载次数: 2)
2015-9-1 18:57 上传
(二) 增加相关文件,并全部编译
相关的文件有6个,一个都不能少哦!!
modelsim6.png (31.78 KB, 下载次数: 1)
2015-9-1 18:58 上传
如果丢了sgate.v这个文件会出现以下错误
modelsim2.png (16.9 KB, 下载次数: 1)
2015-9-1 18:58 上传
(三) 编译完成后加载相关信号
modelsim8.png (94.16 KB, 下载次数: 1)
2015-9-1 18:59 上传
(四) 开始运行,多么漂亮的结果
modelsim9.png (119.37 KB, 下载次数: 4)
2015-9-1 18:59 上传
到这里就完成了吗?没有我们还有个很重要的事情,就是比较Matlab和Modelsim仿真结果的一致性!!
4、结果比较
先放大一下看看Modelsim的结果吧
modelsim10.png (53.74 KB, 下载次数: 2)
2015-9-1 19:01 上传
再来看看Matlab仿真出来两个文件的结果吧
modelsim11.png (43.69 KB, 下载次数: 3)
2015-9-1 19:01 上传
睁大眼睛仔细的看看,是否有惊人的发现,两个结果完全一致!当然如果不一致,那一定是你操作错了,哈哈