主要内容

FPGA实现FFT算法

这个例子展示了如何通过使用DSP HDL Toolbox™块实现一个硬件目标FFT。

DSP System Toolbox™中的信号处理功能和模块提供了基于框架的浮点算法,可以作为硬件设计的行为参考。然而,有效的硬件设计必须使用流数据接口和定点数据类型。硬件设计也经常需要控制信号,例如有效的重置,反压力

DSP HDL Toolbox库中的模块提供了硬件优化算法,可以在Simulink®中建模流数据接口、硬件延迟和控制信号。该模块可以并行处理多个样本,以实现高吞吐量,如千兆样本每秒(GSPS)速率。您可以更改块参数以探索不同的硬件实现。这些模块支持使用HDL Coder™生成HDL代码并部署到fpga。

本例介绍了DSP HDL Toolbox块使用的硬件友好的流数据接口和控制信号,并展示了如何使用FFT块提供的两种硬件架构。然后,它展示了如何为您的设计生成HDL代码。

DSP HDL Toolbox FFT块为不同的用例提供了两种优化的体系结构。您可以设置体系结构参数设置为这些选项之一。

  • 流基数2 ^ 2—对于高吞吐量应用程序使用此选项。当使用矢量输入时,该体系结构实现每秒千兆样本(GSPS)。

  • 破裂基数2-在低区域应用中使用此选项。该体系结构只使用了一只复杂的蝴蝶。

这个例子包括两个模型,展示了如何使用FFT块的流和爆发架构。流模型展示了如何使用输入和输出有效的控制信号以独立于时钟速率建模数据速率。爆发模型展示了如何使用有效的控制信号建模突发数据流和如何使用准备好了指示算法何时能或不能接受新数据样本的信号。

流Radix 2^2架构

现代adc能够以每秒几千兆采样的采样速率对信号进行采样。但是,最快的FPGA的时钟速度达不到这个抽样速率。fpga通常以数百兆赫的频率运行。在FPGA上执行GSPS处理的一种方法是以更低的时钟速率同时处理多个样本。许多现代fpga支持JESD204B标准接口,该接口以GHz时钟速率接受标量输入,并以较低的时钟速率生成样本向量。因此,现代信号处理需要矢量处理。

流基数2 ^ 2体系结构设计为支持高吞吐量应用程序。这个示例模型使用了大小为8的输入向量体系结构参数设置为流基数2 ^ 2.有关时序图、支持的特性和FPGA资源使用情况,请参见FFT

modelname =“FFTHDLOptimizedExample_Streaming”;open_system (modelname);

InitFcn回调函数(模型属性> Callbacks > InitFcn)为模型设置参数。在本例中,参数控制FFT的大小和输入数据特征。

FFTLength = 512;

输入数据是两个正弦波,200khz和250khz,每个以1*2e6 Hz采样。输入向量大小为8个样本。

FrameSize = 8;Fs = 1 * 2 e6;

的用法有效的非连续输入数据的控制信号,此示例每隔一个周期应用有效输入。

ValidPattern = (1,0);

打开Spectrum Viewer并运行示例模型。

open_system (' ffthdlooptimizedexample_streaming /频谱查看器/功率频谱查看器');set_param (modelname“SimulationCommand”“开始”

使用逻辑分析仪来查看输入和输出信号FFT流子系统。该波形表明,每隔一个周期,输入有效信号就会很高,并且在块返回第一个有效输出样本之前会有一些延迟。块掩码显示从第一个有效输入到第一个有效输出的延迟,假设输入有效样本中没有空白。在这种情况下,由于输入流中的间隙,实际延迟时间比显示的延迟时间长。块返回有效样本中没有空白的输出数据。

Burst Radix 2(最小资源)体系结构

使用破裂基数2适用于FPGA资源有限的应用程序的架构,特别是当FFT长度很大时。该体系结构只使用一个复杂的蝴蝶来计算FFT。在这个模型中,体系结构参数设置为破裂基数2

当你选择这种体系结构时,块有一个输出控制信号,准备好了,它指示块何时可以接受新的输入数据。块设置准备好了信号到1 (真正的),当整个FFT帧被保存到内存中时,它就可以接受数据并开始处理。在处理时,块不能接受数据,因此块设置准备好了信号到0 ().仅当准备好了信号是1。方法时,该块忽略应用的任何数据准备好了信号是0。

有关时序图、支持的特性和FPGA资源使用情况,请参见FFT

modelname =“FFTHDLOptimizedExample_Burst”;open_system (modelname);

InitFcn回调函数(模型属性> Callbacks > InitFcn)为模型设置参数。在本例中,参数控制FFT的大小和输入数据特征。

FFTLength = 512;

输入数据是两个正弦波,200khz和250khz,每个以1*2e6 Hz采样。数据在每个周期都有效。

Fs = 1 * 2 e6;ValidPattern = 1;

打开Spectrum Viewer并运行示例模型。

open_system (' ffthdlooptimizedexample_burst /频谱查看器/功率频谱查看器');set_param (modelname“SimulationCommand”“开始”

使用逻辑分析仪来查看输入和输出信号FFT破裂子系统。该波形显示输入数据以有效样本的爆发形式到达,并且在块返回有效输出样本之前存在一些延迟。波形中的延迟与块掩码上显示的延迟相匹配。该块还返回一个输出准备好了指示何时有空间开始接受下一波输入数据的信号。以确保下一个输入数据突发在块设置准备好了信号到1 (true)时,模型使用就绪信号作为输入数据生成的使能信号。

生成HDL代码和测试台架

您必须有HDL Coder产品来为这个示例生成HDL代码。您的模型必须有一个针对HDL代码生成的子系统。

选择一个模型来生成FFT子系统的HDL代码和测试台架。

systemname =“FFTHDLOptimizedExample_Burst / FFT破裂”

systemname =“FFTHDLOptimizedExample_Streaming / FFT流”

然后,使用此命令为该子系统生成HDL代码。生成的代码可以用于任何FPGA或ASIC目标。

makehdl (systemname);

使用此命令生成一个测试台架,将HDL模拟的结果与Simulink模拟行为进行比较。

makehdltb (systemname);

另请参阅

|

相关的例子

更多关于

Baidu
map