Tang Primer FPGA ボード & RISC-V | たけおか ぼちぼち日記

たけおか ぼちぼち日記

思いついたらメモ

Tang Primer FPGA ボードが安い。
中華FPGAだが、悪くない。
RISC-V のソフトコアが入る。
ボードのドキュメント(英語)
ボードに載っているFPGA は Anlogic社の EG4S20というチップ。純粋 中華製らしい。FPGAならバックドアの心配は少ないだろう。(開発環境は、バックドアに注意する)



秋月電子などで安定して買える。
秋月 Sipeed Tang Primer FPGA Dev. ボードSwitch ScienceShige Zone
(私は、このボード1枚とJTAG 冶具は、Seeedstudio.comから 買いました)
なお、FPGAの開発を行うだけならば、JTAG 冶具は不要。

Sipeed は、中華 深セン系のチップを使用したボードをたくさん出している。そして、どれも安い。
このFPGAボードも悪いところは無い。

ここでは、Ubuntu 18.04.4 LTS での開発について述べる。




ボードを購入すると、RISC-V コアが焼かれていて、RISC-Vマイコンとして使用することもできる。
焼かれているのは、Humming bird, e-203コア。
また、FlashROMには、RISC-VでLEDを白でチカチカさせるプログラムが焼かれている。

このHumming bird, e-203コアだと、SiFive の開発環境などを、だいたい流用できる。

Humming bird core解説

RISC-V e-203 CPUのソフトウェア開発は、下記のツール・チェーン(バイナリ)をget&展開すれば、gcc, as, ld, gdb, objdumpなど使える。
RISC-V 32bit 開発環境

開発環境を展開した
sirv-e-sdk/
にて
$ make software PROGRAM=demo_gpio BOARD=sirv-e203-lichee
とすれば、
sirv-e-sdk/software/demo_gpio/
が、makeされ、RISC-V 実行バイナリが
sirv-e-sdk/software/demo_gpio/demo_gpio
としてできる。
これを、FlashROMに焼けば、Hummingbird e-203コアで実行できる。



FlashROMにRISC-Vアプリケーションを書き込むには、Sipeed JTAG(治具)ハードウェアが必要。

DigiKey
RobotShop
などで購入可能。

このJTAG治具は、FTDI 2232Hが入っているだけで、OpenOCDではフツーの構成。ST32やARMなどにも使用できるメジャー系。



e-203が入っている本ボードとの接続は表のとおり。
Tang PrimerRV Debugger
U0_RX (Pin H13) TX
U0_TX (Pin J13)RX
E_TMS (Pin C9)TMS
E_TDI (Pin B6)TDI
E_TCK (Pin C5)TCK
E_TDO (Pin A4)TDO
GND (Pin G)GND


ただし、本ボード用としてリリースされているOpenOCDそのままでは、コンパイル&リンクの終わったRISC-Vの実行バイナリをFlash ROMに書くことができない。
本ボード用としてリリースされているOpenOCDが、本ボードのFlashROMに対応していないのであった(涙)。

あたくしは、脳みそを使わず、悩んだフリをしていたが…

解決法を、教えてくれているWebページを発見した。
@Nanchite4618 さんの、
「TangPrimer(RISC-V)をArduinoIDEで開発する」というページである。

たいへん、感謝しております。

LicheeTang_openocdをダウンロード&展開し、次のパッチをあてる。
---

*** LicheeTang_openocd/src/flash/nor/spi.c.org 2020-04-04 15:53:17.000000000 +0900
--- LicheeTang_openocd/src/flash/nor/spi.c 2020-06-26 05:46:31.686017310 +0900
***************
*** 83,87 ****
--- 83,88 ----
FLASH_ID("gd gd25q16c", 0xd8, 0xc7, 0x001540c8, 0x100, 0x10000, 0x200000),
FLASH_ID("gd gd25q32c", 0xd8, 0xc7, 0x001640c8, 0x100, 0x10000, 0x400000),
FLASH_ID("gd gd25q128c", 0xd8, 0xc7, 0x001840c8, 0x100, 0x10000, 0x1000000),
+ FLASH_ID("xtx xt25f08", 0xd8, 0xc7, 0x0014400b, 0x100, 0x10000, 0x100000),
FLASH_ID(NULL, 0, 0, 0, 0, 0, 0)
};
---

その後、
$ cd LicheeTang_openocd/
$ ./configure
$ make
で、OpenOCDができる。
新しい OpenOCD一式は、
sirv-e-sdk/work/build/openocd/prefix/bin/
にコピーする。

FTDI 2232HをUbuntuに認識させるために、
/etc/udev/rules.d/45-dt2232.rules ぐらいとして
--
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", TAG+="uaccess", TAG+="udev-acl"
--

を書いて、
$ sudo service udev restart
とする。

FlashROMの焼き込みは
sirv-e-sdk/

$ make upload PROGRAM=demo_gpio BOARD=sirv-e203-lichee
する。


JTAG対応のRISC-V コアが無いと、FlashROMの書き直しができない。
万一、RISC-Vコアを消してしまった場合は、
このバイナリhttps://dl.sipeed.com/TANG/Primer/SDK/LicheeTangNewIoMap_BitStream.bit をFPGAに焼き直すべし。



FPGAであるから、論理回路を開発したい。

(※ このあたり、2023/MAR/07更新)
FPGAの開発環境は、https://dl.sipeed.com/shareURL/TANG/Premier/IDE
に行き、
TD_5.0.3_28716_NL_Linux.zip
Anlogic_20230606.lic
の2つをダウンロードする。

(昔(2020/JUNの頃)は、これだった
https://dl.sipeed.com/TANG/Primer/IDE/TD1909_linux.rar 。)

展開したあと、さきほどダウンロードした Anlogic_20230606.lic を、
TD_5.0.3_28716_NL/license/Anlogic.lic
として置く。

その後、 TD_5.0.3_28716_NL/bin/ に コマンド・サーチ・パスを通して…
$ td -gui
とやれば、GUIで開発環境が起動。

FPGAの例題は、
https://github.com/Lichee-Pi/Tang_FPGA_Examples からget

FPGA開発は、ボード上のUSBポートと Ubunu マシンをUSBケーブルでつなぐだけ。(FTDIの JTAG治具は不要)

FPGAボードをUbuntuに認識させるために、
/etc/udev/rules.d/91-anlogic-jtag.rules ぐらいとして
--
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0547", ATTRS{idProduct}=="1002", GROUP="plugdev", MODE="0660"
--

を書く。

Humming bird e-203コアの FPGA ソース
は、問題なくシンセサイズできて、FPGAに流し込んで実行できる。
RISC-Vコアはすんなりと動いて、たいへん ありがたい。


ただし、OpenOCD JTAG でFlashROMを焼くためには、下記のパッチをあてる必要あり。
--

*** Tang_E203_Mini-master/project/e203egmini_new.sdc.org 2019-07-10 19:34:04.000000000 +0900
--- Tang_E203_Mini-master/project/e203egmini_new.sdc 2020-06-27 03:34:35.549449857 +0900
***************
*** 6,12 ****
#create_clock -name CLK25MHZ -period 40 -period 40 -waveform {0 20} [get_ports {CLK25MHZ}]

create_clock -name clk_8388 -period 119.218 [get_nets {clk_8388}]
! create_clock -name clk_16M -period 62.5 [get_nets {CLKIN}]

create_generated_clock -name slowclk -source [get_nets {clk_8388}] -master_clock clk_8388 -divide_by 256 [get_nets {slowclk}]
set_false_path -from [get_clocks "clk_16M"] -to [get_clocks "slowclk"]
--- 6,13 ----
#create_clock -name CLK25MHZ -period 40 -period 40 -waveform {0 20} [get_ports {CLK25MHZ}]

create_clock -name clk_8388 -period 119.218 [get_nets {clk_8388}]
! #create_clock -name clk_16M -period 62.5 [get_nets {CLKIN}]
! create_clock -name clk_16M -period 62.5 [get_nets {clk_16M}]

create_generated_clock -name slowclk -source [get_nets {clk_8388}] -master_clock clk_8388 -divide_by 256 [get_nets {slowclk}]
set_false_path -from [get_clocks "clk_16M"] -to [get_clocks "slowclk"]
--



他のHumming bird e-20xコアの FPGA ソース