Tang Nano 20KでLチカをやってみる

とりあえず始めてみる

 FPGAってなにができるの?そもそも何から始めればいいの??と矢継ぎ早に生まれる疑問はそのままに、とりあえずLEDを点滅させるところから始めてみる。
Tang Nano20kは元々書き込まれた命令に従ってか、MacBookと接続するとシーケンシャルウィンカーのようにLEDを光らせている。

[tang nano 9k その1] 公式チュートリアルにLチカさせてもらった
https://qiita.com/haihuiliyuyuan/items/b6c89b5295411b5ed70d

Tang nano 9Kを使いたい(1)
https://zenn.dev/nihinihikun/articles/87066301959b48

Tang Nano 20K Blink led
https://wiki.sipeed.com/hardware/en/tang/tang-nano-20k/example/led.html

習うより慣れろの精神で、とりあえず参考ページの内容をそのままコピペしてみる。(haihuiliyuyuanさん、ありがとうございます!!)

module led(
    input sys_clk,          // clk input
    input sys_rst_n,        // reset input
    output reg [5:0] led    //6 LEDs Pin
);

reg [23:0] counter;

always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        counter <= 24'd0;
    else if (counter < 24'd1349_9999)
        counter <= counter + 1'b1;
    else
        counter <= 24'd0;
end
always @(posedge sys_clk or negedge sys_rst_n) begin // Toggle LED
    if (!sys_rst_n)
        led <= 6'b111110;
    else if (counter == 24'd1349_9999)       // 0.5s delay
        led[5:0] <= {led[4:0], led[5]};                         // ToggleLED
    else
        led <= led;
end

endmodule

Gowinの実行結果ウィンドウ(コンソール画面)には赤文字表記がずらずら現れる…。何これ??

ERROR  (CT1136) : Bank 6 vccio(3.3) is locked by other constraint or embedded port, conflicting BANK_VCCIO set by 'led_5_obuf' : IO_TYPE = LVCMOS18 in the same bank
ERROR  (CT1136) : Bank 6 vccio(3.3) is locked by other constraint or embedded port, conflicting BANK_VCCIO set by 'led_4_obuf' : IO_TYPE = LVCMOS18 in the same bank
ERROR  (CT1136) : Bank 6 vccio(3.3) is locked by other constraint or embedded port, conflicting BANK_VCCIO set by 'led_3_obuf' : IO_TYPE = LVCMOS18 in the same bank
ERROR  (CT1136) : Bank 6 vccio(3.3) is locked by other constraint or embedded port, conflicting BANK_VCCIO set by 'led_2_obuf' : IO_TYPE = LVCMOS18 in the same bank
ERROR  (CT1136) : Bank 6 vccio(3.3) is locked by other constraint or embedded port, conflicting BANK_VCCIO set by 'led_1_obuf' : IO_TYPE = LVCMOS18 in the same bank
ERROR  (CT1136) : Bank 6 vccio(3.3) is locked by other constraint or embedded port, conflicting BANK_VCCIO set by 'led_0_obuf' : IO_TYPE = LVCMOS18 in the same bank
ERROR  (CT1136) : Bank 3 vccio(3.3) is locked by other constraint or embedded port, conflicting BANK_VCCIO set by 'sys_rst_n_ibuf' : IO_TYPE = LVCMOS18 in the same bank
ERROR  (CT1136) : Bank 7 vccio(3.3) is locked by other constraint or embedded port, conflicting BANK_VCCIO set by 'sys_clk_ibuf' : IO_TYPE = LVCMOS18 in the same bank
Physical Constraint parsed completed with errors

元々基板上に乗ってるLEDの電圧は3.3Vのところ、自分で定義した電圧が1.8Vだったために生じたらしい。
要はデフォルトのままだったので修正が必要。

LEDのIO TypeをLVCMOS18からLVCMOS33へ変更してみる。今度はLED絡みのエラー表示が消えてくれた。
今度はうまくいきそう。
残すはsys_rst_nとsys_clkのみである。これらも同じように3.3Vへ変更してみる。
今度は今までと違うエラーメッセージが表示された。ピン間違えをしているみたいである。

ERROR  (PR2028) : The constrained location is useless in current package
ERROR  (PR2017) : 'sys_rst_n' cannot be placed according to constraint, for the location is a dedicated pin (SSPI)
Screenshot

なるほど。参照していたページではTang Nano 9Kをテーマとする記事だったので、そのまま踏襲したせいでエラーが生じていたみたい。
回路図中の割り当てピンを確認するとクロックの入力(sys_clk)は4番であった。
また基板上のタクトスイッチを使ってみようと思い、リセットの入力(sys_rst_n)は87番とした。
改めてPlace&Routeをダブルクリックすると、今度は赤いエラーが消えてくれた。

ボードに書き込んでみる

Double click Program Device to run the Programmer program、とあるので沿って進めてみる。

Screenshot

とりあえずPC側とTangNanoは繋がっているみたいだ。何も触らず、Saveボタンを押して先に進めてみる。
なお、Operationの項目については公式Wikiで下記のように書いてある。
よくわからないだけに、変に保存されて再起不能になるのだけは避けたいので、デフォルトのSRAM Program(電源切ったら書き込んだデータ消える)を選んでおく。

5.2. Burn to SRAM#
Normally this mode is used to verify biststream.

Because of its fast burning characteristics so the use of more, but of course the power will lose data, so if you want to power on the running program you can’t choose this mode.

Click the function box below Operation to open the device configuration interface, then select the SRAM Mode option in Access Mode to set to download to SRAM, and finally click the three dots box below to select our generated .fs bitstream file . Generally speaking, bitstream firmware file is in the impl -> pnr directory.
https://wiki.sipeed.com/hardware/en/tang/tang-nano-20k/example/led.html

書き込み実行すると、LEDの一つが点灯するようになった。
S2を長押ししてみると1つだけしか点灯していなかったLEDが続々と点灯するようになった。スイッチから指を離すと初期位置から点灯し始める。

おお…多分参考にしたプログラムは走ってぽいぞ?

Gowin EDA用のライセンスサーバ(サービス)を立てる

ことの始まり

FPGAを触りたくなったので開発環境のための準備(根っこの構築?)を行った。


勉強用のFPGA評価ボードはGowin社製Tang nano 20k。開発環境ソフトGowin EDAのライセンスはノードロック式かフローティング方式のいずれかで認証が都度必要になるという。自分の場合はどのOS環境および端末で読み書きするかはその時次第なので、認証はフローティングライセンス方式を選んでおくことにした。

我が家ではiKOOLCOREのR1Pro(の革を被ったR1)が常時起動していて、仮想基盤管理ソフトのproxmoxが走ってるので仮想マシンやLXCコンテナは自由に作成できる。そこでライセンス管理およびその発行は専用のLXCを一つ作ってその中で行うことにした。
OSはDebian 13、CPUコア1つ、メモリ50MB、ストレージは10GB程度の仕様とした。
ストレージは5GBもあれば十分かもしれない。シンプロビジョニングだから常時確保されるわけもないしでまあいいや。

ikoolcore R1

このページでは何かの拍子に環境をリセットしてしまったときのための備忘録として残すことにした。
ライセンスマネージャのインストールから始めて、システム起動後の自動化までを書き残す。


環境構築

ライセンスマネージャのダウンロード

ライセンスマネージャのダウンロードではcurlを使いたいところ。あいにくこのコンテナには最小限の機能しかない。そこでcurlの導入から始める。

# apt install curl -y

落としてきたライセンスマネージャは/opt配下に展開して使うことにする。なお、ダウンロードページはメンバー登録完了後でないとみれない。
curlでの-LO以下はプログラムの配布ページにあるURLを入力する。ダウンロードページからxxxx.gzのリンク先を得るはず。ちなみにフローティングライセンスの申請も同じタイミングで済ませておいた。発行依頼をかけてから2日程度で届いた。一悶着あったけど。

# cd /opt
# curl -LO "https://www.gowinsemi.com/~~~~.gz"

tar -xzfでもって、gzipで圧縮されたtarファイルの解凍。
-xはアーカイブの展開、-zはgzip圧縮の解凍、-fでファイル名指定。まとめた引数-xzfで解凍する。

# tar -xzf ~~~~~.gz
# ls
~~~~~.gz  Gowin_LicenseServer_V2.2_linux

解凍するとGowin_LicenseServer_V2.2_linuxが出てくる。長い。冗長なのでリネームしておく。

# mv Gowin_LicenseServer_V2.2_linux gowin-license

ディレクトリ構成はgowin-license配下にIDEProgrammerがあって、ライセンスマネージャはbinの中にいる。license_serverがそれ。

/opt/gowin-license/bin# ls -l
total 58304
-rwxr-xr-x 1 626 1707      764 Oct 16  2025 gowin_E_xxxxx.lic
-rwxr-xr-x 1 626 1707  7070064 Oct 16  2025 libQt5Core.so.5
-rwxr-xr-x 1 626 1707  8775264 Oct 16  2025 libQt5Gui.so.5
-rwxr-xr-x 1 626 1707  2218784 Oct 16  2025 libQt5Network.so.5
-rwxr-xr-x 1 626 1707  8100680 Oct 16  2025 libQt5Widgets.so.5
-rwxr-xr-x 1 626 1707  2521224 Oct 16  2025 libcrypto.so.10
-rwxr-xr-x 1 626 1707   320720 Oct 16  2025 libgssapi_krb5.so.2
-rwxr-xr-x 1 626 1707 25048256 Oct 16  2025 libicudata.so.56
-rwxr-xr-x 1 626 1707  3368288 Oct 16  2025 libicui18n.so.56
-rwxr-xr-x 1 626 1707  2069136 Oct 16  2025 libicuuc.so.56
-rwxr-xr-x 1 626 1707   180496 Oct 16  2025 license_server

ライブラリ不足の解消

さっそくlicense_serverを起動してみるとエラーがでてきた。どうやら稼働に必要なライブラリが不足しているみたい。

/opt/gowin-license/bin# ./license_server --help
./license_server: error while loading shared libraries: libGL.so.1:cannot open shared object file:No such file ordirectory

不足するライブラリをlddで確認したところ、3つばかり足りない。パッケージ名指定で追加インストールする。

opt/gowin-license/bin# ldd ./license_server
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        libGL.so.1 => not found
        libgthread-2.0.so.0 => not found
        libglib-2.0.so.0 => not found
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
opt/gowin-license/bin# apt install -y libgl1 libglib2.0-0

不足するライブラリはないか改めて確認しておく。
not foundと表示されなければ、とりあえずlicense_serverは起動できるようになる。

/opt/gowin-license/bin# ldd ./license_server | grep "not found"

ライセンスファイルをコンテナ内に移動する

申請していたライセンスファイルをRloginなどでホストからゲスト(LXC内)へ移動させる。
今回はホストroot直下へ転送したライセンスファイルをLXC(ホストID:104)へ移動するとともにgowin.licへリネームしておく。

# pct push 104 /root/gowin_xxxx_floating.lic /opt/gowin-license/bin/gowin.lic

ライセンスマネージャの起動可否を確認する

とりあえずLXC内のライセンスマネージャを起動してみる。うまくいけば下記の表示になる。

/opt/Gowin_LicenseServer_V2.2_linux/bin# ./license_server
yyyy-mm-dd hh:mm:ss.sss >
    Server started.
    Local Address: ipadress
    Local Host Name: hogehoge
    Listening Port: xxxx
    License Count: z

今回はここでトラブル発生。たとえば私の場合はERROR: License mode not match.なんてメッセージが出てきてしまった。
発行ライセンスにまさかの誤りがあったのである…っ!!
フローティングライセンスを申請したはずが、なぜかノードロックライセンスが届くという…。
あらためてライセンスを要求すると今度はきちんとしたものが届いた。なぜか数量が二桁に化けて(・∀・;)

ライセンスがうまく認識された後、ctrl+zキーで一時停止。プログラムは通信ポートを使いぱなしなのでプロセスをkillしておく。
無事に動作しているようなら次にコンテナ起動、ライセンスプログラムも起動するような設定を作る。

/opt/gowin-license/bin# jobs -l
[1]+  aaaa Stopped                 ./license_server
/opt/gowin-license/bin# kill -9 aaaa

systemdでライセンスマネージャをサービス化する

ライセンスマネージャはLXCの起動とともにも自動的に立ち上がるようにしておきたいので、systemdでサービス化する。サービス名はgowin-licenseとかにしておく

# vi /etc/systemd/system/gowin-license.service

作成したサービスの設定は下記のようにしてみた。

## gowin-license.serviceの中身
[Unit]
# サービスの説明
Description=Gowin License Server
# ネットワーク系のサービス初期化後、利用可能になったタイミングで起動させる
After=network.target

[Service]
# サービスが単一のプロセスを持つ単純なタスクなので
Type=simple
# ワーキングディレクトリの指定
WorkingDirectory=/opt/gowin-license/bin
# 起動する実行ファイル
ExecStart=/opt/gowin-license/license_server
# 異常終了したら、自動的に再起動かける
Restart=on-failure
# なお、異常終了してから5秒待って再起動します。
RestartSec=5

[Install]
# Linuxが通常のマルチユーザーモードで起動したらこのサービスも起動させる。
WantedBy=multi-user.target

ここまでの設定でLXC起動→systemd起動→multi-user.target到達→gowin-license.service起動となる。
あとはサービス実行のためデーモン設定のリロードとつくったばかりのサービスを有効化する。
ついでに状態も見ておく。

# systemctl daemon-reload
# systemctl enable gowin-license
# systemctl status gowin-license
* gowin-license.service
     Loaded: loaded (/etc/systemd/system/gowin-license.service; enabled; preset: enabled)
     Active: active (running) since Mon 2026-07-27 14:31:00 UTC; 273ms ago
 Invocation: xxxx
   Main PID: 1515 (license_server)
      Tasks: 1 (limit: 16707)
     Memory: 2M (peak: 2M)
        CPU: 16ms
     CGroup: /system.slice/gowin-license.service
             `-1515 /opt/gowin-license/bin/license_server
             

問題があるとすればタイムゾーンがUTCなのでJSTに変更しておくくらいか。

クライアント側でIDEの起動確認を行う。

動作チェックとしてwindowsとlinuxの入った端末それぞれで検証してみる。
IPアドレスと通信ポート番号(license_serverの起動時にListening Portの記述あり)

クライアントとサーバ間の通信は問題なさそう。


Disk2vhdでイメージ化したけど起動しない

故人のPC本体は捨てたいけど中身はそのまま手元に置いておきたいという状態。ディスクをまるまるイメージ化してHyper-Vで起動できるようにした。

使用するソフトはDisk2vhd。ディスクイメージはVHDXフォーマットへ出力して適当なディレクトリに保存する
OSはWindows7だったのでHyper-Vの仮想マシン世代は第一世代を選択。イメージ本体はIDEコントローラ傘下にする。(SCSIにするとBOOT FAILURE. REBOOT AND SELECT PROPER BOOT DEVICE OR INSERT BOOT MEDIA~~~みたいなメッセージが起動時表示されるだけ)

ディスク修復の処理がかかったけど、これで起動した。

GT710環境下でproxmoxのインストールに失敗する

具体的にはproxmoxのインストール中の下記画面で止まる。これはGT710用のドライバが見当たらないためで、kernel mode setting(KMS)を無効にすれば先に進む。

Welcome to the Proxmox 9.0 ~
initial ~
mouting proc file system
mouting sts file system
FEI boot ~
boot comandline: 
laoding drivers: nvidiafb ahci ~~~~~intel_rapl_common amd_atl fmpm

PVEのインストール画面にて、”Install Proxmox VE (xxxx)”で”e”キーを押して入力編集モードへ。linux行の末尾に”nomodeset”を入力して ctrl + xを押す。

linux /boot/vmlinuz ~~ ...plash-silent nomodeset

lost+foundを非表示にした

proxmoxでturnkeylinuxのfile serverを使っている。ぽちぽち押すだけで済むだけ何かと楽(セキュリティ的に楽とは言ってない)
さっそく使い始めるとエクスプローラ上で表示されるlost+foundが邪魔なので非表示化した。/etc/samba/smb.confのglobal設定に以下を記述

[global]
hide dot files = yes
veto files = /lost+found/
delete veto files = yes
hide files = /lost+found/

veto files = /lost+found/ :lost+found を Windows から完全に隠す
delete veto files = yes : ユーザーが削除を試みてもエラーにする
hide files = /lost+found/ : lost+found を隠す(念押し