前回、新たなマイコンボードShrike-Liteに搭載されたFPGAの論理回路設計を試行し始めました。今回は、その続きから始めて、試行を完了します。
Lチカする論理回路(ハードウェア)を、Shrike-LiteのFPGAに移植している続きです。
お作法に従って、作成しましょう。
お作法まとめ:
完成版最上位モジュール記述(main.v)で確認して見てください。
話は変わりますが、いつもFPGAを使う時、リセット信号の取り扱いに困ります。
今回のShrike-Lite FPGAでは、I/OプランナにFPGA_CORE_RDYという端子があります。この端子は、書き込み中はLOWレベル、書き込みが終わるとHIGHレベルになるので、この信号を引き込んでリセット信号を作成しました。
リセット信号生成回路(RTL):
// reset
reg rst_n;
reg [3:0] rst_cnt;
always @(posedge clk)
begin
if (!rdy)
begin
rst_n<=1'b0;
rst_cnt[3:0]<=4'h0;
end
else if (rst_cnt[3:0]==4'hf)
rst_n<=1'b1;
else
rst_cnt[3:0]<=rst_cnt[3:0] + 4'h1;
end
上のRTLに於いて信号名rdyが、FPGA_CORE_RDY端子から引き込んだ信号線です。これをトリガとして、アサート期間を16サイクル引き延ばし、リセット信号rst_n(負論理)を生成しました。
シミュレーションも実行できるようにしておきましょう。
FPGA Editorの左側「Sourcesサブウインドウ」で、「右クリック ⇒ New Custom Testbench」を実行して、適切な名前でテストベンチファイル(test.v)を作り、テスト用のスティミュラスを記述します。
中華FPGAの時も、iverilogでシミュレーションしていたので、使い勝手も結果も、同様でした。以下図は中華FPGAの時の波形ですが、概ね、同様な波形が取得できるはずです。

ただ、Go Configureでシミュレーションすると、一々GTKWaveの新しいウインドウを開くのがウザいです。
それと、今回の回路は約1秒周期でLEDが点滅するので、そのままシミュレーションしようとすると、実時間で1秒以上に渡る長いシミュレーションを実行しないとならなくなるので注意しましょう。実際のシミュレーションは長時間になるし、出力するVCD等のデータも膨大になってしまいます。
RTLのソースリスト(blink_fsm.v)で、「`define SIMULATION」を有効にして、シミュレーション時間を短縮して実行しましょう。Go Configureには、「シミュレーションの時だけ`defineする」様な機能は無いので、手動で切り替える必要があり、ウザいです。
※Vivadoにはシミュレーション実行時だけ、「`define SIMULATION」等を実行する機能があります。
完成したプロジェクトをGitHubに公開しておきました。
GitHub:BLINK-GOプロジェクト
GitHubデスクトップでクローンしても良いし、「<>Code ⇒ Local ⇒ Download ZIP」でダウンロード後、解凍しても良いです。プロジェクト(BLINK.ffpga)をGo Configureで開くと、RTLを閲覧・修正したり、シミュレーション実行、コンパイル(論理合成・配置配線)等が可能となります。
FPGA Editorの左側下方、「Synthesize」ボタンで論理合成を実行後、その下の「Generate Bitstream」ボタンで、配置配線→FPGA書き込み用のビットストリームを生成できます。一連のワークフロウを一気通貫で実行する機能が無いので、毎回2個のボタンを時間差で押さないとならないのがウザいです。
※毎度「Generate Bitstream」ボタンを押した時に出現する確認メッセージもウザいです。
暗黙のwire定義など、警告級の記述がエラーで弾かれるので、ここで修正を余儀なくされるのが、更にウザいです(下図)。

Verilog-HDLが仕様として規定している暗黙のwire宣言なんだから、精々「警告」止まりでしょうが!何でエラーにするかな?いや、それどころか、こんなことくらいでは警告出されるのもウザいです(ましてエラー、ウザいの極み)。しかも、RTLエディタ画面では「情報(i)」マークℹ️なのに、論理合成するとエラーを出すのが、意味不明でウザいです。
色々と気に喰わないツールですが、気を取り直して論理合成結果を確認しておきます。
コンパイル結果:
完成したFPGA書き込み用ビットストリームファイルは以下のパスに作成されています。
<プロジェクトディレクトリ>\ffpga\build\bitstream\FPGA_bitstream_MCU.bin
そのままのファイル名でコピーしても良い(※)ですが、適切な名前に変更してShrike-LiteのオンボードFlashメモリに書き込んでおくと、「AAA.inoからはAAA.bin、BBB.inoからはBBB.binをFPGAに書き込む」様な使い方ができて便利かもしれません。
ただし、Arduino IDEから「ツールメニュー ⇒ Pico LittleFS Data Upload」を実行した時点で、INOプロジェクトディレクトリ下のdataディレクトリ内にあるファイル「だけ」が、Shrike-LiteのFlashメモリに書き込まれるので注意してください。
書き込み実行した時にdataディレクトリに存在しないファイルは消去されてしまいます。
※何度も、RTLの修正→論理合成→配置配線を繰り返すデバッグ中には、デフォルトファイル名のまま使うと、一々リネームする手間が省けます。
完成した回路をShrike-LiteのFPGAへ書き込んで、LEDの点滅を確認する実験に進みます。
Shrike-Liteをお迎えした回の実験で複製したshrike_flash.inoの環境を流用して、dataフォルダへ、前節で作成したFPGA書き込み用ビットストリームファイル(FPGA_bitstream_MCU.bin)をコピー、続いてShrike-Liteへ書き込みます。ビットストリームのファイル名などは適宜変更してください。
Shrike-Liteボード上の青色LEDが点滅したら成功です。点滅パタンは、「短く2回光って、長めに消灯、周期約1秒」です。以下動画の様に光るはずです。
マイコンRP2040のソフトウェアで光らせているのではなく、Shrike-Liteに搭載されたFPGAの論理回路(ハードウェア)で光らせています。
ちなみにソフトウェアからは、LED_BUILTINを制御する事でLEDを光らせることができます。この時光るLEDは、FPGA用のLEDとは別な物が搭載されています。
※動画で確認できる白いUSBケーブルは、ダイソーで購入した110円(税込み)ケーブルです。
FPGAツールの「ウザい」を差し置くと、まず第一に、動作が不安定です。
Shrikeライブラリのflash()メソッドでFPGAに書き込みするのですが、動作が不安定で上手く書き込めない事があります。一度失敗すると、リセットしても、スケッチやFPGA書き込みデータなどの再書き込みを実行しても、一向に書き込めない状態に陥ります。
USBケーブルを挿抜して、一度電源を遮断しないと元に戻りません。
ちょっとした事で不安定状態へ落ちるので、論理回路のデバッグ中、回路にバグがあって動作しないのか、上の不安定状態に陥って動かないのか判断できず、嵌まることもしばしばありました。
また、仕様なのかも知れませんが、初回の書き込み(flash()メソッド)以降、同じプログラム内で2度目に書き込もうとすると、失敗します。この時、flash()メソッドは成功を意味する値を返すので、プログラムから成否を知ることはできません。
※仕様で無いならば、個体差による不具合の可能性もある。どちらにしても、製品(Shrike-Lite)としての調整不足は否めない。
第二には、やはりFPGAツールの「ウザい」は、かなり萎えます。第一に挙げた「不安定」もFPGAがらみだし、どうもShrike-LiteのFPGAは地雷っぽい臭いがします……。
マイコンボードに小規模FPGAが搭載されて、ちょっとした回路を自分で設計して使う事ができると言う、非常に魅力的な製品で、この価格は「お安い」と言って良いです。しかし、FPGAのツールには癖がある(ウザい)し、書き込みできる論理規模も小さすぎ、何より動作も不安定です。現時点では、お勧めできない製品と言わざるを得ません。


