NetBSDでFPAG開発を始めてみる

この記事は、NetBSD Advent Calendar 2025の21日目の記事です。

はじめに

Verilogや他のHDL (Hardware Description Language; ハードウェア記述言語)を勉強して来ましたが、シミュレーションだけでハードウェアとして実現したことはありませんでした。 XilinxやAlteraのFPGAを搭載した基板は高価ですし、LatticeやMicrochip (旧Actel)のFPGA基板で良いものがどれかも良く分かりません。 そもそも、何も分からない段階で真に良いものを選べる気もしません。

誰が言及していたのか全く記憶から消えてしまいましたが、ディジタル回路とVerilog入門というチュートリアルを読みました。 Verilogについて納得が行くまで解説がされている感じはしなくて、ちょっと悩んでしまう気がしましたが、おもしろいチュートリアルだと思います。 その中で、秋月電子通商で売られているSipeed製のTang Nano 9Kという基板が紹介されていました。 これには、中国のGowin Semiconductor製のFPGAが搭載されています。 記事中の2,500円という価格よりは値上げされて、2,710円 (消費税込みで2,980円)になっていましたが、3,000円せずに購入できるのは、最初の一歩としては手軽です。

Gowin Semiconductor社は、Gowin EDAという開発環境を提供しています。WindowsとLinuxで利用できるようです。 Apply LicenseのページからWindows用のGowin EDAのライセンスを申請すると、5分もせずにライセンスファイルが返送されて来ました。 ですが、まだインストールしていません。 近々試してみないといけません。

一方で、ウェブ検索をすると、Tang Nano 9KはYosys等のオープンソースなツールのみで扱うことも可能なようです。 と言うことで、NetBSD/amd64 11.99.4のみでTang Nano 9Kをプログラムしてみました。

必要なソフトウェアを用意する

Verilogを勉強するには、非常に小規模なロジック以外に書いたことがありませんので、Icarus Verilogを使って来ました。 ですが、これは単なるシミュレーターなので、ハードウェアに書き込むのには使えません。 FPGAで自分が書いたロジックを動かすには、シミュレーターで正常に動くはずであることを確認し、合成して、配置と配線をして、FPGAが読み込めるデータに変換し、書き込む(プログラムする)という流れが必要なはずです。

Gowin製のFPGAの場合、オープンソースなツールとしては、合成はYosysで、配置と配線はnextpnrで、データ(ビットストリームと呼ばれている)への変換はapycula、プログラムするのはopenFPGALoaderを使えば良いようです。

ちょうどpkgsrc-2025Q4のフリーズが終わったので、ちゃんとアップデートやインポートをしないといけませんが、それはこの記事を書いた後にすることにして、必要なツールは以下のようにインストールすれば良いでしょう。 pkgsrc/devel/openFPGALoaderはpkgsrc/devel/libftdi1を使いますが、libftdi1はpkgsrc/devel/swig4がインストールされていると、swig3がインストールされていてもswig4を使ってしまい、ビルドすることができません。 ですので、まずはswig4は削除しておく必要があります。 swig4は基本的には何かのFull dependencyになっていることはなさそうですから、問題にはならないはずと思います。

# pkg_delete swig4
# cd /usr/pkgsrc/devel/yosys
# make install
# cd /usr/pkgsrc/devel/nextpnr-himbaechel
# make install
# cd /usr/pkgsrc/devel/py-apycula
# make install
# cd /usr/pkgsrc/devel/openFPGALoader
# make install

一方で、自分の書いたVerilogのコードをプログラムしても、ちゃんと動かない場合に、これらのツールが動いているか否かの動作確認ができる気がしません。 github.com/lushaylabs/tangnano9k-series-examplesにある、counterというプロジェクトを利用して動作確認することにします。 ただ、現状では古いツールチェイン用の記述になっていますし、pkgsrcのやり方には沿っていないので、私がforkして修正点を反映させたものを今回は利用します。 以下のように、手元に取得しておきます。

$ git clone git@github.com:ryoon/tangnano9k-series-examples.git
$ cd tangnano9k-series-examples
$ git pull origin newer-toolchain-pkgsrc
$ git switch newer-toolchain-pkgsrc

実際に合成からプログラムまでを実行してみる

counter/Makefileに実行すべきコマンドは既に記載されています。 まずはTang Nano 9KをNetBSDマシンに接続してみます。 Tang Nano 9KにはUSB A to USB Type-Cケーブルが付属していますが、手元に出してあったいつも使っているケーブルを利用しました。 dmesgは以下のようです。 普通にugen(4)として認識されている状態です。

ugenif0 at uhub1 port 2 configuration 1 interface 0
ugenif0: SIPEED (0x0403) JTAG Debugger (0x6010), rev 2.00/5.00, addr 2
ugenif1 at uhub1 port 2 configuration 1 interface 1
ugenif1: SIPEED (0x0403) JTAG Debugger (0x6010), rev 2.00/5.00, addr 2

/dev/ugen0.*/dev/ugen1.*はrootユーザーしか読み書きできないので、私のユーザーはwheelグループに所属していますので、以下のようにパーミッションを変更しておきます。

# chmod 660 /dev/ugen0.*
# chmod 660 /dev/ugen1.*

と言うことで、まずは実行してみましょう。 以下のように実行すれば、FPGAのプログラムまで完了します。 CRC Check: Successになれば正常終了しているはずです。

$ make load
(snip)
openFPGALoader -b tangnano9k counter.fs -f
empty
write to flash
Jtag frequency : requested 6.00MHz   -> real 6.00MHz
Parse file Parse counter.fs:
Done
DONE
Jtag frequency : requested 2.50MHz   -> real 2.00MHz
Erase SRAM DONE
Erase FLASH DONE
Erasing FLASH: [==================================================] 100.00%
Done
write Flash: [==================================================] 100.00%
Done
CRC check: Success

正常終了すると、以下の写真のようにTang Nano 9K内蔵のLEDが橙色に点滅します。

Tang Nano 9Kには、LUTはLUT4ということで、4入力で1出力なのでしょうか。 また9Kということで、LUTは8640個あるそうです。 パッケージにはEntry-Level FPGA Kit For RISC-Vと書かれていますが、NetBSDが動くようなRISC-V環境が作れる訳ではない仕様な気がします。 でも、自分で書いたHDLのコードが、シミュレーションではなく実際のFPGAで動かせるというのは、学習を一歩先に進めるのには役立ちそうです。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。

NetBSDでFPAG開発を始めてみる

この記事は、 NetBSD Advent Calendar 2025 の21日目の記事です。 はじめに Verilogや他のHDL (Hardware Description Language; ハードウェア記述言語)を勉強して来ましたが、シミュレーションだけ...