对于viavado 中IFFT IP的使用刚开始的时候,没有找到IFFT的IP,最后经过查找资料发现,在VIVADO中 FFT IP和IFFT IP是用的统一个IP,具体是IFFT还是FFT通过设s_axis_config_tdata=1/0设置fft或ifft模式,而且在同一个工程当中,尽量选择同一个IP多次例化使用。

        FFT IP的设置主要包括三个界面,虽然不是每一个标签栏都需要修改配置,但最好也要知道一下他的作用:

第一页界面

         第一个标签页里主要配置通道数,点数,时钟,吞吐量,结构,以及是否可以运行时配置,需要注意的是结构的配置会影响调整因子。如下图所示:

          number  of  channels :变换通道,可以选择多通道,实现多帧数据同时进行FFT运算;

        transform  lenfgth   : FFT变换长度,如果选择了最下面的‘run time configurable transdorm legth’,则该参数是FFT变化的最大长度,一般不选。

     architecure  choice : 这个标签里主要是用来实现,FFT变换所选用的架构:

             Automatically  selected :   自动选择所需要的,FFT变化架构。

                pipelined  streaming     :    并行流水线结构

                radix-4, burst i/o            :   基4 I/O突发结构 

                                               radix-2, burst i/o            :    基2 I/O突发结构

                                               radix-2 life, burst i/o       :   基2 I/O突发结构

          其中流水线的结构变换处理时间最短,资源消耗最大。

     run time configurable transdorm legth  : 该选项可以在FFT变换中通过设置s_axis_config_tdata中NFFT字段的长度来改变FFT变化的长度。

 第二页界面

         第二配置页主要是数据宽度,格式,控制信号,输出方式,和可选的控制信号。需要注意的是输据的输入是自然方式(Natural  Order),输出可以是自然方式也可以是倒序方式(Reversed Order),如果选用倒序方式输出,在后面处理中就要注意这一特性。

         其中在data format;下拉标签中,对应着FFT IP核支持两种数据类型: 
                                       1. 定点全精度 
                                       2. 定点缩减位宽 
         scaling optios :缩放选项 :

                                        1、 block floating point :不管输入的格式如何,FFT变化内部都采用浮点,会根据每一级的的数据情况自动缩放,是的数据不出现溢出的情况,

                                        2、scaled :在m_axis_data_tuser中会有5BIT表示每一级的缩放情况,在s_axis_config_data中会有相应的字段配置配置缩放因子.每一级别包含2个stage ,2个bit 表示一级缩放,一般0-3可选,如果log(NFFT)不是2的倍数,则最高一级的缩放只能在0-1之间选取。

                                        3、unscaled :不用担心变化过程中会出现溢出,但是输入是32bit的话,输出是64bit。

          Aresten : 复位信号要勾选,至少保持两个时钟的低电平。

           output odering options: 输出顺序选项。

                                        1、nature order:就是FFT变化后的输出已经调整了顺序,按照xk_index自然顺序列出变化结果,

                                        2、bit/digital reserved oder就是按照变化后的顺序直接输出,是倒序输出,需要自己后续处理,

                                        3、cyclic perfix insertion :循环前缀插入,一般添加,在进行IFFT后可以根据s_axis_config_data中的CP长度配置自动添加CP。

           optional output fileds :选项输出字段,

                                        1、xk_index:FFT 变幻的结果索引,在m_axis_data_user中有相应的字段。

                                        2、OVFLO是变换中溢出的指示信号,对应event_fft_overflow.

                             

         

 

 

 第三页界面:

         不做任何修改。

  第四:

关于一些端口的说明:

s_axis_config_tdata:控制输入模式,进行fft/ifft以及衰减因子的设置,第0位为1fft,为0做ifft,高位用于scale因子的设置。

s_axis_config_tvalid:拉高若干个时钟周期后归零,之后将s_axis_data_tvalid拉高

s_axis_config_tready:s_axis_config_tvalid拉高两个时钟周期后,该口给1输出;

s_axis_data_tready:s_axis_config_tvalid拉高两个时钟周期后,该口给1输出,ip核初始化完成,可进行数据输入必须进行赋值;

s_axis_data_tvalid:拉高2048个周期,输入2048个数据进行fft;

s_axis_data_tdata:输入32位数据,取低12位数据进行运算;

s_axis_data_tlast:输入2048个数据后拉高,停止数据输入;

做fft需要耗费的时钟周期计算如下s_axis_data_tlast- s_axis_data_tvalid

,在ip核中可看到:

 

m_axis_data_tdata:高位为实部,低位为虚部,由于本程序在always内将值给fft_real端口,所以会延迟一个时钟周期,实际为41,fft_real为42;

m_axis_data_tvalid:当fft结果输出时拉高,输出2048个点的数据后拉低;

m_axis_data_tuser:输出fft的地址值,输出值*fs/N为对应频点;

m_axis_data_tready:完成2048个点的fft后拉高一个时钟周期表示完成fft;

event_frame_started:输入信号数据时拉高一个时钟周期;