FFT_IP核函数的使用---V2.1.0IP核说明
[复制链接]
一. V2.1.0版本的基本性能特点: (1) 采用基-4算法和基-4/2混合基算法;采用频域抽取方式(DIF)的FFT算法; (2) 输入数据采用定点方式输入(输入数据为real、imag ,但没有exponent),在运算过程中采用块浮点方式进行运算,使用块浮点结构能够获得最大的SNR和最少逻辑需求之间的平衡;输出采用指数形式输出(即包含real、imag、exponent),输出结果为:“数据”×(2^(-“指数”)); (3) 可以完成的FFT变换长度为2^m(6≤m≤14),即64~16384点;数据位宽为8~24bits; (4) 如果输入的数据向量不够N点(FFT设置中的转换长度,例如:1024等),则FFT_IP核函数会在输入数据的后面自动进行补0填充,扩展成N点的数据。 (5) 输入、输出数据采用有符号复数表示,都采用自然排序方式; (6) 支持单倍输出(Signal-output)和四输出(Quad-output)引擎(engine); (7) 多路I/O数据流模式:流(Streaming)、缓冲突发(Buffer Burst)、突发(Burst); (8) Version_2.1.0版本的FFT_IP核函数采用的是Atlantic Interface接口协议;Version_7.2版本的FFT_IP核韩式采用的是Avalon Streaming(ST) Interface接口协议。 (9) Version_2.1.0版本不支持RTL级Modelsim仿真,Version_7.2版本支持。也就是说,2.1.0版本的FFT_IP核函数不能再自己新建的工程中通过QuartusII调用Modelsim进行RTL的仿真。 二. IP_Core的参量设置: (1) Twiddle Precision表示的是旋转因子的位宽精度;Data Precision表示的是输入、输出数据位宽精度。 注意:旋转因子的位宽精度必须小于或等于数据的位宽精度; (2) 在Complex Multiplier Implementation选择栏中的Structure列表中选择期望的复数乘法器结构复数乘法器可以使用4个实数乘法器和2个加法/减法器完成,或使用3个乘法器、5个加法器和一些附加的延时单元完成。 注意:在Stratix II、Stratix GX和Stratix器件中选择4个乘法器和2个加法器可以最大化DSP模块的使用并最小化逻辑单元(LE)的使用。 (3) 在使用 FFT_IP_Core的时候,必须指定“ FFT MagaCore Function user library”。方法:“ Setting”à“ Library”à找到“ \fft-v\lib\”然后 Add。 注意:如果 \fft-v\lib\目录下的“ fft-pack.vhd”文件没有添加到公众 File中,则需要手动添加,并且要保证此文件位于 Setting中 File name框的最顶层。 三. FFT_IP_Core的函数规范: (1) 功能描述: 长度为N的离散傅立叶变换(DFT)是计算单位圆上N点均匀分布的离散时间序列(k=2πk/N,k=0,1,2,……,N-1)的取样傅立叶变换。 使用基-r的FFT算法可以将N点的数据分解成“logrN”级运算,每级需要“N/r”个基-r碟形单元。 FFT_IP核将输入序列按基-4方式进行分解,若N是2的奇数幂,则FFT_IP核会自动的在完成转换的最后使用基-2算法运算(这就是基-4/2的由来)。 (2) FFT_IP处理器引擎结构 FFT_IP核函数可以通过定制参数来使用两种不同的引擎结构:四输出(Quad-output)或单输出(Single-output)引擎结构。为了增加FFT_IP核函数的总吞吐量,可以在一个FFT_IP核函数中使用多个并行的引擎。 ◆ 四输出FFT引擎结构 对于需要最少转换时间的应用,四输出FFT引擎结构是最佳选择。四输出指的是内部FFT碟形处理器的吞吐量,这种引擎实现结构在一个单时钟周期内计算所有四个基-4碟形复数输出。 复数据x[k,m]从内部存储器并行读出,并由变换开关(SW)重新排序。紧接着,排序后的数据由基-4处理器处理并得到复数输出G[k,m]。由于基-4按频率抽选(DIF)分解方法固有的数学特点,在蝶形处理器输出上仅需要3个复数乘法器完成3次乘旋转因子(有一个旋转因子为1,不需要乘)计算。为了辨别数据的最大动态范围,四个输出由块浮点单元(BFPU)并行估计,丢弃适当的最低位(LSB),在写入内部存储器之前对复数数值进行四舍五入并由SW重新排序然后输出。 ◆ 单输出FFT引擎结构 在需要最小尺寸FFT函数的应用中,单输出引擎最适合。单输出也指的是内部FFT碟形处理器的吞吐量。在这种结构中,每个时钟周期计算一个基-4碟形单元的其中一个单碟形输出。这种结构只需要一个单独的复数乘法器。 (3) I/O数据流结构 FFT_IP核函数支持的I/O数据流结构选项包括:流(Streaming)、缓冲突发(Buffered Brust)和突发(Brust)。 ◆ 流(Streaming)I/O数据流结构 流I/O数据流结构允许输入数据连续处理,并输出连续的复数数据流。这个过程不需要停止FFT函数数据流的进出。 ◆ 缓冲突发(Buffered Brust)I/O数据流方式 这种结构对输入数据进行了缓存,因而不需要等到第一个数据块的运算结果输出完毕才开始进行第二个数据块的数据输入。 ◆ 突发(Brust)I/O数据流方式 这是三种数据流结构中消耗资源最少的,单数其数据吞吐量也是最小的。这种结构没有进行输入数据的缓存,因此必须等到第一个数据块的运算结果输出完毕以后才可以进行第二个数据块的数据输入。 四. FFT_IP核函数仿真文件说明 在使用Matlab和Modelsim进行FFT_IP核函数仿真验证的过程中需要用到的文件有: ◆<variation_name>_tb.v:Verilog的testbench文件。 ◆<variation_name>_wave.do:Modelsim仿真中的波形设置文件,观测波形用。 ◆<variation_name>_vo_msim.tcl:Modelsim的脚本文件,以脚本方式进行Verilog HDL IP核的编译Compile、加载load、运行run。 ◆<variation_name>_model.m:Matlab的位精度模型(Bit accurate model)。在Matlab种模拟FFT的行为级。 ◆_tb.m:Matlab的testbench文件,实现FFTMatlab仿真结果输出写入text文件以及从text文件(如:FFT核创建的real_input.txt文件)读取数据输入的功能。 五. FFT_IP核函数信号说明 FFT_IP核函数的控制信号线都是“电平有效”方式! PS:下面的各个信号线名字master_sink_dav[sink_dav]前者表示的是Version_2.1.0版本中的信号名称,后者表示的是Version_7.2版本中的信号名称。 clk——FFT IP Core的系统时钟; reset(in)——IP Core高电平复位信号; master_sink_dav[sink_valid]——数据源将此信号拉高,表明数据源数据已经准备好,至少有N个数据可以提供给IP Core输入。但要真正的能够输入数据到IPCore中还需要master_sink_ena[sink_ready]信号是高电平。 master_sink_ena[sink_ready]——作为master_sink_dav[sink_valid]的响应,IP Core将此信号拉高,表明IP Core可以开始接收输入数据了。当全部样点载入以后,IP Core将此信号拉低,表明其不能再接收任何数据了;这时候IP Core开始进行运算。在FFT处理器从内部输入缓存中将输入数据读走之后,master_sink_ena被再次置为高电平,表明它能够读取下一个输入数据块了。 master_sink_sop[sink_sop]——当第一个复数样本输入到IP Core中的同时,此信号拉高,表明输入块的开始;在下一个时钟周期,此信号又拉低,接下去的N-1个样点按照自然顺序载入; inv_i[inverse]——表明进行FFT还是IFFT。在每个数据块输入的开始,也就是master_sink_sop被拉高的同时进行此信号的设置。0àFFT master_source_dav[source_ready]——高电平表明数据源可以接收来自IP Core的结果数据。 master_source_ena[souece_valid]——在变换完成且master_source_dav为高电平的时候,将此信号拉高,外界设备可以读取IP Core输出的变换数据结果。 master_source_sop[souece_sop]——变换数据结果的开始,是一个时钟周期宽的脉冲。 master_source_eop[souece_eop]——变换数据结果的结束,是一个时钟周期宽的脉冲。 六. 使用Matlab进行FFT_IP核函数仿真 仿真步骤: ◆启动Matlab程序,并将FFT工程文件目录保存到Matlab文件路径中。或者将Matlab的当前路径修改成IP核工程所在的文件夹中。例如: cd C:\altera\qdesigns60\wdn_work\FFT_IP_72_example ◆通过以下两种方式之一实现Matlab的仿真: A.用户自己产生想要进行FFT变化的数据(复数形式),然后调用FFT IP核生成的Matlab程序(例如:my_fft_ip_example_model.m)进行FFT的行为模拟仿真。 例如以下程序: N=2048; %FFT IP核进行转换的点数 INVERSE = 0; %转换的方向:0 => FFT;1=> IFFT x = (2^12)*rand(1,N) + j*(2^12)*rand(1,N); %想要进行FFT的输入数据 [y,e] = _model(x,N,INVERSE); %FFT变换后的输出 B.使用FFT IP核创建的数据进行Matlab仿真。输入FFT IP核创建的Matlab testbench文件名(例如:my_fft_ip_example_tb.m),程序就会自动的从FFT IP核所创建的“.txt”文件中读入数据,并自动运行my_fft_ip_example_model.m程序完成仿真。仿真结果保存在Matlab的work目录下的text文件。 七. 使用Modelsim进行FFT_IP核函数仿真 仿真步骤: ◆启动Modelsim程序(直接启动而不是通过QuartusII进行调用),并将工作路径change到FFT IP核工程所在的文件夹下。 ◆在Modelsim界面中点击“Tools”à“Execute Macro…”à在弹出的对话框中选择“my_fft_ip_example_vo_msim.tcl”à“打开”即可。运行FFT IP核所创建的Modelsim仿真程序脚本文件(例如:my_fft_ip_example_vo_msim.tcl)即可。 然后脚本程序就会自动的进行相关的程序,创建一个Modelsim project,映射library,编译top-level design,以及关联test bench,然后输出仿真结果到waveform viewer,同时保存输出到文件“real_output_ver.txt”中(在QuartusII工程文件夹中)。 注意:如果IP核中使用到了.mif或者.hex文件,则在进行Modelsim仿真以前需要进行一些相应的操作:(参见本文的“八. 在Modelsim中使用mif文件”) 八. 在Modelsim中使用“.mif”和“.hex”文件 “.mif”和“.hex”文件都是QuartusII支持的数据文件格式,常被用作存储器初始化文件。可是,Modelsim不支持“.mif”文件,只支持“.hex”文件。仿真过程中需要使用.mif文件或.hex文件的时候通过以下步骤: ◆ 首先使用QuartusII打开.mif文件,然后另存为.hex文件。(即:在QuartusII中“File”à“Save As…”) ◆ 将quartus60\eda\mentor \modelsim下的convert_hex2ver.dll拷贝至ModelSim的win32目录下(即Modelsim的安装目录里的win32文件夹下)。 ◆ 打开Modelsim安装根目录下的modelsim.ini文件,找到:“List of dynamically loaded objects for Verilog PLI applications”,在它的下面添加如下一行: Veriuser = D:\Modeltech_6.1f\win32\convert_hex2ver.dll (这是刚才复制的目的地址)经过这样后,Modelsim才支持对.hex文件的仿真。 ◆ 将生成的.hex文件也要复制到QuartusII中的Modelsim中去。即把.hex文件复制到例如如下的路径中去: D:\altera\qdesigns60\wdn_project\wave_generate\simulation\modelsim\*.hex 否则会出现警告:(Warrning:It's failure to open the file *.hex)!!! ◆ 注意1:如果原先的QuartusII中已经有ROM的存在,且他们的初始化文件都是“.mif”格式的文件,则需要先将这些ROM的初始化文件改成“.hex”格式的。这样在QuartusII中调用Modelsim的时候才不会报告: “Error:can't read the file ....” 另外:modelsim.ini文件有两个,一个是在当前工程的“simulation\modelsim”里,一个是在默认的modelsim安装目录下面。针对当前工程只需要修改当前工程里的就够了,但是建议大家将两个文件都改,这样将来有新工程的时候就不用再改了。 ◆ 注意2:使用Modelsim进行读写文件的仿真时,需要将文件放置在QuartusII的工程中的\Simulation\Modelsim文件夹下才行!
|