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

38th Season


#38-3 Shrike-LiteのFPGAを使う

 前回、新たに入手したマイコンボードShrike-Liteの開発環境を整備しました。今回は、Shrike-Liteボードに搭載されたFPGAに論理回路を書き込むための開発環境を試して行きます。

Shrike-LiteのFPGA設計準備

 FPGAに書き込む論理回路を開発するためのツールは、前回インストールしたGo Configure Software Hubです。まずは、ざっと全体を舐めておきましょう。

最上位モジュール

 Shrike-LiteのFPGAへ書き込む最上位モジュールにはツール(Go Configure)独特の「お作法🍴」が、あります。

 上の様な「お作法」の性で、最上位モジュールはShrike-LiteのFPGA専用記述となります。設計した、汎用的なI/OユニットのRTLには手を加えず、Shrike-Lite用の最上位モジュールにインスタンスして使うのが推奨です。

新規プロジェクトの作成

 以下手順で、新規プロジェクトを作成しましょう。

 新規プロジェクトを作成して最初に開くウインドウは、どうも使い道が良く解りません。このウインドウの「Toolsメニュー ⇒ FPGA Editor」を実行すると、以下のウインドウが開きます。

a383_gocnfg.png

 上図のウインドウで、RTLを閲覧・編集したり、コンパイル(論理合成・配置配線)したりすることになります。ここに至る前段階、用途不明なウインドウが存在し続けるのはウザいです。

 新規プロジェクトを開いた状態で、そのまま次節へお進みください。

シミュレーション

 シミュレータはGo Configureには含まれていませんが、フリーソフトウェアのIcarus VerilogおよびGTKWaveと連携できます。本HPに於いてIcarus VerilogとGTKWaveは、昔使っていた中華FPGAのシミュレーション用にインストール済みです。インストール方法は、こちらをご覧ください。
 前節の新規プロジェクト作成に引き続き、シミュレータの設定を実施しましょう(以下手順)。

a383_ivlgpath.png

 普通にインストールしてあれば、「Autodetect」ボタンを押すと自動的にパスを通してくれます。
 ついでなので、上のウインドウから「Simulation」項目を選び、出力する波形データ形式を選択しておきましょう。筆者はVCD形式を選択しました。

タイミング制約

 タイミング制約をかけなくても、論理合成・配置配線できて、FPGAに書き込むバイナリデータを生成することができました(マジか)。ですが、適切なクロックくらいは指定すべきでしょう。
 以下リンクからForgeFPGA SLG47910のメーカサイトに飛び、「ForgeFPGA Workshop User Guide」というドキュメントを入手しましょう。

  ForgeFPGA SLG47910を検索する(別ウインドウが開きます)

 ドキュメント(ForgeFPGA Workshop User Guide)の中に、タイミング制約の記述方法が記されています。

I/Oマッピング

 最初にトライステートバッファが記述できないと記しました。確かに、トライステートバッファをRTLで記述してもエラーとなるのですが、使えないわけでは、ありません。論理合成に対応していないだけで、I/Oバッファの制御信号を一々個別に生成して出力する事により、トライステートバッファやオープンドレインバッファなどを使用可能です。
 ただし、RTLで個別に信号線を定義した上で、I/Oプランナで一々接続設定する必要があります。

 実は、I/OプランナにはRAMマクロの信号線や、内蔵発振器(50MHz)、PLL等の信号線も含まれています。つまるところ、ここに挙げた様なハードマクロを使いたい場合、I/Oプランナを使ってRTLの信号と手動接続する事になります。
 RAMマクロは特に注意が必要です。論理合成しても、RTLから自動的には推論してくれません。各設計者が個別にRAMマクロとの接続信号を用意した上で、I/Oプランナを使って、どのRAMマクロをどんなモード(バス幅、アドレス深度、等)で接続したいか、個別に接続指定する必要があります。大変面倒でウザいです。
 この辺り、本格的なFPGA(Xilinx Vivadoなど)と比べて劣っています。「安価で小規模なFPGAなんだから我慢して使え」って、事でしょうか?

FPGAでLED点滅回路

 中華FPGAボードの時に設計したLチカ回路と解説が、以下の記事にあります。

  「#15-1 FPGAボードを買ってみた

  「#15-2 論理回路を設計する

  GitHub:BLINK-VDプロジェクト(Cmod A7ボード用)

 これをShrike-LiteのFPGAに移植して見ましょう。

クロック周波数

 前節で紹介したLチカ回路ですが、Cmod A7ボード(FPGA)を導入した時に、クロック周波数12MHzに合わせて約1秒周期で点滅する回路に仕上げてありました。
 Shrike-LiteのFPGAでは発振周波数が50MHzなので、そのままだと点滅間隔が×4倍以上となって速すぎます。そこで、FPGAのPLLマクロを使い、12MHz近辺まで周波数を落として使おうと思います。FPGA Editorの「Toolsメニュー ⇒ PLL Configurator」を実行すると、以下の様な設定ウインドウが開きます。

a383_pllmcro.png

 源発振クロック50MHzからの整数逓倍と整数分周の結果、ピッタリ12MHzは生成できず、11.989796MHzとなりました。この誤差なら、概ね1s周期の体感を損ねる事は無いので、まあ、良いでしょう。

 「Apply」ボタンを押すと、I/OプランナのPLL制御端子に信号名が自動設定されます。
 RTLも、上の設定に合わせて追加修正する必要があり、PLL設定ウインドウ(上図)の「Verilog PLL Config」タブに表示されるコード(以下参照)を複製して、手動で最上位のRTLに反映しなければなりません。

  PLL設定用コード例)
  // Port List
  output pll_en,
  output [5:0] pll_refdiv,
  output [11:0] pll_fbdiv,
  output [2:0] pll_postdiv1,
  output [2:0] pll_postdiv2,
  output pll_bypass,
  output pll_clk_selection,

  // Assigned signals
  assign pll_en=1'b1;
  assign pll_refdiv=6'b00_0100;
  assign pll_fbdiv=12'b0000_0010_1111;
  assign pll_postdiv1=3'b111;
  assign pll_postdiv2=3'b111;
  assign pll_bypass=1'b0;
  assign pll_clk_selection=1'b0;


 PLL Configulatorでの設定値が、後半のassignに反映されていますので、この設定値を変更しない様に反映しましょう。完成した最上位モジュール(main.v)のRTLで確認して見てください。

タイミング制約ファイル

 FPGA Editorの左側「Sourcesサブウインドウ」で、「右クリック ⇒ New Timing Constraints」を実行して、適切な名前で制約ファイルを作っておきましょう。
 まっさらな制約ファイルが生成されるので、こちらのドキュメントに従って、クロック周波数くらいは指定しておきます。

  タイミング制約例)blink.sdc

 上の記述にて、クロック入力端子clkに約12MHzのクロックを設定しました。

casezを使えって?

 エラーにこそ、なりませんが、RTLにcasexを使っていると「casezを使え」と、警告がウザいです。Lチカ回路の設計に使った入出力表→Verilog-HDL変換スクリプト(tab2v.olv)を改造して、casezが使える様にしておきました。

  改訂版スクリプト:tab2v.olv

 ウザいのは確かですが、この指摘は「もっとも」なので、素直に対処しました。


 Cmod A7ボード(FPGA)で使用しているツール、XilinxのVivadoと異なり、だいぶ機能的に制限され、一々ユーザが指定して行かないとならないのが、多少面倒ではあります。次回、続きの設計を進めて行きます。


btn_arduino.png

btn_prev.png btn_next.png

home