前言
在进行FFT IP核的配置学习中遇到较多难题,借助本文的整理可以对其有个大概的了解
对于 viavado 中 IFFT IP 的使用刚开始的时候,没有找到 IFFT 的 IP,最后经过查找资料发现,在 VIVADO 中 FFT IP 和 IFFT IP 是用的统一个 IP,具体是 IFFT 还是 FFT 通过设 s_axis_config_tdata=1/0 设置 fft 或 ifft 模式,而且在同一个工程当中,尽量选择同一个 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 : 基4I/O 突发结构
- radix-2, burst i/o : 基2I/O 突发结构
- radix-2 life, burst i/o : 基2I/O 突发结构
其中流水线的结构变换处理时间最短,资源消耗最大。
run time configurable transdorm legth : 该选项可以在 FFT 变换中通过设置 s_axis_config_tdata 中 NFFT 字段的长度来改变 FFT 变化的长度。

第二页
第二配置页主要是数据宽度,格式,控制信号,输出方式,和可选的控制信号。需要注意的是输据的输入是自然方式(Natural Order),输出可以是自然方式也可以是倒序方式(Reversed Order)
如果选用倒序方式输出,在后面处理中就要注意这一特性。 其中在 data format;下拉标签中,对应着 FFT IP 核支持两种数据类型:
- 定点全精度
- 定点缩减位宽
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:输入信号数据时拉高一个时钟周期;