AMD FFT ブロックは、hls_fft.h
ライブラリを使用すると C++ デザイン内で呼び出すことができます。このセクションでは、FFT を C++ コードで設定する方法を説明します。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;
};
ランタイム コンフィギュレーションとランタイム ステータスのデータ型と変数を定義します。これらの値は動的に変化する可能性があるので、変更可能で API からアクセス可能な C コードの変数として定義します。
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);
HLS 名前空間と定義済みスタティック コンフィギュレーション (この例では param1
) を使用して FFT 関数を呼び出します。関数のパラメーターは、順に入力データ、出力データ、出力ステータス、入力コンフィギュレーションを示します。
hls::fft<param1> (xn1, xk1, &fft_status1, &fft_config1);
最後に出力ステータスをチェックします。この例では、オーバーフロー フラグがチェックされて、結果が ovflo 変数に格納されます。
*ovflo = fft_status1->getOvflo();
hls::stream
を使用できます。詳細は、ストリーミング インターフェイス使用した FFT 関数 を参照してください。