[電子工作]Tang Primer:中国製FPGAでプロセッサの設計に挑戦ーーーー目次ーーーー
RISC-V互換 32bit/64bitプロセッサの設計に挑戦 ーーーーーーーーーー 1.Tang Primerとは?中国のANLOGIC社のFPGA EG4S20を搭載し、Sipeed社が開発したボードがTang Primerです。 まず、EG4S20の主な仕様は次の通りです。
LUTs:19,600(LUT4/LUT5) FFs:19,600 BRAM:136KB (9kbit×64個、32kbit×16個、最大250MHz) DSPs:29(18x18、最大250MHz) PLL:4 global clock:16 IO:193(LVDS:90pair、最大800MHz) SDRAM:2M×32bit(最大200MHz) ADC:12bit×8ch(最大1Msps、変換器は1個でセレクタにてchを選択)
回路規模は最大20万ゲート程度、動作速度は最大250MHz、最大800Mbpsの高速差動I/Fを持つので、 結構、用途は広いと思います。特に、64MbitのSDRAMを内蔵し、FHD(1920x1080)の画像も格納 できるのが、ポイント高いかと思います。但し、DSPが少ないので、複雑な画像処理はできません。 ボードの特徴は次のとおりです。 ・microSDカードスロット、RGB LED、40pin LCDコネクタ、24pin カメラコネクタを搭載。 ・USBのJTAGチップを搭載。(但し、FPGAの書き込み専用で、RISC-Vのデバッグには使えません) ・Config用のQSPIフラッシュと、汎用のQSPIフラッシュ(16Mbit)を搭載。 ディフォルトで、RISC-V(RV32IMAC)の回路が書き込まれています。フラッシュメモリにプログラムを 格納できます。但し、16MHz動作で、メモリもSRAMのみで、SDRAMは使えません。 という訳で、本ボードは、FPGAで簡単な回路の動作検証を行いたい方、RISC-Vのハード/ソフトの 研究・評価・検証(!)を行いたい方に、お薦めします。 なお、単にRISC-Vを使って高速処理を行いたいのであれば、絶対にMaix BitなどK210を使用した ボードをお薦めします。CPUは64bit、400MHz、デュアルコア、浮動小数点演算器を持ち、8MBのRAMや 各種アクセラレータを内蔵し、各種I/Fも高速で動作しますので、処理能力は桁違いです。 ちなみに、私は自作16bitマイコン、RISC-V、各種画像処理IPなどの設計・開発を行っていますので、 自宅でFPGAが使えると助かります。
2.各種ツールのインストール(1)FPGA開発ツールTang Dynasty IDEのインストール Tang Primerの説明にインストール方法が書かれていますが、そのままではインストールできなかった ので、下記に記載しておきます。 <Linux(私はubuntu18.04)へのインストール> 1. https://dl.sipeed.com/TANG/Primer/IDEから「TD_RELEASE_???_RHEL.zip」をダウンロード。 参考.ANLOGIC社のHPから最新版もダウンロード可能ですが、現状、Ver.4.6.5が最も安定してます。 https://dl.sipeed.com/TANG/Premier/IDEから最新の「Anlogic_???.lic」をダウンロード。 (どちらかに統一して欲しい...) 2. 開発ソフトを展開し、実行ファイルを準備。 >>unzip TD_RELEASE_???_RHEL.zip >>sudo mv TD_??? /opt/ >>cd /opt/TD_???/bin >>sudo chmod u+x td >>sudo ln -s /opt/TD_???/bin/td /usr/bin/td 3. FPGAのデバイス情報を/usr/archにコピー。 >>sudo cp -r /opt/TD_???/arch /usr/ 4. ライセンスファイルの設定。(最新のライセンスファイルを使用すること) >>sudo mkdir /usr/license >>cp Anlogic_???.lic /usr/license/Anlogic.lic 5. TDを起動。 >>sudo td -gui
<Windowsへのインストール> 1.インストーラを実行する。(但し、中国語なのでそれらしいボタンを押す) 2.ライセンスファイル名を「anlogic.lic」に変え、インストールしたフォルダのlicenseフォルダにコピー。
(2)JTAGのUSBドライバの設定(TangPrimer基板上のJTAGチップ用!) 基本的には、Tang Primerの説明通りです。 1. エディタで「/etc/udev/rules.d/91-anlogic-jtag.rules」を作成する。内容は次の通り。
(1)でインストールしたTDを起動し、Downloadボタンを押して「EG4S20BG256」が認識されていればOK。
(3)回路合成 サンプル回路は、次の方法でダウンロード可能です。 ・基本的なサンプル回路 >>git clone --recursive https://github.com/Lichee-Pi/Tang_FPGA_Examples
・RISC-V(Tang_E203_Mini):Lichee-Piの純正ではなく、こちらを使う必要があるようです。 問題は、「project/e203egmini_new.sdc」のクロック名の間違いのようです。 なお、私が確認したところ、24MHzまでタイミングがメットしました。(ToolsーIP Generatorで PLLのクロック設定を変更し、制約ファイル「project/e203egmini_new.sdc」を書き換えること) >>git clone --recursive https://github.com/riktw/Tang_E203_Mini
その後、ProjectーOpen Project で*.alファイルを開き、ProjectーCleanProjectで以前のデータを 消去し、ProcessーRun 又は Runアイコンを押すと、回路合成可能です。
新たにプロジェクトを作る場合は、ProjectーNewProjectで、プロジェクト名とフォルダーを選択し、 DeviceFamily:EG4 DeviceName:EG4S20BG256 を選択し、SourceーAddSourceでソースファイルを選択し、Constraintsの上で右ボタンを押し、 AddADCFile(ピンアサイン)やAddSDCFile(タイミング制約)で制約ファイルを読み込めばOKです。 もちろん、Toolsの各機能で、ピンアサインやタイミング制約を決めることも可能です。 また、ToolsーIP Generatorを選べば、PLL、ADC、SDRAMなどが使えるようになります。 詳細は、こちらをご覧ください。
(4)回路の書き込み Downloadアイコンを押し、Addで*.binファイルを選択します。 ModeSelectionのModeがJTAGの場合、Fileを選んでRunを押すと、一時的にFPGAに回路を書き込み、 実行することができます。でも、一時書き込みなので、電源を落とすと、Flashに格納されている元の回路 が起動します。書き込み時間は短いので、動作検証はこちらで行います。 ModeSelectionのModeをPROGRAM FLASHに変更し、Fileを選んでRunを押すと、Flashメモリに回路を 書き込むことができます。この場合、電源を落としてもその回路が起動します。
(5)実行時の注意 ・基板のRESETボタンは、FPGAのPROGRAM_Bに繋がっていますので、Flashメモリからロードされます。 ・基板のUSERボタンは、E203等では回路のリセットに繋がっていますので、一時書き込みでも回路を リセット可能です。 ・サンプルのピンアサインは結構間違えていますので、実機や回路図を確認してつなぎ直しましょう。 (例えば、LEDのGとBが入れ替わっているとか、標準のUART端子が違うとか...)
3.E203のソフト開発(0)最初に注意点 私も、2021年3月になってJTAG/RISC-Vデバッガを購入しましたが、TangPrimerに搭載されている XTX社のQSPIフラッシュメモリがopenocdに登録されていないため書き込み時にエラーが発生します。 しかし、下記の方法でWindows及びLinuxでプログラムを書き込む事ができました。 ・RISC-V(Hummingbird E203)のプログラムを書き込むためには、SWITCH SCIENCE等で売っている Sipeed社のJTAG/RISC-Vデバッガが必要です。 ・マニュアル通り実行しても、プログラムを書き込むことはできません。下記の手順で書き込みソフトを コンパイルし直す必要が有ります。 ・Arduinoのシールドを使えるように、上記のようなボードを作っておくと便利です。
(1)Windowsの場合 Windowsの場合は、Arduino IDEでソフト開発が可能です。ただ、標準の書き込みソフトではQSPIフラッシュに 書き込めないようです。こちらの記事を参照下さい。これで書き込めました。 但し、サンプルプログラムは、Hifive社のボードに合わせているので、ピンアサインを変更する等の対応が 必要です。
(2)Linuxの場合 Linuxの場合は、sirv-e-sdkでソフト開発が可能です。しかし、ここのページの通り行ってもうまく行きません。 1. Cコンパイラのインストール sirv-e-sdk.tar.lrzをダウンロード >>sudo apt-get install lrzip libusb-0.1 libftdi1-2 libftdi1-dev >>lrzuntar sirv-e-sdk.tar.lrz >>whoami で<username>を調べる。 >>sudo usermod -a -G plugdev <username>
2. サンプルのコンパイル softwareフォルダのdemo_gpioをコンパイルする場合は次のようにします。 >>cd sirv-e-sdk >>make software PROGRAM=demo_gpio BOARD=sirv-e203-lichee
3. JTAG/RISC-Vデバッガのドライバ設定 エディタで、「/etc/udev/rules.d/45-dt2232.rules」を作る。内容は次の通り。
4.QSPIフラッシュメモリへの書き込み 上にも書いたように、openocdにXTX社のフラッシュメモリが登録されていないため、upload を行うとエラーが出ます。そのため、次の手順で、openocdを作り直す必要があります。 >>git clone https://github.com/Lichee-Pi/LicheeTang_openocd.git >>cd LicheeTang_openocd >>./bootstrap >>./configure --enable-ftdi エディタで「src/flash/nor/spi.c」を開き、flash_devices[]に下記の設定を追加。 FLASH_ID("xtx xt25f08", 0xd8, 0xc7, 0x0014400b, 0x100, 0x10000, 0x100000), >>make 「src/openocd」を、sirv-e-sdk/work/build/openocd/prefix/bin/ にコピーする。 この後、 >>make upload PROGRAM=demo_gpio BOARD=sirv-e203-lichee を行うと、書き込みが成功し、E203が起動します。但し、ディフォルトのままだと、 UART(115.2kbps)で文字が出るだけで、LEDの色は変化しません。 「sirv-e-sdk/bsp/env/hifive1.h」のピンアサインを変更するとLEDの色が変わるようになります。
4.自作16bitマイコン(RISC16)の実装(1)自作16bitプロセッサRISC16の仕様 RISC16は、私が担当した電気製品に組み込むために作った、16bitのRISCプロセッサです。 特徴は次の通り。 ・インストラクションバスとデータバスを完全に分離したハーバードアーキテクチャ。 ・インストラクションは、基本16bit、値を直接指定する命令は32bit。 ロード/ストアとレジスタのインクリメント/デクリメントを1サイクルで実行。 ディレイド分岐により、分岐によるオーバーヘッドを0にできる場合がある。 ・インストラクションバスとデータバス共に、アドレス幅16bit、データ幅16bit。(容量は各128Kbyte) ・割り込み対応。 ・回路規模は、15,000(乗算器なし)〜20,000ゲート(乗算器あり)程度と非常に小さい。 ・自作のアセンブラ及び簡易Cコンパイラでソフト開発可能。(最適化も可) 上記の特徴により、同じ周波数でも、一般的な組み込み用のRISCプロセッサと比べ 平均2〜3倍高速に処理できます。 残念ながら、仕事で作ったプロセッサなので、RTLは公開できません。
(2)Tang Primerに実装したRISC16マイコンの仕様 RISC16プロセッサを中心に周辺回路を組み込んで、Arduino互換のマイコンボードを作成 しました。仕様は次の通り。(Arduinoコネクタに未接続の端子を含む) ・RISC16プロセッサ:36MHz、乗算器あり インストラクションメモリ:16bit×16K データメモリ:16bit×16K ・UART:2チャンネル ・SPIホスト/スレーブ:4チャンネル(汎用2ch、MicroSDカード1ch、QuadSPIフラッシュメモリ1ch) ・I2Cホスト/スレーブ:2チャンネル ・PWM:8チャンネル ・ADC:8チャンネル ・タイマ:4チャンネル ・GPIO:32チャンネル ・割り込みコントローラ:16入力(エッジ/レベル、極性設定可)
(3)ソフトウェア 現在、RISC16マイコンのソフトに次の機能を実装し、各回路の検証を行えます。 タイマ割り込み UARTの送受信及びモニタ:PCのTeratermやscreenで、メモリや周辺回路のリード/ライトを実行 SPIにLCDパネル(128x160):タイマ割り込みで書き換え SPIにフラッシュメモリ:フラッシュメモリのリード/ライト可能 ADCにアナログジョイスティック GPIOにボタン PWMにスピーカ
おまけ.TangPrimerによる、RISC-V互換 32bit/64bitプロセッサの設計に挑戦はこちら
Arduinoの紹介はこちら。
「ESP32の使い方」はこちら。
「Sipeed Maix BitでA.I.を体験」はこちら。
「PYNQ:PythonでFPGAを動かそう」はこちら。 |