FFT への入力は、3 ビットの制御ワードと、それぞれ 1024 のサンプルからなる 4 つのデータ ブロックです。制御ワードの下位 2 ビット (Sz[1:0]
) は、FFT のサイズ (すなわち、N= 4096/2Sz) を示します。制御ワードのビット 2 は、データに対して FFT と IFFT のどちらを実行するかを指定します。次の図に、さまざまな FFT サイズのデータ ブロックの定義を示します。
制御ワードとデータ ブロック 0 および 1 は 1GSPS の AXI パケット ストリームにマルチプレクスされ、データ ブロック 2 および 3 はその他のパケット ストリームにマルチプレクスされます。パケット ID は、コンパイル中に ザイリンクス ツールによって割り当てられ、後処理を容易にするよう JSON ファイルにレポートされます。AI エンジン アレイのパケット スイッチングの詳細は、 『Versal ACAP AI エンジン プログラミング環境ユーザー ガイド』 (UG1076) を参照してください。次の図は、FFT デザインの入力パケット ストリームのタイミングを簡潔に図示したものです。
FFT の出力は、1GSPS サンプルの 2 本のストリームです。データ フォーマットは FFT サイズによって異なります。一部のアプリケーションでは、出力フォーマットを変更することでプログラマブル ロジックのデザインをシンプルにできます。その場合は FFTz の C 関数を変更できます。
1024 ポイント FFT と 4 ポイント FFT 間の線形位相回転は、大容量 ROM を使用する代わりに AI エンジンのスカラー ユニットに組み込まれた sincos()
関数を使用して、FFTb、FFTc、および FFTd カーネルに実装されます。この手法により、3 つの AI エンジン x 1024 x 4 バイト/サンプル = 12,288 バイトのメモリを削減できます。この容量はメモリ バンク 1.5 個分に相当します。具体的には、8 つの回転因子からなるベクターが並列に計算されます (次式)。
この式の右辺の最初の項は、AI エンジンのスカラー ユニットの sincos()
関数によって計算されます。2 番目の項は、ループの前に (sincos()
を使用して) 計算済みのベクターです。
AI エンジンおよびバッファーのロケーション ピンニングを使用して、メモリ競合を最小限に抑えながら、2 つの FFT モジュールを 5x2 の AI エンジン アレイにパックします。図 4 に示すように、このデザインは 5x2 AI エンジン アレイ内のすべてのメモリ バンクと AI エンジン を使用して最大限のスループットを実現します。図 4 では、網掛けの AI エンジンは 5x2 の AI エンジン アレイのうち 5 つの AI エンジンの一方のセットで、白地の AI エンジンはもう一方のセットです。