FPGA实现FFT算法
这个例子展示了如何使用DSP HDL工具箱™块实现一个硬件为目标的FFT。
来自DSP System Toolbox™的信号处理功能和模块提供了基于帧的浮点算法,并可作为硬件设计的行为参考。然而,高效的硬件设计必须使用流数据接口和定点数据类型。硬件设计也经常需要控制信号,例如有效的,重置,反压力.
DSP HDL工具箱库中的模块提供了硬件优化算法,在Simulink®中建模流数据接口、硬件延迟和控制信号。金宝app该区块可以并行处理多个样本,以实现高通量,例如每秒千兆样本(GSPS)速率。您可以更改块参数以探索不同的硬件实现。这些模块支持HDL代码生成金宝app,并使用HDL Coder™部署到fpga。
本例介绍了DSP HDL工具箱块使用的硬件友好的流数据接口和控制信号,并展示了如何使用FFT块提供的两种硬件架构。然后,它展示了如何为您的设计生成HDL代码。
DSP HDL工具箱FFT块提供了针对不同用例优化的两种架构。您可以设置体系结构参数设置为这些选项之一。
流基数2^2
—用于高吞吐量应用程序。当您使用矢量输入时,该架构可实现每秒千兆样本(GSPS)。爆裂基数2
-低区域应用使用此选项。该体系结构只使用了一个复杂的蝴蝶。
这个例子包括两个模型,展示了如何使用FFT块的流和突发架构。流模型显示了如何使用输入和输出有效的控制信号以独立于时钟速率建模数据速率。突发模型展示了如何使用有效的控制信号建模突发数据流和如何使用准备好了指示算法何时可以和不能接受新的数据样本的信号。
流式Radix 2^2架构
现代adc能够以每秒几千兆样本的采样率对信号进行采样。然而,最快的FPGA的时钟速度达不到这个采样率。fpga通常以数百MHz的频率运行。在FPGA上执行GSPS处理的一种方法是以低得多的时钟速率同时处理多个样本。许多现代fpga支持JESD204B金宝app标准接口,该接口以GHz时钟速率接受标量输入,并以较低的时钟速率生成样本向量。因此,现代信号处理需要矢量处理。
的流基数2^2
体系结构设计用于支持高吞吐量应用程序。金宝app这个示例模型使用输入向量的大小为8和体系结构FFT块参数设置为流基数2^2
.时序图、支持特性和FPGA资源使用情况,请参金宝app见FFT.
modelname =“FFTHDLOptimizedExample_Streaming”;open_system (modelname);
InitFcn回调函数(Model Properties > Callbacks > InitFcn)为模型设置参数。在这个例子中,参数控制FFT的大小和输入数据特征。
FFTLength = 512;
输入数据是两个正弦波,200khz和250khz,每个采样频率为1*2e6 Hz。输入向量大小为8个样本。
FrameSize = 8;Fs = 1*2e6;
来演示如何使用有效的对于非连续输入数据的控制信号,本例每隔一个周期应用有效输入。
ValidPattern = [1,0];
打开Spectrum Viewer并运行示例模型。
open_system (FFTHDLOptimizedExample_Streaming/频谱查看器/功率频谱查看器);set_param (modelname“SimulationCommand”,“开始”)
使用逻辑分析仪查看输入和输出信号的FFT流
子系统。该波形显示输入有效信号每隔一秒周期就高,并且在块返回第一个有效输出样本之前有一些延迟。块掩码显示从第一个有效输入到第一个有效输出的延迟时间,假设输入有效样本中没有间隙。在这种情况下,由于输入流中的间隙,实际延迟时间比显示的延迟时间长。该块返回有效样本中没有空白的输出数据。
Burst Radix 2(最小资源)架构
使用爆裂基数2
适用于FPGA资源有限的应用程序,特别是当FFT长度很大时。该体系结构只使用一个复杂的蝴蝶来计算FFT。在这个模型中,体系结构FFT块参数设置为爆裂基数2
.
当你选择这种结构时,块有一个输出控制信号,准备好了,表示块何时可以接受新的输入数据。该块设置准备好了信号给1 (真正的
),当整个FFT帧被保存到内存时,它就可以接受数据并开始处理。在处理时,块不能接受数据,因此块设置准备好了信号到0 (假
).时,才必须应用数据准备好了信号是1。方法时,块忽略应用的任何数据准备好了信号是0。
时序图、支持特性和FPGA资源使用情况,请参金宝app见FFT.
modelname =“FFTHDLOptimizedExample_Burst”;open_system (modelname);
InitFcn回调函数(Model Properties > Callbacks > InitFcn)为模型设置参数。在这个例子中,参数控制FFT的大小和输入数据特征。
FFTLength = 512;
输入数据是两个正弦波,200khz和250khz,每个采样频率为1*2e6 Hz。数据每个周期都有效。
Fs = 1*2e6;ValidPattern = 1;
打开Spectrum Viewer并运行示例模型。
open_system ('FFTHDLOptimizedExample_Burst/频谱查看器/功率频谱查看器');set_param (modelname“SimulationCommand”,“开始”)
使用逻辑分析仪查看输入和输出信号的FFT破裂
子系统。波形显示输入数据以有效样本的爆发形式到达,并且在块返回有效输出样本之前存在一些延迟。波形中的延迟时间与块掩码上显示的延迟时间相匹配。该块还返回一个输出准备好了信号,该信号指示何时有空间开始接受下一个输入数据突发。以确保在块设置之前不应用下一个输入数据突发准备好了信号到1 (true)时,模型使用就绪信号作为输入数据生成的使能信号。
生成HDL代码和测试台
您必须拥有HDL Coder产品才能为这个示例生成HDL代码。您的模型必须有一个针对HDL代码生成的子系统。
选择一个模型来生成HDL代码和FFT子系统的测试平台。
systemname =“FFTHDLOptimizedExample_Burst / FFT破裂”;
或
systemname =“FFTHDLOptimizedExample_Streaming / FFT流”;
然后,使用该命令为该子系统生成HDL代码。生成的代码可以用于任何FPGA或ASIC目标。
makehdl (systemname);
使用此命令生成一个测试平台,将HDL模拟的结果与Simulink模拟行为进行比较。金宝app
makehdltb (systemname);