Quartus中FFT核的使用

 

这两天学着用了一下Q2中的FFTv9.1核,主要学了Variable Streaming数据流结构,ALTERA关于FFT核的ug_fft写的还是相当详细的,我就是照着这个做的。

下面是对对一些要点的总结:

在这张parameter Tab中:

Twiddle Precision 就是我们平常所说的旋转因子的位数,旋转因子的位数必须小于等于数据的位数。

在Architecture Tab中:

我选择的是Variable Streaming数据流,这个其实和Streaming差不多,只是VS中你可以通过改变fftpts的值来改变FFT的点数。然而其他的时序都是相同的。

输入数据的顺序是顺序输入,输出数据的顺序是位倒序输出,假如你选择的是顺序输出,那将加大你系统的资源消耗,因为系统还得增加个模块将输出转换为顺序输出。

数据表示用的是定点数,而非浮点数。

最终Generate后,会生成好多文件,我用到最多的还是下面几个:

1、imag_input.txt,real_input.txt  输入的实部虚部在放在这两个文本文档里。

    data_rf = $fopen("real_input.txt","r");

 

    用fopen将文件以只读方式打开,并且将指向该流的文件指针返回给data_rf;

    rc_x = $fscanf(data_rf,"%d",data_real_in_int);

    fscanf函数通过data_rf这个流指针将数据格式化输入到data_real_in_int中。(我对这个

    函数理解也不是很深,还得再学学,但大概意思就是这样的)

2、fft_tb.v这是个很重要的testbench,这个必须仔细看,还能看出一些时序什么的。但在这个程序中我发现了一个问题,

wire [31 - 1: 0] source_real;

wire [31 - 1: 0] source_imag;

integer fft_real_out_int,fft_imag_out_int;

fft_real_out_int = source_real;

fft_imag_out_int = source_imag;

source_real是31位数据,而fft_real_out_int为32位数据,当soruce_real为负数时,传给fft_real_out_int后因为fft_real_out_int高位没变,依旧为0,所以数据就变成了正数。这就违背了本意了。

所以我将fft_real_out_int改为[31-1:0],而非integer。

做完上面的步骤我们就可以开始仿真了,datasheet中列了两种方式,一直是matlab,还有就是modelsim。

当我按照说明做matlab仿真时,在command界面中输入:fft_tb时跳出了如下错误

说是这个文件没存在,让我进行HDL级仿真,但我已经进行RTL级仿真了,不知道怎么回事了。。。。。。

但是进行modelsim仿真还是没有错误的,还长了些见识。

(1)On the Processing menu, point to Start and click Start Analysis & Elaboration

查找了Q2 handbook,其中这么解释:

Analysis and Elaboration—Check a design for syntax and semantic errors and perform elaboration to identify the design hierarchy. To perform Analysis and Elaboration, on the Processing menu, point to Start and click Start Analysis & Elaboration除了检查语法语义错误,还得定义设计层次。

顺便查了下我们常用的Start Analysis & Synthesis的解释:

Analysis and Synthesis—Perform complete Analysis and Synthesis on a design, including technology mapping. To perform Analysis and Synthesis, on the Processing menu, point to Start and click Start Analysis & Synthesis. This is the most commonly used command and is part of the full compilation flow.

这个就包括综合了,还有mapping。

(2)On the Tools menu, click Tcl scripts. Select the <variationname>_nativelink.tcl Tclscript and click Run. Check for a message confirming that the Tcl script was successfully loaded.

这个我还是第一次用到,用了TCL后真的方便好多,节省了好多步骤,不用自己去点了,还是很值得去学一学的。

三:

仿真过后就可以分析结果了,研究一下时序什么的。

sink_sop:输入端口,在一个输入frame中的第一个数据期间为高电平,其余时间为低电平。(也可以在上电时开始时就一直为高,直到第一个数据结束后拉低)

sink_eop:输入端口,在一个输入frame中的最后一个数据期间为高电平,其余时间为低电平。

sink_valid:输入端口,数据在数据总线上有效时可以拉高,当sink_valid和sink_ready都拉高时,数据开始传输。

sink_ready:输出端口,这个不用管,输出肯定为高电平的。

source_sop、source_eop、source_valid、source_ready这和上面的原理都一样。

先初略得写到这吧,有想到的再补充。

posted on 2012-03-13 19:03  宕夏  阅读(1804)  评论(0编辑  收藏  举报

导航