对于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:输入信号数据时拉高一个时钟周期;