RTLだが、まずは1024点版を作ってみている。 演算部は当初、整数部16bit、小数部16bitの固定小数方式でやってみたのだが、累積誤差が大きくなるので結局、浮動小数方式でやることにした。
現状のRTLは以下の通りだ。ただし、まだ最終型ではない、シミュレーションでの動作確認用と言ったところだ。
dft_core.v ... ipコアのトップモジュール
5行目はステートマシンで、rst解除後の内部変数(テーブル類)の初期化と、演算回数の処理を行う。 mul_fp32, add_fp32, sub_fp32, は浮動小数演算器で、ISEのCoregenで生成した物を使っている。今回は動作確認の段階なので、レイテンシーは1にしているが、100MHzで動作させる場合は、おそらく、3~4位にする必要があるだろう。従って最終的にはパイプラインの段数が増加する。
dft_dlyline.v ... xp, xp-N用の遅延モジュール
dft_arctbl.v ... sin,cos値のテーブル
1/4周期分のみromに持ち、残りの部分の値はこれを写像して生成している。
romの中身は32bit float形式だが、このデータは以下のようにプログラムを書いて作成した。
dft_spctbl.v ... スペクトル値保持用モジュール
実態は只のRAMだ。
RTLとしては浮動小数演算器を除いては以上で、結構シンプルに出来ていると思う。
但しスペクトル値にする為には、さらに乗算器2個と√演算器、log演算器等が必要になる。
以下はシミュレーションの様子だ。 基本周期の64倍の正弦波を入れている。
上記の拡大
現状1024点としているがスペクトルの折り返しがあるので使えるのは半分になる。
従って、有意な1024点を得るためには計算は2048点で行う必要があるが、DFTの場合、必要な分のみを計算できるので、Nが2048点でありながら計算は1024点のみを行うようにも出来る。
また、スペクトル波形を画面表示することを考えるとこの位の点数で十分な気がしている。
いや~~っっっ、 FPGAって本当に面白いですね !!
0 件のコメント:
コメントを投稿