此示例描述了采用 FFT 英特尔® FPGA 知识产权 (IP) 内核的 32K 点快速傅立叶变换 (FFT)。FFT 是一种离散傅立叶变换 (DFT) 算法,通过分解将所需的计算量从 O(N2) 减少到 O(NlogN)。序列 x(N) 的 DFT 由以下公式给出:
当 k = 0、1、… N-1,N 是变换长度。
在此设计示例中,变换长度 N 是 32768。此设计使用时间抽取 (DIT) 方法,将输入序列分解为奇数和偶数采样,馈送到使用 FFT 英特尔 FPGA IP 内核并行实现的两个独立的 16K 点 FFT 模块。将来自 FFT 英特尔 FPGA IP 内核的结果重新组合和重新排序,以获得最终的 FFT 输出。如图 1 中显示。类似于 FFT 英特尔 FPGA IP 内核,此设计示例采用符合 Atlantic 的输入和输出接口。
下载本示例中使用的文件:
该设计的使用受英特尔® 硬件参考设计许可协议中条款和条件的管理和约束。
zip 下载中的文件包括:
- fft_32K.v—顶层设计文件实现例如 32K 点 FFT
- parse_fft_input.v—将输入采样重新排序为偶数和奇数样本,以馈送到两个较小的16K 点 FFT 模块
- fft_small.v—由 FFT 英特尔 FPGA IP 生产 Wrapper 文件。内核配置为实现 16K 的变换长度,采用流式 I/O 数据流结构。
- combine_fft.v—使用适当的旋转因子重新组合各个 16K 点 FFT 模块的输出
- fft_32K_streaming_tb.v—用于 RTL 模拟的 Testbench
- fft_32K_streaming_vo_msim.tcl—用于在 ModelSim - 英特尔 FPGA 软件中自动执行 RTL 模拟过程的 TCL 脚本
- fft_32K_tb.m—MATLAB 模型用于验证 RTL 模拟结果
图 1 显示了 32K 点 FFT 设计示例的顶层图表。
表 1 列出了端口以及每个端口的说明。
表 1.32K 点 FFT 端口列表
端口名称 | 类型 | 描述 |
---|---|---|
data_real_in[15:0], data_imag_in[15:0] |
输入 | 16 位复杂数据输入 |
clk | 输入 | FFT 系统时钟 |
复位 | 输入 | 高电平复位 |
master_sink_dav | 输入 | 主接收器数据可用信号:FFT 从机数据源将其置位,表示可以输入至 FFT 函数的数据采样的可用性 |
master_sink_ena | 输出 | 主接收器写入支持信号:FFT 函数将其置位,表示该数据可写入至函数 |
master_sink_sop | 输入 | 输入起始包:指示向 FFT 函数输入数据块的开始。应置位一个时钟周期,与第一个输入数据采样同步 |
fft_real_out[15:0],fft_imag_out[15:0] | 输出 | 16 位复杂数据输出 |
exponent_out[5:0] | 输出 | 签名模块指数:用于调整 FFT 计算期间的内部信号值 |
master_source_dav |
输入 | 从机接收器在 FFT 函数输出上将其置位,表示其可以接受一个输出采样模块 |
master_source_ena | 输出 | 主机源支持:当数据可由 FFT 输出时,由 FFT 函数将其置位 |
master_source_sop | 输出 | 输出起始包:由各个模块的第一个输出采样将其置位 |
master_source_eop | 输出 | 输出结束包:在每个模块的最后一个输出采样进行置位 |