Xilinx FFT IP核使用介绍
- 前言
- 一、Vivado的FFT使用详解
-
- 1、IP介绍核配置界面
- 2、IP核主端口说明
- 3、IP核时序说明
- 二、FFT核使用例程
-
- 1.工程建立
- 2.编程架构
- 3.modelsim仿真
- 总结
前言
以前主要介绍ise当中的FFT IP本文将介绍核的使用方法Vivado中的FFT IP核使用方法。并设计一段仿真代码,进行波形仿真,查看输出结果。
提示:以下是本文的主要内容
一、Vivado的FFT使用详解
Xilinx LogiCORE IP傅里叶快速变换(FFT)核心实现了Cooley-Tukey FFT算法是计算离散傅里叶变换(DFT)高效计算方法IP核使用AXI通过4总线协议输出数据ready和valid信号在上下游模块之间握手。 输入数据按自然顺序显示,输出数据可按自然顺序显示,也可按位/数字倒序输出。FFT验收复杂的数据样本,但实际数据可以通过将所有虚拟数字输入设置位零来转换。由于字长效应有限,在转换过程中引入噪声,导致输出数据不完全对称,建议实施实际值FFT使用输出数据的后半部分(N/2 1,N)。
1、IP介绍核配置界面
-
:配置选项卡
- :实例核心组件的名称。名称必须从字母开始,从a ~ z、a ~ z、0 ~ 9、_组成。
- :选择1 ~ 12通道数。多通道操作可用于三种突发事件I/O架构。
- :选择所需点的大小。从8到655362的所有权力都是可用的。
- :如系统结构选项所述,选择实现选项。流水线流I/O、Radix-2 Burst I/O和Radix-2 Lite Burst I/O架构支撑点大小为8至65536。Radix-4 Burst I/O架构支撑点为64至65536。在满足指定目标数据吞吐量的最小实现的前提下,自动选择FPGA上实现FFT实现指定目标时钟的核心频率。目标时钟频率和目标数据吞吐量仅用于实现和计算延迟。核心不保证目标时钟频率或目标数据吞吐量在指定目标中运行。
- :在运行过程中选择可配置的转换长度。在运行过程中无法配置转换长度时,核心使用的逻辑资源较少,最大时钟速度较快。
-
:实现选项卡
- :输入输出的数据样本是定点格式还是IEEE-754单精度(32位)浮点格式。当核心处于多通道配置时,浮点格式不可用。
- :输入数据和相位因数可独立配置为8至34位的宽度,包括。当数据格式为浮点时,输入数据宽度固定为32位,相位因数宽度可根据所需的噪声性能和可用资源设置为24位或25位。
- :适用于所有架构的三种选项:未缩放-所有整数增长都携带到输出。这可以使用更多FPGA资源。缩放-用户定义的缩放计划决定了数据是如何工作的FFT阶段间缩放。块浮点-核心决定充分利用可用动态范围需要多大程度的缩放,并将缩放因子报告为块指数。
- :时钟使能(aclken)和同步清除(aresetn)是可选引脚。如果同时检查同步清除,则覆盖时钟启用。如果不选择选项,可以节省一些逻辑资源,获得更高的时钟频率。
- :XK_INDEX是数据输出通道中的可选字段。OVFLO是数据输出通道和状态通道中的可选字段。
- :权衡性能和定期数据需求。实时模式通常提供更小、更快的设计,但在必须提供和使用数据时有严格的限制。非实时模式没有这样的限制,但设计可能更大、更慢。有关更多细节,请参见控制FFT核心。
- :当蝴蝶输出时,需要修剪数据路径lbs。这些人可以使用收敛舍入截断或舍入,这是一种无偏置舍入方案。当一个数的小数部分等于1时 / 2.如果数是奇数,四舍五入收敛;如果数是偶数,四舍五入收敛。收敛可以用来避免直流偏置,否则会引入截断后的蝴蝶阶段。由于额外的延迟,选择此选项会增加切片的用量,导致转换时间略有增加。
- :输出数据选择位/数字反转顺序或自然顺序。基于Radix-2架构(流水线流I/O, Radix-2突发I/O和Radix-2 Lite突发I/O)基于位置反转排序,提供位置反转排序Radix-4的架构(Radix-4突发I/O)提供位置反转排序。流水线流I/O选择自然顺序输出顺序会增加核心内存。对于突发I/O由于需要单独的卸载阶段,选择自然阶输出会增加整体转换时间。如果输出顺序是自然顺序,可以选择插入循环前缀。循环前缀插入可用于所有系统结构,通常用于OFDM无线通信系统。
-
:详细实现选项卡
- :数据和相位因数(突发I/O架构):突发事件I/O架构,块RAM或分布式RAM可用于存储数据和相位因数。分布式存储可以存储数据和相位因子RAM所有存储点的大小,包括1024点。
- (流水线流I/O):在流水线流I/O解决方案中,数据可以部分存储在块RAM部分存储在分布式中RAM中。在每个管道阶段,使用较小的数据和相位因子存储器从输入端计数。您可以选择使用块RAM管道阶段存储数据和相位因子的数量。分布式在后期使用RAM。IDE两者之间的默认值提供了良好的平衡。如果输出顺序是自然顺序,用于重排序缓冲区的内存可以是块RAM或分布式RAM。分布式缓冲区可用于点大小小于或等于1024的点。RAM。当流水线流I/O当架构选择块浮点时,需要自然顺序和位倒序输出数据RAM缓冲区。在这种情况下,重排序缓冲区的选项仍然可用,所有小于2048的点都可以选择分布式RAM。
- :数据、相位因子或重新排序缓冲区记忆存储在块内存中。如果内存大于一个内存,内存可以由一个混合块公羊和分布式内存存存储,大部分数据存储在块公羊和几个剩余存储在分布式内存中RAM。这种混合内存完全由多个块组成ram构建内存替代方案。它减少了块RAM计数,但代价是增加使用的片数。只有当块RAM用于一个或多个内存,混合内存所需的片数低于每个内存256个lut混合内存可用于内部阈值。如果满足这些条件,可以选择混合存储器。
- :Complex multiplier:定制复杂的选项有三种multiplier实现:-使用CLB逻辑:一切复杂multiplier都采用切片逻辑结构。适用于性能要求较低的目标应用程序或目标设备DSP片较少。-使用3-乘法器结构(资源优化):所有复杂的乘法器使用3个实乘和5个加减结构,其中使用乘法器DSP Slices。这减少了DSP Slice计数,但是用了一些Slice逻辑。这种结构是可用的DSP片预加器减少或消除对额外片逻辑的需求,提高性能。-4乘法器结构(性能优化):所有复杂乘法器均采用4实乘、2加/减结构DSP片。该结构产生了最高的时钟性能,但牺牲了更特殊的乘数。在带有DSP在片的设备中,加/减操作是在DSP片中实现的。注:核心可以在内部覆盖复杂的乘法器,以确保最少使用DSP而不影响性能。因此,一些核心配置在三倍增器和四倍增器选项之间切换,DSP Slice的使用可能没有区别。但是,如果选择使用CLB切片逻辑始终用于逻辑。
- :定制蝴蝶实现有两种选择:-使用CLB逻辑:切片逻辑结构用于所有蝴蝶阶段。XtremeDSP Slices:对于带有DSP Slices该选项强迫所有蝶形阶段使用设备DSP Slices实现加法器/减法器。
2、IP核主端口说明
名称/th> | 方向 | 说明 |
---|---|---|
aclk | in | 时钟信号,上升沿采样,输入范围1MHz~100MHz |
aclken | in | 时钟使能,高电平有效 |
aresetn | in | 同步清零,低有效 |
s_axis_config_tdata | in | 配置通道数据输入,承载配置信息:CP_LEN, FWD/INV, NFFT和SCALE_SCH。 |
s_axis_config_tvalid | in | 配置通道valid信号 |
s_axis_config_tready | out | 配置通道ready信号 |
s_axis_data_tdata | in | 数据输入通道,承载采样数据:XN_RE、XN_IM |
s_axis_data_tvalid | in | 数据输入通道valid信号 |
s_axis_data_tready | out | 数据输入通道ready信号 |
s_axis_data_tlast | in | 数据输入通道last信号 |
m_axis_data_tdata | out | 数据输出通道,承载IP核转换数据:XK_RE、XK_IM |
m_axis_data_tuser | out | 数据输出通道,承载附加的预采样信息:XK_INDEX,OVFLO,BLK_EXP |
m_axis_data_tvalid | out | 数据输出通道valid信号 |
m_axis_data_tlast | out | 数据输出通道last信号 |
m_axis_data_tready | in | 数据输出通道ready信号 |
event_frame_started | out | IP核开始处理新帧时发出该信号,持续一个时钟周期 |
event_tlast_unexpected | out | 当s_axis_data_tlast插入位置不对时,该信号输出,持续一个时钟周期,如果出现多个last信号,也会对应插入多个 |
event_tlast_missing | out | 当IP核输入的数据数目大于核设置的最大转换点数时,会发出该信号,持续一个时钟周期 |
event_data_in_channel_halt | out | 当信号在FFT数据输入需要接收数据时,而没有数据可用时,会插入此信号,直到有新的数据插入时,该信号才会变为低电平 |
3、IP核时序说明
数据在AXI4-Stream通道中的传输如图所示。TVALID由通道的源端(主端)驱动,而TREADY由接收端(从端)驱动。TVALID表示有效负载字段(TDATA、TUSER和TLAST)的值是有效的。“TREADY”表示从机已经准备好接收数据。当TVALID和TREADY在一个循环中都为真时,就会发生转移。主、从分别为下一次传输设置TVALID和TREADY。 当选择流I/O且不使用循环前缀时,核心可以将帧的加载与之前帧的处理和卸载重叠。如果上游主程序在前一帧的最后一个符号之后立即为新帧提供第一个符号,那么核心程序立即开始加载它。下图显示了通道流架构中背对背帧的一般时序。 注意,在加载帧和该帧的处理数据可用之间有一个延迟。这个延迟取决于Vivado IDE中为参数化核心所选择的选项。然而,当延迟过去后,经过处理的帧将背靠背出现。
二、FFT核使用例程
1.工程建立
:
- Vivado 2020.2
- ModelSim SE-64 2020.4
利用Vivado建立一个工程,由于需要使用得到后期的频谱图,所以这里需要建立一个DDS IP核,来产生一个可供仿真的正弦波形。而且由于要生成频谱,则在FFT运算完成后的实部、虚部数据进行平方和操作,故需要调用一个乘法器和加法器进行运算。参数配置:我的开发板系统频率是200MHz,所以现在选取FFT的采样频率为200MHz,N=4096;为了实现方便,DDS的系统频率也选取200MHz,相位累加器选取32位位宽,输出正弦波形频率定为10MHz,故DDS的频率控制字=214748365。 下面展示一下我的例化FFT核代码片段:
fft_core fft_core_inst (
.aclk(clk), // input wire aclk
.s_axis_config_tdata(s_axis_config_tdata), // input wire [15 : 0] s_axis_config_tdata
.s_axis_config_tvalid(s_axis_config_tvalid), // input wire s_axis_config_tvalid
.s_axis_config_tready(s_axis_config_tready), // output wire s_axis_config_tready
.s_axis_data_tdata(s_axis_data_tdata), // input wire [15 : 0] s_axis_data_tdata
.s_axis_data_tvalid(s_axis_data_tvalid), // input wire s_axis_data_tvalid
.s_axis_data_tready(s_axis_data_tready), // output wire s_axis_data_tready
.s_axis_data_tlast(s_axis_data_tlast), // input wire s_axis_data_tlast
.m_axis_data_tdata(m_axis_data_tdata), // output wire [15 : 0] m_axis_data_tdata
.m_axis_data_tuser(m_axis_data_tuser), // output wire [15 : 0] m_axis_data_tuser
.m_axis_data_tvalid(m_axis_data_tvalid), // output wire m_axis_data_tvalid
.m_axis_data_tlast(m_axis_data_tlast), // output wire m_axis_data_tlast
.event_frame_started(event_frame_started), // output wire event_frame_started
.event_tlast_unexpected(event_tlast_unexpected), // output wire event_tlast_unexpected
.event_tlast_missing(event_tlast_missing), // output wire event_tlast_missing
.event_data_in_channel_halt(event_data_in_channel_halt) // output wire event_data_in_channel_halt
);
2.程序设计架构
3.modelsim仿真
- 首先查看DDS生成的正弦波形是否正常,如下图所示:
- 再将正弦波形输入FFT核,查看输出是否有报错事件信号,如下图:只有event_frame_started信号有脉冲输出,表示开始处理FFT新帧计算,其它事件都为0。
- 输出频谱,如下图所示: 根据查看频谱中最高峰的索引值为3902,经过计算得到最终的信号频率为:(4096-(3902-11))/4096*200=10.009765625≈10MHz。(其中减11是乘法器和加法器的延迟)
总结
本章对Vivado工具中的FFT IP核的应用进行了简单介绍,先介绍了FFT核配置界面的各个选项的功能及配置选项,后又对核的引脚进行了说明,有讲了一个实验例程,对于初学FFT核的同学希望有帮助,如果有不同见解请评论区留言。 注:在此附上实验例程的工程下载连接:https://download.csdn.net/download/qq_41894385/85356944解压密码:mjd。