More than 1 year has passed since last update.
インテル® FPGA ユーザーコミュニティ
モデルベース開発でMATLABからコントロールできるFPGAボード信号発生器の作成
0. はじめに
筆者はギタリストです。加齢とともに年々ヘタクソになっていくせいもあり、最近は弾くことよりも機材をいじっていることのほうが多くなりました。ジャンクの真空管ギターアンプを格安で買ってきて修理して使うことがあるのですが、修理するときにいちいちギターを繋いで、ジャラ~ンって鳴らすのって結構面倒です。周波数が安定していないので、オシロスコープで表示しても、どんな波形になっているのかよくわからないし、数秒で減衰するので何度も弾かないといけなかったりして。
そこで安価なFPGAボード(確か数千円だったような)SoCKitで信号発生器作成してみました。FPGAで何かを作るときの参考になれば幸いです。
👁 image.png
こちらが完成後、ギターアンプのレストア作業に使っているところ。PCBすら無かった時代のものと先端的なデバイスのアンバランスな組み合わせがいいですね~
👁 image.png
それではどうやって作成したか解説してきましょう。
設計手順
ちなみにツールはMATLAB/SimulinkとQuartus/Qsysを使いました。
大まかな手順としては以下の通りです。
- 既存のI2CやI2SのインターフェイスSimulinkモデルからHDLコード生成/IPコア生成
- Qsysで生成したIPコアと統合してシステムの設計
- QsysのシステムをMATLABに登録
- Simulinkで信号発生器のアルゴリズムを作成
- シミュレーションでアルゴリズム、UIの動作確認
- 信号発生器のHDLコード/IPコアを生成して全て統合(Quartusでコンパイル~ダウンロード)
- MATLABでFPGAボードコントロール用のGUIを作成
- 実機テスト
GitHubに必要なファイルは置いてあるので同じようなものを作りたい人は好きに流用して下さい。
信号発生器の仕様
- サンプリング周波数は48kHz
- 発生する信号の周波数はとりあえず20~9kHzぐらいが出ればいい
- 波形はSin、 鋸波、矩形波がそれぞれ独立してOn/Offできる
- ボードの電源を入れるととりあえず使えて、SWで音量、周波数、波形の設定が出来る
- Push Sw0,1で音量Up/Down
- Push Sw2,3で周波数を段階的にUp/Down (20, 50, 100, 200,...8000, 8500, 9000Hz)
- PC(MATLAB)と接続するともうちょっと細かい調整ができる
- 周波数は任意の値が設定できる
- Volume調整
- 波形のOn/Off
1. 既存のI2CやI2SのインターフェイスSimulinkモデルからHDLコード生成/IPコア生成
信号発生器の回路を作成する前にFPGAのインターフェイス回路など、周辺部分を作成して、MATLABで使えるように登録する必要があります。
I2CとI2SのIPの作成
SoCKitボードにはSM2603というAudio CODECが実装されています。FPGAからこのCODECを介してオーディオ信号を入出力するために、インターフェイスを作成します。
HDL Coderのヘルプドキュメントにある例を参考にして、I2SとI2CのIPを生成します。設定は以下のとおり。
I2Sのターゲットインターフェイス設定
👁 image.png
I2Cのターゲットインターフェイス設定
👁 image.png
あと、注意点として、これらのIPコアを生成するときにはAXIスレーブIPの幅を13に設定しておく必要があります。
👁 image.png
2. Qsysで生成したIPコアと統合してシステムの設計
Intel Quartusを起動、New Project Wizardを起動してボードを指定して、空のプロジェクトを作成します。
👁 image.png
ToolメニューからQsysを開いて以下のIPを追加します。
- Arria V/Cyclone V Hard Processing System: 電源を入れたらすぐ使えるよう、電源起動時CPUからFPGAをプログラムするために使います。
- Altera PLL: ユーザロジックにクロックを与えるためのPLLです。
- Audio Clock for DE-series Board: オーディオCODEC(ADC/DAC)にクロック入力するためのPLLのIPです。
👁 image.png
以下のポートはExportをダブルクリックして外部ピン接続の設定にしておきます。
audio_pll_0/audio_clk
I2C_SSM2603/I2C_CLK, I2C_DATA, MUTEN
I2S_SSM2603/Bit_clock, RECLK, Serial_data_in, PBCLK, Serial_data_out
Qsysで作成したデザインをaudioSystemSockit.qsysとして保存します。SaveするとAXI4 Streamが接続されてないとエラーが出ますが、後でこれはHDL Coderが生成したIPと接続するので、エラーを気にせず進めます。
👁 image.png
先ほどExport設定したポートのピンアサインメントを行い、tclファイルに保存します。
3. QsysのシステムをMATLABに登録
audioSystemSockit.qsysとtcl、FPGAボードをMATLABに登録するために、Mファイルを作成して最初に+で始まるフォルダに保存します。ちなみに+で始まるフォルダはパッケージフォルダと言って、パスを設定しなくても上位ディレクトリからフォルダ内部が認識されます。
👁 image.png
それぞれのファイルは以下の目的のためにあります。(クリックすると展開されてコードが表示されます。)
4. Simulinkで信号発生器のアルゴリズムを作成
信号発生器の回路はSimulinkで作ります。
テストベンチ部分
まず側(テストベンチ)の部分ですが、FPGAボードと同じように、Push SWやSlide SWで操作できるようにボタン類を付けました。
👁 image.png
FPGAデザイントップ階層
FPGA実装する最上位階層はルーティングしたり、SWのインターフェイス回路など。オーディオ入力信号は信号発生器の信号とMixして、音量調整を通過して出力されるようにしてあります。
👁 image.png
SIN波生成部分
整数をインクリメントして、鋸波を作成して、それをSIN関数に入力しています。鋸波、矩形波も出力できるようにしてあります。
👁 image.png
5. シミュレーションでアルゴリズム、UIの動作確認
シミュレーションを行って、ボタン類の操作と出力波形の確認を行います。こういったHMIもSimulinkでシミュレーションして動作確認できました。
👁 giphy.gif
6. 信号発生器のHDLコード/IPコアを生成して全て統合(Quartusでコンパイル~ダウンロード)
シミュレーションで機能検証できたら、HDLコード(IPコア)を生成します。
ワークフローアドバイザーを起動したら、事前に登録したボードを選択します。
👁 image.png
リファレンス設計のパラメータでInsert JTAG MATLAB as AXI MasterをOnに設定します。この設定をすることで、MATLABからJTAG経由でコントロールできるようになります。
👁 image.png
インターフェイスは次のように設定します。インターフェイスAXI4に設定されているポートがPC(MATLAB)からコントロールできるレジスタになります。
👁 image.png
MATLAB as AXI Master (AXI Manager) を追加挿入すると、ID幅をデフォルト12から13に変更しておく必要があります。
👁 image.png
あとは上から全部実行すると、IPコア生成後、Quartusのプロジェクト生成、コンパイル、デバイスのプログラムが行なわれます。
7. MATLABでFPGAボードコントロール用のGUIを作成
FPGAボードに付いているUIはPush Sw, Slide Swがそれぞれいくつかしか付いておらず貧弱で、操作がしにくいため、いざというときにPCから細かい調整できるようにGUIを作成しました。
👁 image.png
👁 image.png
HDLコード生成時に、MATLAB AXI Master (AXI Manager) IPを埋め込んでいるので、MATLABから以下のようなコマンドを実行するとFPGAのレジスタ値を読み書きすることができます。
FPGAボードにJTAG接続
axiMaster = aximaster('Intel', 'interface', 'JTAG');
レジスタRead
readmemory(axiMaster, '0x108', 1)
レジスタWrite
writememory(axiMaster, '0x108', 123)
GUIの操作でレジスタ値をWriteして信号のOn/Off, ボリュームと周波数の調整ができるようにしました。
8. 実機テスト
FPGAボードから出力される信号をオシロスコープで確認しました。
おわり
参考文献
[Quartus Prime ガイド Qsys システム統合ツールの使い方] (https://www.macnica.co.jp/business/semiconductor/articles/pdf/ELS1425_Q1600_10__1.pdf)
MATLAB Example [Authoring a Reference Design for Audio System on Intel board]
(https://jp.mathworks.com/help/releases/R2020b/hdlcoder/ug/authoring-a-reference-design-for-audio-system-on-an-intel-board.html)
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme
