XILINX FFT IP核详细配置
1. 配置选项
1.1基本结构配置
第一页是基本结构配置,包括通道数和深度,全局时钟工作频率,数据吞吐量以及FFT架构的选择。
注:1.只有单通道可以选择流水线结构,多通道只能选择Radix-4,或者Radix-2架构。2.只有选择自动模式才可以选择数据吞吐量,在其他结构下数据吞吐量是与时钟频率相等的固定值。
Run Time Configurable Transform Length(过程可配置转换长度),勾选此选项,在运行过程中的每一帧前可以通过输入参数来改变长度等配置,需要在输入端口s_axis_config_tdata中修改,在配置完成后点击左侧Implementation Details选项卡即可看到,我们先来往下看。
不同的结构的响应速度以及对应的资源占用:
(XILINX官方文档的这张图片太过模糊,为了让大伙看的更清楚,所以截取了网络图源,转载侵删)
1.2实现功能配置
第二页是实现功能配置,主要针对输入输出数据格式以及控制和监测端口的选择。
-
Data Format 数据格式:可以选择Fixed Point(定点数),或者Floating Point(单精度浮点数)。注意,选则Floating Point,下面的Input Data Width位宽固定为32,对齐浮点数位宽,并且只接受IEEE-754单精度浮点格式。相位因子可选24或25。
-
Scaling Options 缩放选项:可以选择Block Floating Point(块浮点),该选项支持自动缩放,在保证输出不溢出的情况下充分利用位宽;或者Scaled(缩放),若选择该选项,则需要手动配置缩放因子,缩放因子的配置输入为s_axis_config_tdata端口,缩放级数根据不同的FFT点数会有所不同;以及Unscaled(不缩放):字面意思,不缩放,在数据量较大的情况下不建议选择该选项。
缩放因子配置:首先看左侧Implementation Details选项卡,根据规定的位宽来设置,位宽一定为偶数,因为每两位为一级缩放。每级可选0,1,2,3挡位的缩放,对应二进制为00,01,10,11,其实就是右移几位的意思。
读者可根据实际需求自行选定缩放因子的大小,在实际应用场景中,缩放因子可以先尝试给定一个值,根据结果观察幅值大小是否合适或者是否溢出,在重新配置输入。
更详细的介绍请参考官方文档。 -
Rounding Modes 舍入模式:提供Truncation(截断)以及Convergent Rounding(舍入)两种选项,前者直接将小数部分舍弃,后者会选择四舍五入。在输出结果较大的情况下,两者区别不大。
Precision Options 精度选项:可设置输入数据位宽和相位因子位宽,输入非8的倍数会自动扩展为8的倍数,并且在Fixed Point模式下,输入数据位宽与相位因子位宽相等。由s_axis_data_tdata接口输入,假设两者位宽都为16位,则MSB[31:16]为相位因子,LSB[15:0]为输入数据。
相位因子即虚部。大多数情况下我们处理的数据都为实数,所以在高位补0即可。如果做IFFT或其他需要虚部的情况,则可将实部和虚部分别输入。
Control Signals 控制信号:可以选择是否需要时钟使能管脚以及复位管脚,前者时钟使能active high(高电平有效),后者复位active low(低电平有效)。
若使能复位管脚,最少保持两个时钟周期有效。
Output Ordering Options 结果输出顺序:可以选择Reversed Order(大端序)或者Natural Order(顺序)输出,默认为大端序输出。若选择Natural Order,会使得内部重新排序,消耗更多的资源以及转换时间,但一般情况下为了方便观看,都选择Natural Order。
Cyclic Prefix Insertion 插入循环前缀:取输出数据末尾的一段长度,插入完整输出的开头。并且不会破坏原本的数据(不是剪切而是复制粘贴),使用该功能可以实现将负频率搬移到正频率的前面。类似于matlab中fftshift功能。
笔者个人理解,如果是为了寻找频率,则没有必要勾选;而若是为了观察正负频率完整波形,则可以勾选。另外看到有人说常用于OFDM中,但由于我不了解这些,所以在此不做过多介绍。附上数据手册中的介绍:
Cyclic prefix insertion takes a section of the output of the FFT and prefixes it to the beginning of the transform. The resultant output data consists of the cyclic prefix (a copy of the end of the output data) followed by the complete output data, all in natural order. Cyclic prefix insertion is only available when output ordering is Natural Order.
When cyclic prefix insertion is used, the length of the cyclic prefix can be set frame-by-frame without interrupting frame processing. The cyclic prefix length can be any number of samples from zero to one less than the point size. The cyclic prefix length is set by the CP_LEN field in the Configuration channel. For example, when N = 1024, the cyclic prefix length can be from 0 to 1023 samples, and a CP_LEN value of 0010010110 produces a cyclic prefix consisting of the last 150 samples of the output data.
The initial value and reset value of CP_LEN is 0 (no cyclic prefix). The core uses the log 2 (point size) MSBs of CP_LEN for the cyclic prefix length. So, when the point size decreases, the leftover LSBs are ignored. This effectively scales the cyclic prefix length with the point size, keeping them in approximately constant proportion. However, all bits of CP_LEN are programmed into the core and are used in later transforms if the point size increases.
Optional Output Fields 可选择的输出字段:
- XK_INDEX:块RAM以及输出结果的索引。
- OVFLO:溢出信号。
关于这两者,勾选之后在M_AXIS_DATA_TUSER端口进行输出,查看左侧Implementation Details选项卡,即可获得详细信息。
Throttle Scheme 节流方案:可选择Non Real Time(非实时)或者Real Time(实时)。
在Non Real Time模式下,主机和从机均可通过主动修改握手信号为低电平而进入等待状态,并且在该状态下保持data信号稳定,即可恢复正常传输。而在Real Time模式下,会以牺牲数据传输的灵活性,而获得更高的处理速度。
The situation is different in Realtime mode, which is used to create a smaller and faster design at the expense of flexibility in loading and unloading data. When the core is configured to use Realtime mode, the following occurs:
The TREADY signal on the Data Output channel ( m_axis_data_tready ) is removed
The TREADY signal on the Status channel ( m_axis_status_tready ) is removed
The TVALID signal on the Data Input channel is ignored when the loading of a frame has begun
在Real Time模式下,FFT core作为主机结果输出的握手信号均被删除,而作为从机时valid信号为输入,无法删除,但也被core选择忽略。也就是说用户基本无法插入等待状态,从而控制暂停。
上图的B点,用户拉低valid信号,试图插入两个周期的等待状态,但是core自动将之前的数据(D3)替换丢失的数据(D4),导致在C点用户传输最后一个数据时,core已经开始进行转换。手册中的提醒如下:
IMPORTANT: It is important that Realtime mode is only selected when the appropriate external masters and slaves can meet the timing requirements on supplying and consuming data.
更详细的介绍请看XILINX官方文档,FFT IP核中Controlling the FFT Core部分的介绍:
https://docs.xilinx.com/r/en-US/pg109-xfft/Controlling-the-FFT-Core
1.3详细实现
第三页包括存储方式,以及优化选项。
Block RAM 是FPGA内部专用的存储资源,而Distributed RAM是分布式RAM,是用CLB的逻辑资源复用为存储资源,会占用逻辑资源。
Menory Options 内存选项:
- 对于突发I/O架构:数据长度不超过1024点则可以使用Distributed RAM或者Block RAM,若超过1024只能用Block RAM。
- 对于流水线架构:默认选择Block RAM。stages层级一般选择默认。
数据和相位因子的Block RAM 层级没有特殊需求不需要修改。官方文档中提示:The default displayed on the IDE offers a good balance between both.
Reorder Buffer 重排序缓冲区:只有选择顺序输出时才可配置,用于重新排序缓存。同上,若想选择Distributed RAM,数据长度需小于1024点(流水线架构,并且选择Block Floating Point 下长度为2048点)。
When block floating-point is selected for the Pipelined Streaming I/O architecture, a RAM buffer is required for natural order and bit reversed order output data. In this case, the reorder buffer options remain available and distributed RAM can be selected for all point sizes below 2048.
Optimize Block RAM Count Using Hybrid Memories 混合存储器优化选项:当数据长度大于一个Block RAM,多余的部分会存入Distributed RAM中。
Optimize Options 优化选项:
-
Complex Multipliers 复杂乘法器:
- Use CLB Logic :全部使用逻辑资源来构造,适用于低性能要求的场景;
- Use 3-multiplier structure :基本乘法器使用DSP48资源,部分采用逻辑资源。在提高性能的同时兼顾片内逻辑资源,避免浪费;
- Use 4-multiplier structure :全部使用DSP48资源,适用于性能要求极高的场景。
-
Butterfly Arithmetic 蝶形运算单元:
-
Use CLB Logic :同上,使用逻辑资源构造;
-
Use XtremeDSP slices :强制使用DSP48资源完成运算单元构造。
-
优化选项大部分是对官方文档的翻译,并无多少个人使用经验在内,若需要更详细的介绍请查阅官方文档。
对于优化选项,选择完成之后,在配置界面左侧,Implementation Details选项卡下,在Resource Estimates Group这一栏有对资源使用的总结,包括DSP48 Slices资源以及Block RAMs使用的资源。
可能是笔者对于FFT IP核配置经验较少,对于不同的优化选项,实际完成时间并不会有太大差别,基本都在us量级。真正影响FFT计算速度的是前面的基本架构选择。在对资源紧张的使用场景下,才需考虑这些优化选项。对于普通的应用场景,若不想纠结于这些细微差别,保持默认即可。
2. 端口介绍
这一部分等测试完毕之后,有空的话会详细记录下来。