公開日:2026/02/28
title.png

38th Season


#38-4 Shrike-LiteのFPGAを使う(続き)

 前回、新たなマイコンボードShrike-Liteに搭載されたFPGAの論理回路設計を試行し始めました。今回は、その続きから始めて、試行を完了します。

FPGAでLED点滅回路(続き)

 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の時の波形ですが、概ね、同様な波形が取得できるはずです。

a151_gtkwv.png

 ただ、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定義など、警告級の記述がエラーで弾かれるので、ここで修正を余儀なくされるのが、更にウザいです(下図)。

a384_implicit.png

 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円(税込み)ケーブルです。

Shrike-Liteを使ってみた感想

 FPGAツールの「ウザい」を差し置くと、まず第一に、動作が不安定です。
 Shrikeライブラリのflash()メソッドでFPGAに書き込みするのですが、動作が不安定で上手く書き込めない事があります。一度失敗すると、リセットしても、スケッチやFPGA書き込みデータなどの再書き込みを実行しても、一向に書き込めない状態に陥ります。
 USBケーブルを挿抜して、一度電源を遮断しないと元に戻りません。
 ちょっとした事で不安定状態へ落ちるので、論理回路のデバッグ中、回路にバグがあって動作しないのか、上の不安定状態に陥って動かないのか判断できず、嵌まることもしばしばありました。

 また、仕様なのかも知れませんが、初回の書き込み(flash()メソッド)以降、同じプログラム内で2度目に書き込もうとすると、失敗します。この時、flash()メソッドは成功を意味する値を返すので、プログラムから成否を知ることはできません。

※仕様で無いならば、個体差による不具合の可能性もある。どちらにしても、製品(Shrike-Lite)としての調整不足は否めない。

 第二には、やはりFPGAツールの「ウザい」は、かなり萎えます。第一に挙げた「不安定」もFPGAがらみだし、どうもShrike-LiteのFPGAは地雷っぽい臭いがします……。


 マイコンボードに小規模FPGAが搭載されて、ちょっとした回路を自分で設計して使う事ができると言う、非常に魅力的な製品で、この価格は「お安い」と言って良いです。しかし、FPGAのツールには癖がある(ウザい)し、書き込みできる論理規模も小さすぎ、何より動作も不安定です。現時点では、お勧めできない製品と言わざるを得ません。


btn_arduino.png

btn_prev.png btn_next.png

home