FPGA開発をしたくなったので、以前買ってあった Tang Primer用の環境をセットアップします。
公式サイトはこちらのようです。
セッティングにあたっては以下のサイトを参考にさせていただきました。
http://galaxystar.image.coocan.jp/tangprimer.htm
IDEをインストールと起動
https://tang.sipeed.com/en/getting-started/requirements/ にリンクがあるので、そこから下の方にあるURLからIDEをダウンロードします。
今回は、TD1909_linux.rarをダウンロードしてみました。(もっと新しい日付のものはRHEL用っぽいので)
https://tang.sipeed.com/en/getting-started/installing-td-ide/linux/ のページの記述を参考にインストールしますが、いろいろ違います。
~/ダウンロード$ sudo unrar x TD1909_linux.rar -d /opt/
~/ダウンロード$ sudo ln -s /opt/TD_RELEASE_September2019_r4.6.2/bin/td /usr/bin/td
~/ダウンロード$ sudo chmod a+x /opt/TD_RELEASE_September2019_r4.6.2/bin/td
~/ダウンロード$ td -gui
実際に起動するにはFPGAのデバイス情報を /usr/arch で参照できないといけないようです。
$ sudo ln -s /opt/TD_RELEASE_September2019_r4.6.2/arch /usr/arch
また、ライセンスファイルが必要なようで、 https://dl.sipeed.com/shareURL/TANG/Premier/IDE から最新のライセンスファイル(Anlogic_*.lic)をダウンロードしてきて、 /usr/license の下に Anlogic.lic のファイル名で配置します。
$ cd /usr
$ mkdir license
$ sudo mkdir license
$ cd license/
$ sudo cp ~/ダウンロード/Anlogic_20220130.lic Anlogic.lic
これでIDEが起動できました。
実際には、https://dl.sipeed.com/shareURL/TANG/Premier/IDE により新しいバージョンがあるようなので、そちらを試したほうがいいかもしれません。
USBドライバをインストール
https://tang.sipeed.com/en/getting-started/installing-usb-driver/linux/ のページに沿ってドライバをインストールします。
Tang Nano PrimerをPCに接続して、lsusbで VID:PID = 0547:1002 を認識しているか確認します。
$ lsusb
Bus 001 Device 003: ID 0547:1002 Anchor Chips, Inc. Python2 WDM Encoder
USB3.0のHUB経由では認識せず、PCのポート直結、もしくはUSB2.0のHUB経由でなければ認識されませんでした。(PCのUSB3.0のポート直結なら認識するのかは試していません)
記述の通りにudevルールを作成します。
$ ls -la /etc/udev/rules.d/91-anlogic-jtag.rules
-rw-r--r-- 1 root root 108 6月 20 08:31 /etc/udev/rules.d/91-anlogic-jtag.rules
$ cat /etc/udev/rules.d/91-anlogic-jtag.rules
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0547", ATTRS{idProduct}=="1002", \
GROUP="plugdev", \
MODE="0660"
$ sudo service udev restart
次に、正しく認識しているかを確認しますが、自分の環境では一度再起動しないとだめでした。(ログアウト→ログインでも大丈夫かは試していません)
$ td -gui
として、IDEを起動します。起動したら、赤で囲った Download ボタンをクリックすると、Downloadウインドウが開くことを確認します。
ドキュメントでは、「未知のバグによりJTAGは400kbpsかそれ以下でないと動作しない」とのことです。
サンプルの合成
https://tang.sipeed.com/en/getting-started/getting-to-blinky/ に沿ってサンプル blinky を動かしてみます。
gitをインストールした上で、githubからサンプルをダウンロードしてきて、IDEを起動します。
~$ mkdir TangPrimer
~$ cd TangPrimer/
~/TangPrimer$ sudo apt install git
~/TangPrimer$ git clone --recursive https://github.com/Lichee-Pi/Tang_FPGA_Examples
~/TangPrimer$ td -gui
Project -> Open Project で ~/TangPrimer/Tang_FPGA_Examples/0.LED/prj の下の led.al を開きます。Process -> Run またはメニューボタンの中の Run をクリックすると、論理合成とフィッティングが行われて led.bit が生成されます。
サンプルのテストと改造
Tool -> Download またはメニューボタンの中の Download をクリックして、Downloadウインドウを開きます。「Add」アイコンをクリックして、生成した led.bit を選択します。Mode SelectionがJTAGになっていると、直接FPGAに書き込みに行くので、電源再投入で消えるとのことです。(http://galaxystar.image.coocan.jp/tangprimer.htm の記載による)
Speedを3Mbpsにして、Runボタンをクリックすると書き込みが行われます。書き込みが終わると動作を開始しますが、ユーザー回路へのリセットがかからないので、「USER」ボタンを押してユーザー回路へのリセットをかけてやる必要があります。以下のように書き換えて動作させようとしたものの思ったとおりに動作せず、少々悩みました。
①led.v
/* デバイスは EG4::EG4S20BG256 */
module led
(
input wire CLK_IN,
input wire RST_N,
output wire [2:0]RGB_LED
);
parameter time1 = 25'd12000000;//クロック周波数 24Mhz
reg [2:0]rledout;
reg [24:0] count;
initial
begin
count=25'b0;
rledout=3'b110;
end
always @(posedge CLK_IN)begin
if(RST_N==0)begin
count <= 25'b0;
rledout <= 3'b110;
end
if(count == time1)
begin
count<= 25'd0;
rledout <= {rledout[1:0],rledout[2]};
end
else
count <= count + 1'b1;
end
assign RGB_LED = rledout;
endmodule
②制約ファイル io.adc
set_pin_assignment {CLK_IN} { LOCATION = K14; } ##24MHZ
set_pin_assignment {RST_N} { LOCATION = K16; } ##USER_KEY
## RGB LEDs, 3 pins
set_pin_assignment {RGB_LED[0]} { LOCATION = R3; } ##LED_R, R3
set_pin_assignment {RGB_LED[1]} { LOCATION = J14; } ##LED_G, J14
set_pin_assignment {RGB_LED[2]} { LOCATION = P13; } ##LED_B, P13