FFT回路が実機で動いたようだ
ようやくZYNQに作りこんでいた「Radix-8、周波数間引き、改良型アルゴリズム」の超高速FFT回路が動きました。
今、作っている回路は、このような構成になりました。

中心にあるHyperFFTエンジンは、216個の乗算器を持っていて、演算メモリとしてBlockRAMを64個使います。
BitReverseメモリは、周波数間引きでなので計算結果がビットリバースしているので、それを元の順序に戻すためのメモリです。
例えば、アドレス00000001を10000000から読み出し、アドレス10100000を00000101から読み出すような動作をします。ハードウェア的にはアドレス線をひっくりかえせばよいだけなのですが、意外とアクセス時間がかかってしまいます。
書き込みは256ビット単位(8ワードまとめて)なので16384ポイント/8ワード/250MHz=8.2μ秒で終わるのですが、読み出しが32bit単位なので66μ秒もかかってしまいます。
FFT自体が80μ秒で終わるのですが、それに近い時間をビットリバースで使ってしまうことになります。ビットリバースの効率よいアルゴリズムがあれば知りたいです。
その後ろにあるAXI HPポートは64ビットのバス幅でDMA転送して、FFT結果をメインメモリに格納します。
![]()
全体的なタイミングはこうなります。
- AXIバスからデータを読み出してくる。32768ポイントのデータの読み出しに32.768μ秒かかる。
- 読み出したデータは入力バッファに蓄えられる。そのバッファ内のデータはFFTマシンのLOADステートで演算メモリに取り込まれる。LOADステートは16.384μ秒かかる。
- FFTマシンは演算を実行する。その時間は81.92μ秒である。最後のループ5では計算結果をBITREVメモリに書きだす。32768ポイントのFFTの結果は、前半の16384ポイントだけが必要である。
- BITREVメモリに書き込まれたデータは65.536μ秒かけて読み出され、ほとんど遅延なくAXIバスを通じてメインメモリにライトバックされる。
上のステップ1のデータの準備と、ステップ4のBITREVメモリの読み出しは、FFT演算器とは独立しているので、次のデータの準備や、前のデータの転送と同時に実行できるので、98μ秒で連続してFFTを行うことができます。
頑張ればループ5での演算メモリをロックしなければ、LOADステージをなくせるかもしれません。
![]()
サンプルデータを与えてFFTしてみて、メモリダンプしてみたところ、先日のVHDLのシミュレーションで出力した結果と完全に一致しました。
ついに、実機で計算を間違わずにFFTができたと言えるでしょう。
| 固定リンク




コメント