前言

在进行FFT IP核的配置学习中遇到较多难题,借助本文的整理可以对其有个大概的了解

vivado 的 IFFT/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 变化的长度。

    p1.png

第二页

第二配置页主要是数据宽度,格式,控制信号,输出方式,和可选的控制信号。需要注意的是输据的输入是自然方式(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.


1777685-20190926161942276-479882726.png

关于端口的说明

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