2-2 FFTのFPGAへの実装例
FPGAやCPLDを使う場合の追加の注意:
Quartusで設計ファイルのコンパイルを更新する際の注意:この章の設計ファイル(CPLDやFPGA関係)を更新する際に新しいproject folderに、旧ファイル群をコピーして名前を変え、新しい設計フォルダーとしてコンパイルすることがある。その際、以下の点に注意。昔、Quartusでコンパイルしたオブジェクトファイル(pofやjicは昔のプロジェクトフォルダーの、それらのファイルにリンクされている。したがって、それらのオブジェクトを書き込んでも、昔の変更前のコンパイルフェイルが書き込まれるのみで、新しい設計は反映されない。故に、なぜか、新しい更新が反映されないことになる。これは、相当に筆者を悩ました。Quartusのバージョンがバグを含んでいるかと思って、種々のバージョンを試したが、全てダメ。要するに、新規のコンパイルオブジェクトの指定が昔のままだったため。書込オブジェクトの更新は、まず、書込ウィンドで書込ファイルを削除(Remove)する。その後、正しい、新しいフォルダー内の書込ファイルを"Add File”で選択し、それを書き込むことで正しく更新される。
FFTモジュールを作成する際、ALTERAとの契約をすればよいのだけども(大学では無料?)、面倒くさいので作ってみた。また、学生の教育のためにも内部回路の詳細が分かる方がよい。回路図やVerilogソース部分を添付する。(解凍すれば必要部分のファイルができる。その他のMega-funcionは回路図に記述されたパラメーターより、ユーザーによって新規に作成、登録して貼付け直してください。)なお、ADCからの入力に別フォルダーのモジュールを使っているので、2-0章にあるDE0-ADtestS1フォルダーをロードされたい。
2-2-1 8192点FFTモジュール(Radix 2)
添付されたファイルは非パイプライン型のFFTモジュールである。(圧縮されたファイルを解凍すれば、必要な回路部分のファイルが現れる。後は、それらより、類推されたい。)実際の使用法は2-0章に添付された解説のPDFファイルを参照されたい。このモジュールでも音声入力(Max frequency = 20kHz, sampling f >= 40kHz)のような比較的スローな入力に対しては十分にリアルタイム性がある。整数型の演算を利用すれば高速なパイプライン演算も容易に設計できると思われるが、今回はオーバーフローに関する考察が面倒くさかったので、浮動小数型の非パイプライン型で設計した。また、あまりに技巧的な手法は教育上も望ましくない。
三角関数の係数はVerilogで書いたファイルで定義されている。筆者はCプログラムで、計算されたsin関数やcos関数値のデーターをそのままVerilogソースファイルに変換する手順を用いた。そのプログラムを示す。あわせて、Blackman窓関数の係数算出とそのVerilogファイル生成プログラムも添付する。同様にすればHamming窓も出来る(省略)。(なお、筆者はマック上でXCode (gcc)でCプログラムを作成しているが、その際、WindowsとはText fileの改行文字列が異なるので、マック上で一辺、mi というText editor を経由し、改行をWindows用に変えてセーブし直している。)
また、FFTの点数が定まらない場合(256, 1024など、フレキシブルに変わる場合)は、FPGAによる数値演算回路の1−3章で示したようなcosモジュールなどをRAMと共にFPGAに実装すればよい。
結果の検証は1−3章で述べたのと同様な方法(AVRボードをFPGAボードと接続)で行える。
授業の演習では2-0章で解説されたようなGraphic LCDに表示されるパワースペクトラムによって音声のスペクトル変化をリアルタイムに観察することによって行っている。