« 高位合成について思ったこと | トップページ | MITOUJTAGの更新パッチ2.90をリリースしました »

2015.10.01

超高速のFFT回路

高速FFT回路をFPGAで作ろうとしています。

18bit 10Mワード/秒の速度で流れてくるADCのデータをつなぎ目無くFFTしたいのですが、どこまでいけるでしょう。

FFT回路の中央にあるのはバタフライ演算という回路ですが、1回のバタフライ演算を2クロックで計算するとして、200MHzで動かすとしたら・・

  • 4096ポイントのFFTなら、毎秒4000回 → サンプリングクロック 16MHz迄
  • 16384ポイントのFFTなら、毎秒870回 → サンプリングクロック 14MHz迄
  • 65536ポイントのFFTなら、毎秒190回 → サンプリングクロック 12.5MHz迄
  • 1048576ポイントのFFTなら、毎秒9.5回 → サンプリングクロック 9.9MHz迄

毎秒12~16Mでやってくるデータを「つなぎめなくFFT」できるわけです。

ちなみに、バタフライ演算というのは、

・A×W+B
・A×W-B

を求める複素数の計算ですが、本当に2クロックでできるでしょうか。

東工大の2年生のアルバイト君にFPGAの回路を設計してもらいました。紙でおおまかな設計図とタイミングチャートを書いてVivadoに落とし込んでいました。

Fft_1

Fft_2

Fft_3

Fft_4

VivadoのRTLシミュレータ上ではちゃんと動いたようです。これから、C言語で同じものを作って様々なタイプの入力信号を入れて、HDLのシミュレーションと、パソコンで計算した結果とが一致するかといったテストを行う予定ですが、Vivado HLSでHDLとCを使いこなせるともう少し楽になるのかもしれません。

今のFPGAは乗算器+加算器が掃いて捨てるほどある(600個とか)ので、ケチケチした最適化はしなくてもよさそうです。+1と-2した値の加減算のためにわざわざ別のDSPを使ったり、大富豪のようです。。

FFTを行う上でボトルネックになるのはDDR3メモリの読み書き速度でした。200MHzで18bitの信号を読み出してこようとすると、実部・虚部ともに18bitだから64bitのバス幅を使うことになります。

ZYNQのHPポートは250MHz 64bitが最高速度だから、バタフライ演算用データの読み出しと、バタフライ演算結果の書き込みで別のHPポートを使うことになります。

ZYNQの外部DDR3メモリは最高32bit 2GHzで動くとしたら、HPポート4個分の最高性能になります。実際はその半分くらいを見ておいて、2個のHPポートに全力で読み書きしたらいっぱいいっぱいです。

つまり、DSPブロックが余っているのでバタフライ演算自体はいくらでも速くできるけど、DDR3メモリの速度がボトルネックになるということになります。

|

« 高位合成について思ったこと | トップページ | MITOUJTAGの更新パッチ2.90をリリースしました »

コメント

コメントを書く



(ウェブ上には掲載しません)




« 高位合成について思ったこと | トップページ | MITOUJTAGの更新パッチ2.90をリリースしました »