FFT IP 库 - 2023.2 简体中文

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文

在 C++ 设计中可使用 hls_fft.h 库调用 AMD FFT IP 块。本节解释了在 C++ 代码中配置 FFT 的方式。如需获取 FFT 应用示例,请参阅 GitHub 上的 Vitis-HLS-Introductory-Examples/Misc

要在 C++ 代码中使用 FFT,请执行以下操作:

  1. 在代码中包含 hls_fft.h
  2. 使用预定义的 hls::ip_fft::params_t 结构体设置默认参数
  3. 定义运行时配置
  4. 调用 FFT 函数
    提示: 由于它使用 DATAFLOW 编译指示或指令,因此必须在数据流循环而非流水打拍循环中来执行 FFT 的流水打拍。
  5. (可选)检查运行时状态

以下代码示例提供了每个步骤的执行方式的摘要信息。后文对每个步骤进行了更详细的探讨。

首先,在源代码中包含 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();
提示: 以上示例显示了标量值和阵列的使用,但 FFT 函数还支持对实参使用 hls::stream。如需了解更多信息,请参阅 将 FFT 函数与串口接口搭配使用