在 C++ 设计中可使用 hls_fft.h
库调用 AMD FFT IP 块。本节解释了在 C++ 代码中配置 FFT 的方式。如需获取 FFT 应用示例,请参阅 GitHub 上的 Vitis-HLS-Introductory-Examples/Misc。
要在 C++ 代码中使用 FFT,请执行以下操作:
- 在代码中包含 hls_fft.h 库
- 使用预定义的
hls::ip_fft::params_t
结构体设置默认参数 - 定义运行时配置
- 调用 FFT 函数提示: 由于它使用 DATAFLOW 编译指示或指令,因此必须在数据流循环而非流水打拍循环中来执行 FFT 的流水打拍。
- (可选)检查运行时状态
以下代码示例提供了每个步骤的执行方式的摘要信息。后文对每个步骤进行了更详细的探讨。
首先,在源代码中包含 FFT 库。此头文件位于 Vitis HLS 安装区域内的 include 目录中,执行 Vitis HLS 时会自动搜索该目录。
#include "hls_fft.h"
定义 FFT 的静态参数。这包括诸如输入宽度、通道数、架构类型等不会发生动态更改的参数。FFT 库包含参数化 hls::ip_fft::params_t
结构体,可用于以默认值初始化所有静态参数。
在此示例中,使用用户基于预定义结构体定义的 param1
结构体来覆盖输出排序以及配置端口和状态端口宽度的默认值。
struct param1 : hls::ip_fft::params_t {
static const unsigned ordering_opt = hls::ip_fft::natural_order;
static const unsigned config_width = FFT_CONFIG_WIDTH;
static const unsigned status_width = FFT_STATUS_WIDTH;
};
为运行时配置和运行时状态定义类型和变量。这些值可采用动态值,因此在 C 语言代码中定义为可通过 API 来更改和访问的变量。
typedef hls::ip_fft::config_t<param1> config_t;
typedef hls::ip_fft::status_t<param1> status_t;
config_t fft_config1;
status_t fft_status1;
下一步,设置运行时配置。此示例基于“direction”变量的值设置 FFT 的方向(正向或反向),并设置了缩放调度的值。
fft_config1.setDir(direction);
fft_config1.setSch(0x2AB);
使用具有已定义的静态配置(即此示例中的 param1
)的 HLS 名称空间来调用 FFT 函数。函数参数按顺序为输入数据、输出数据、输出状态和输入配置。
hls::fft<param1> (xn1, xk1, &fft_status1, &fft_config1);
最后,检查输出状态。此示例会检查上溢标志,并将结果存储在“ovflo”变量中
*ovflo = fft_status1->getOvflo();