现成的东西已经很高端了,自己编的怎么也不好,就像别人家的孩子一样。IP CORE有最优化的代码,效率和资源的兼顾,所以君子性非异也,善假于物也。
之前实验了很久结果老是不对,费尽了各种周折,最终知道自己的测试方法不对。ip core是根所实际信号优化过的,所以要加以实际信号,如正弦波,而我的思路还停留在教书。展开来说,ip core对于小信号不敏感,比如对于N点fft,输入N个1和输入N个2,结果都是一样的。因为对于位宽较宽的数据,如10位,1或2只是1/2^10,所以结果不会有差异。现实中信号的差异是较明显的,而ip core针对这种情况,进行了优化,实现高速运算。
看具体的顶层配置。
首先在MegaWizard设置好一个fft core,通过matlab产生一个时域信号,导入.mif文件,用rom装载,再由rom送给ip core。验证该时域信号通过matlab和ip core的结果差异。
top level如图:
cnt1024给rom地址,fft_ctrl控制sink_sop和sink_eop,rom里存着待测信号。
需要注意的是resetr_n要有从0到1的配置,而不能一开始就赋1,会计算错误。其他如,sink_sop要与输入帧头对齐(输入数据块的第一个数据),sink_eop要与帧尾对齐。另外source_exp表示对结果的定标,为负值。如source_exp=-4,则结果为source_reak*2^4。仿真结果如下图
可以看到在计算到第二帧的时候,结果开始输出。而256点时,输出开始在第三帧附近,说明点数不同会影响其加速过程。
最后与matlab的fft计算结果进行对比,如下图:
可以看出,在大信号的时候有较准确的贴近,在小信号的时候,失真较大。这也是由于ipcore有限位宽导致的。
--------------------------------------我是奇葩的分割线-----------------------------------------------------------
心得:
1. 将quartus的波形仿真结果输出到matlab
a) 在仿真报告上选fileàsave current report section as,存为.tbl格式的文件
b) 用excel将该报告打开,筛选所需要的数据。由于clk时钟上下变化,使得每一个数据会重复出现。只需要提取奇数或偶数行的数据即可。提取方法见2.
2. Excel的提取奇数、偶数行:在新的一列如E输入=mod(row(),2),然后下拉,则该列会出现奇数为1,偶数为0选中该列,使用“筛选”,如筛选1
奇葩的方法是因为没入门,临时就这样吧。
--------------------------------------------------我是新的分割线--------------------------------------------
接下来需要掌握的:
1.Modelsim的仿真,testbench的编写。现在问题是Modelsim的库怎么也添不上,只是按照网上的教程配置,只知其然不知其所以然,所以应该搞清其文件系统。对quartus也是同样的道理,生成了哪些文件,运行的时候是哪些文件关联。
2.verilog的入门。现在只好最简单的积木,然后从建模到时序,verilog有非常庞大和自由的体系,要反复训练才能得其要领。希望我会喜欢上搭积木的感觉。
最后要谢谢小明,要不是你,我可能一辈子陷入为什么输入1和2结果却都一样的困惑中。实际和理论有很大的差距,多多接触,适应这个实际。