どもです。
昨日は"FIR_x2"について実装の工夫点をいくつかお話しましたが、今回はシミュレーションと実際の使用方法についてまとめていきたいと思います。
ディレクトリ構成
ディレクトリ構成は以下の通りとなります。
- 01_DPRAM_CONT
シンプルデュアルポートRAMをリングバッファとして機能させるためのコントローラ - 02_DATA_BUFFER
SPRAM_CONTとシンプルデュアルポートRAMを組み合わせて構成したリングバッファ - 03_SPROM_CONT
シングルポートROMから任意のフィルタ係数を出力するためのコントローラ - 04_FIR_COEF
SPROM_CONTとシングルポートROMを組み合わせて構成したFIRフィルタ係数出力部 - 05_MULT
DATA_BUFFERから出力されたPCMデータとFIR_COEFから出力されたFIRフィルタ係数を乗算する乗算器 - 06_ADD
MULTから出力された乗算結果を積分する加算器 - 07_FIR_x2
上記のDPRAM_CONTからADDモジュールを接続して構成したオーバーサンプリングデジタルフィルタのトップモジュール - 08_hex
シンプルデュアルポートRAMとシングルポートROMのデータ初期化用16進数ファイル - 09_txt
シミュレーション用PCMデータ格納ファイル - 10_Example
各種FPGA評価ボード用サンプルプロジェクト
2023年12月25日現在で「Terasic DE10-Lite」「Terasic DE0-Nano」「Efinix Trion T20 BGA256 Development Kit」「Sipeed Tang Primer 20K」の4種類のボード向けサンプルを保存しています。
シミュレーション方法
各モジュールのディレクトリに入ると「(モジュール名).v」と「(モジュール名)_TB.v」が保存されていますので、基本的には各自お持ちのシミュレータで「(モジュール名)_TB.v」を実行すればOKです。
ただし、いくつか注意点がありますのでご注意ください。
- シングルポートROM(SPROM.v)とデュアルポートRAM(SDPRAM_SINGLECLK.v)はサンプルプロジェクトで推論されることを確認済ですが、各ベンダーのIPを使ったほうがいろんな面で良いと思います。
- FIRフィルタ長は(マスタークロック周波数)÷(サンプリング周波数)で計算してください。
- 一部モジュールでは別ディレクトリのモジュールも合わせて呼び出す必要がありますので、実行前に対象のモジュールをよくご確認ください。
- 一部モジュールでは「08_hex」や「09_txt」内のファイルを使用しますので、その際はシミュレーションを実行するディレクトリに保存した上で実行してください。
- 開発時にQuesta - Intel FPGA Starter Editionで手作業でシミュレーションしたため。vcdファイル保存やシミュレーションの終了タイミングが記述されていません。必要な場合は各自記述ください。
以下にQuesta - Intel FPGA Starter Editionで実行する手順を示しておきます。
ちなみに、シミュレーション実行ファイル(*.do)のPull Request大歓迎です!
- 必要なモジュールとテストベンチをプロジェクトにインポートし、コンパイルする。このとき、hexファイルやtxtファイルで必要なものもテストベンチが保存されているフォルダに保存しておく。
- テストベンチファイルを選択し、最適化オプションやその他オプションを設定して実行する。(一部モジュールにはPSLアサーションが記述してあるのでアサーション検証も可能です。)
- 観測したい信号をwaveウィンドウに追加し、Transcriptウィンドウ内にてrunコマンドを入力してシミュレーションを実行する。(実行時間は30万~40万nsあれば十分です。)
あとは各種検証をお楽しみください。
実機での確認方法
実機の場合はベンダーによりいろいろなお作法があるので一概に「これ!」といった方法はお伝えしにくいですが、
という基本的な流れは変わらないと思います。
以下実機確認の注意点になります。
- シングルポートROM(SPROM.v)とデュアルポートRAM(SDPRAM_SINGLECLK.v)はサンプルプロジェクトで推論されることを確認済ですが、各ベンダーのIPを使ったほうがいろんな面で良いと思います。
- FIRフィルタ長は(マスタークロック周波数)÷(サンプリング周波数)で計算してください。
- 「10_Example」内のサンプルプロジェクトではI2S入力、16bit Right-Justified出力で、Amanero Combo384とPT8211Sを組み合わせて確認しています。
DE10-Liteで動作確認した結果 pic.twitter.com/s2uY1tbCnY
— AUDIY (@AUDIY14) December 3, 2023
サンプルプロジェクトの対応ボードを所有されている方は一度試されるとなんとなくわかるかと思います。
ライセンスについて
そこそこの時間と気合を入れて作ったものですので、ライセンスについてもお話させていただければと思います。
AUDIYが調べた限りでは今回のようなHDLのライセンスはMITライセンスやApacheライセンスで公開されているものが多いようですが、
- 基本的にMITやApacheはオープンソースの「ソフトウェア向け」ライセンス
- クリエイティブ・コモンズはソースコードへの適用が非推奨
ということでいろいろ調べた結果、以下のライセンスにたどり着きました。
CERN(欧州原子核研究機構)が制定したライセンスで、ハードウェアのみならずソフトウェアにも適用できるそうです(なぜに原子力関係の機関が・・・・)
また、ライセンスの継承についても3段階に区分されていて、制限が強い順に
- CERN-OHL-S v2
ソフトウェアにおけるGPL3に相当する。
このライセンスによる著作物を使用したプロジェクトはCERN-OHL-S v2でライセンスする必要がある。
回路等の物理的な著作物にのみ適用可(ソースコード不可)。 - CERN-OHL-W v2
ソフトウェアにおけるLGPL3に相当する。
このライセンスによる著作物を使用したものはCERN-OHL-W v2またはCERN-OHL-S v2でライセンスする必要がある。
CERN-OHL-S v2でライセンスする場合は、各自で作成したものについても動作に必要なものは全てCERN-OHL-S v2で公開する必要がある。
CERN-OHL-W v2でライセンスする場合は、各自で作成したもののライセンスについては問わない(別ライセンスでも良い)。
ソフトウェアやHDLにも適用可。 - CERN-OHL-P v2
ソフトウェアにおけるApache 2.0ライセンスに相当。
このライセンスによる著作物を使用したもののライセンスは問わない(CERN-OHLを継承せず別ライセンスを適用しても良い)。
その他「商用利用可」や「保証の要求不可」などは一般的なオープンソースソフトウェアライセンスと類似しています。
今回はそこそこ時間をかけて開発したことや、個人的にも思い入れがあるのでライセンスの継承だけはしていただきたくCERN-OHL-W v2でライセンスすることにしました。
もし本プロジェクトが何かに使えそうな場合はご一報いただけるとAUDIYが喜びます。w
以上、FIR_x2の中身と使用方法についてでした。
Advent Calenderなのに自分の成果物の発表になってしまいましたが、皆様に教えられるようなHDL関係の知識があるかもビミョーだったので成果物を発表することにしました。
せっかくQuartus付属のシミュレータがModelSimからQuestaに変更になったので、2024年のAdvent Calenderは本記事でも少し触れたアサーション検証についてアウトプットしたいところです。(1年あるのでそれまでに有益な情報が出るかもしれませんね。)
では皆様、良い年末年始をお過ごしください。
2024年もどうぞよろしくお願いいたします。