Xilinx FFT使用说明和测试
- 1 IP接口信号
- 2 IP基本配置
- 3 IP功能测试
本文主要介绍Xilinx FFT IP的使用方法
1 IP接口信号
FFT用于计算N点的DFT或者IDFT,N为2m,其中m=2~16。IP的输入输出接口如下表所示,主要包括时钟、复位信号,输入的配置信号,输入的原始数据,输出的变换结果,输出的变换状态,以及事件信号。确保所有的信号输入IP时都有确定的值,不然仿真的时候会出现“Failure: ERROR:add_1 must be in range [-1,DEPTH-1]”
接口 | 说明 |
---|---|
aclk | 时钟 |
aclken | 时钟使能 |
aresetn | 复位 |
s_axis_config_tready | 配置信号的tready信号 |
s_axis_config_tvalid | 配置信号的tvalid信号 |
s_axis_config_tdata | 配置信号的tdata信号 |
s_axis_data_tready | 输入信号的tready信号 |
s_axis_data_tvalid | 输入信号的tvalid信号 |
s_axis_data_tdata | 输入信号的tdata信号 |
s_axis_data_tlast | 输入信号的tlast信号 |
m_axis_data_tready | 输出信号的tready信号 |
m_axis_data_tvalid | 输出信号的tvalid信号 |
m_axis_data_tdata | 输出信号的tdata信号 |
m_axis_data_tuser | 输出信号的tuser信号 |
m_axis_data_tlast | 输出信号的tlast信号 |
m_axis_status_tready | 变换状态的tready信号 |
m_axis_status_tvalid | 变换状态的tvalid信号 |
m_axis_status_tdata | 变换状态的tdata信号 |
event_frame_start | 表征开始计算新的数据帧 |
event_tlast_unexpected | 表征没有在期望的地方收到tlast信号,如实际输入数据帧的点数不是期望的数量 |
event_tlast_missing | 在预期最后一拍没有收到tlast信号 |
event_fft_overflow | 数据输出通道存在数据溢出 |
event_data_in_channel_halt | 收到的输入数据的数量与预期的不符 |
event_data_out_channel_halt | IP核有数据输出,但接收端没有准备好而无法输出 |
event_status_channel_halt | IP核有状态信号输出,但接收端没有准备好而无法输出 |
- 配置通道
配置通道的数据格式如下图所示,由NFFT、CP_LEN、FWD_INV、SCALE_SCH字段,以及为了凑够8bit补足的PAD字段构成,各字段的含义如下表所示。如果需要修改配置,需要对IP进行复位操作,这样s_axis_config_tready信号才会拉高。SCALE_SCH字段的配置也很重要,如果设置的不正确,IP计算的结果与Python计算的结果对不上。
名称 | 宽度 | 说明 |
---|---|---|
NFFT | 5bit | FFT变换的点数 |
CP_LEN | log2(最大点数) | 在整个转换输出之前,从转换末尾开始作为循环前缀输出的样本数 CP_LEN可以是从0到比点大小小1的任意数 |
FWD_INV | 每个FFT数据通道1bit | 变换类型,1表示FFT,0表示IFFT |
SCALE_SCH | Pipelined:2×ceil(NFFT/2) Radix-4:2×ceil(NFFT/2) Radix-2:2×NFFT | 缩放因子,每级的缩放因子由2bit构成 |
- 输入通道
输入数据通道的数据格式如下图所示,tdata信号可以包含多个数据通道,每个数据通道又由数据的实部和虚部组成,同样需要进行8bit边界补足。
- 输出通道
输出数据通道的数据格式如下图所示,tdata信号可以包含多个数据通道,每个数据通道又由数据的实部和虚部组成,同样需要进行8bit边界补足。
- 输出用户通道
输出用户通道的数据格式如下图所示,由XK_INDEX、BLK_EXP、OVFLO字段,以及为了凑够8bit补足的PAD字段构成,各字段的含义如下表所示。
名称 | 宽度 | 说明 |
---|---|---|
XK_INDEX | log2(最大点数) | 输出数据的索引(unsigned 2’s complement) |
BLK_EXP | 8 | 每个通道一个,Block exponent (unsigned 2’s complement) 只有在block floating-point被使用时才有效 |
OVFLO | 1 | 每个通道一个,表征算法是否溢出 |
- 输出状态通道
输出状态通道的数据格式如下图所示,由BLK_EXP、OVFLO字段,以及为了凑够8bit补足的PAD字段构成,各字段的含义如下表所示。
名称 | 宽度 | 说明 |
---|---|---|
BLK_EXP | 5 | 每个通道一个,每个通道的scale量 |
OVFLO | 1 | 每个通道一个,表征算法是否溢出 |
2 IP基本配置
添加XFFT IP,使用GUI对IP的各项参数进行配置,在Implementation Details可以查看配置后各个信号的参数格式。
- Configuration
- Number of Channel:输入输出通道的数量
- Transform Length:FFT点数
- Target Clock Frequency:工作频率,决定FFT计算延时
- Architecture Choice:架构选择
- Run Time Configurable Transform Length:勾选之后FFT点数由配置通道决定,即配置通道的数据包含NFFT字段
- Implementation
- Data Format:数据格式
- Fixed Point:固定点
- Floating Point:浮点
- Scaling Options:缩放选项
- Block Floating Point:块浮点
- Scaled:定点缩放
- Unscaled:全精度,无缩放
- Rounding Modes:截断方式
- Convergent Rounding: 将计算结果向着最近的整数舍入
- Truncation:直接截断
- Input Data Width:输入数据宽度,指的是单个实部或虚部的宽度
- Phase Factor Width:相位因子宽度
- Control Signals:控制时钟使能和复位信号
- Output Order:输出顺序
- Bit/Digit Reversed Order:按bit倒序
- Natural Order:自然顺序
- Cyclic Prefix Insertion:是否在输出数据中自动插入循环前缀
- Optional Output Fields:输出用户通道和输出状态通道的数据是否包含XK_INDEX、OVFLO字段
- Throttle Scheme:在性能和数据定时需求之间进行权衡。Real Time模式通常提供更小、更快的设计,但提供和使用数据有严格的限制。Non Real Time没有这样的限制,但设计可能更大更慢。
- Data Format:数据格式
- Detailed Implementation
- Memory Option:寄存器类型选择
- Optimize Options:资源和性能优化选项
3 IP功能测试
- FFT变换
本例子计算信号f(t)=63sin(2π×50t)+63sin(2π×80t),该信号有两个频率点50和80Hz,幅度的变化范围为[-126,126]。首先需要对该信号进行采样,得到离散的序列,1s内采集256个采样点,得到离散化的数据点存入.coe文件中,作为BRAM的初始化文件,在测试时从BRAM中读出数据送入XFFT IP中进行计算。该测试工程可从GitHub下载。-
使用Python程序对f(t)信号进行计算的结果如下图所示,计算结果符合预期。
-
使用Vivado进行仿真得到的结果如下图所示,计算的结果与Python的结果一致。
-
- FFT与IFFT变换
本例子计算信号f(t)=1022sin(2π×5t),该信号有一个频率点5Hz,幅度的变化范围为[-1022,1022]。首先需要对该信号进行采样,得到离散的序列,1s内采集256个采样点,得到离散化的数据点存入.coe文件中,作为BRAM的初始化文件,在测试时从BRAM中读出数据送入XFFT IP中进行计算。该测试工程可从GitHub下载。- 使用Python程序对f(t)信号进行计算的结果如下图所示,计算结果符合预期。
- 原始信号的变化曲线
- 傅里叶变换
- 逆傅里叶变换
- 原始信号的变化曲线
- 使用Vivado进行仿真得到的结果如下图所示,计算的结果与Python的结果一致。
- 整体波形
- 傅里叶变换
- 逆傅里叶变换
- 整体波形
- 使用Python程序对f(t)信号进行计算的结果如下图所示,计算结果符合预期。