[電子工作]Tang Primer:中国製FPGAでプロセッサの設計に挑戦

ーーーー目次ーーーー

1.Tang Primerとは?

2.各種ツールのインストール

3.E203のソフト開発

4.自作16bitマイコンの実装

 

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」を作成する。内容は次の通り。

SUBSYSTEMS=="usb", ATTRS{idVendor}=="0547", ATTRS{idProduct}=="1002", \

GROUP="plugdev", \

MODE="0660"

     2. >>sudo service udev restart

   (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」を作る。内容は次の通り。

SUBSYSTEMS=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", \

GROUP="plugdev", \

MODE="0660"

     >>sudo service udev restart

 

    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を動かそう」はこちら。