HiFive1 は32bitのRISCVプロセッサを搭載したArduino互換ボードです。Arduino IDEを利用してRISC-Vプロセッサを使ったアプリの開発が簡単にできます。Arduino IDEからのUploadはOpenOCD(JTAG)になります。
HiFive1の仕様
- SiFive Freesim E310
- RISC-V 32bit, RV32IMAC
- RV32I Base Integer Instruction Set, Version 2.0
- “M” Standard Extension for Integer Multiplication and Division, Version 2.0
- “A” Standard Extension for Atomic Instructions, Version 2.0
- “C” Standard Extension for Compressed Instructions, Version 1.9
- RISC-V Privileged ISA Specification, Version 1.9.1
- RISC-V External Debug Support, Version 0.11
- Speed:320+MHz
- Performance: 1.61 DMIPs/MHz
- Memory:
- 16KB L1 Instruction Cache
- 16KB Data SRAM scratchpad
- UART, QSPI, PWM
- JTAG
HiFive1の入手方法
- Crowd Supply から
- https://www.crowdsupply.com/sifive/hifive1
- 応募は2016年12月29日で終了し、現在は Pre-Order の状態
- マルツオンラインもしくはマルツ店頭で (2017年3月から扱ってるようです)
この記事で用いた開発環境
- Ubuntu 16.04 64bit
- Arduino 1.8.0
開発環境のセットアップ
- Arduino IDEのインストール (すでに導入済みの場合は省略)
- https://www.arduino.cc/en/Main/Software から Linux 64bit (arduino-1.8.0-linux64.tar.xz) をダウンロード
- コンソールで以下を実行
- tar -xvf arduino-1.8.0-linux64.tar.xz
- cd arduino-1.8.0/
- ./install.sh
- Arduino IDEにHiFive1を追加(RISCVのToolchainなどが追加されます)
- Arduino IDE を実行
- File -> Preferences -> Settings で下記を追加し、OKボタンを押す
- Additional Board Manager URLs: http://static.dev.sifive.com/bsp/arduino/package_sifive_index.json
- Tools -> Board -> Boards Manager で下記を選択し、Installボタンを押す
- "SiFive Freesom Boards by SiFive"
- Tools -> Board で HiFive 1 を選択
- Tools -> Programmer で SiFive OpenOCD を選択
- USB の設定
- sudoしなくても使えるように、plugdevグループにアカウントを追加
- sudo usermod -a -G plugdev $USER
- HiFive1を自動認識するように、下記のUDEVルールを追加
- sudo vi /etc/udev/rules.d/99-openocd.rules
- sudoしなくても使えるように、plugdevグループにアカウントを追加
/etc/udev/rules.d/99-openocd.rules
# These are for the HiFive1 Board
SUBSYSTEM=="usb", ATTRS{idVendor}=="0403",ATTRS{idProduct}=="6010", MODE="664", GROUP="plugdev"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403",ATTRS{idProduct}=="6010", MODE="664", GROUP="plugdev"
# These are for the Olimex Debugger for use with E310 Arty Dev Kit
SUBSYSTEM=="usb", ATTRS{idVendor}=="15ba",ATTRS{idProduct}=="002a", MODE="664", GROUP="plugdev"
SUBSYSTEM=="tty", ATTRS{idVendor}=="15ba",ATTRS{idProduct}=="002a", MODE="664", GROUP="plugdev"
動作確認
PCとボードをUSBケーブで接続。他に接続されたUSBシリアルデバイスがない場合、/dev/ttyUSB1 にシリアル接続されるので、ScreenコマンドでHiFive1にアクセスする。
sudo apt install screen
sudo screen /dev/ttyUSB1 115200
PCとボードを接続した状態で、ボード上のリセットボタン(赤いボタン)を押すと下記のメッセージが表示される。
SIFIVE, INC.
5555555555555555555555555
5555 5555
5555 5555
5555 5555
5555 5555555555555555555555
5555 555555555555555555555555
5555 5555
5555 5555
5555 5555
5555555555555555555555555555 55555
55555 555555555 55555
55555 55555 55555
55555 5 55555
55555 55555
55555 55555
55555 55555
55555 55555
55555 55555
555555555
55555
5
'led_fade' Demo
55555555555555555555555555555555555555555555555
5555555 Are the LEDs Changing? [y/n] 555555555
55555555555555555555555555555555555555555555555
y
PASS
screen から抜けるには C-a k (Ctrl+aを押した後に k)。
サンプルコードのコンパイルとボード上での実行
- File -> Examples -> Basics から Blink を選択
- Sketch -> Upload Using Programmer を実行
LEDが緑で点滅すればOK.
HiFive1の起動の仕組み
ノーマルブート
- POR もしくはリセットボタン
- SPI Flash (0x20000000) に書き込まれたブートローダーを起動し初期化を実施、緑のLEDが点灯
- SPI Flash (0x20400000) に書き込まれたユーザーアプリケーション実行
- ユーザーアプリケーション実行中にユーザーアプリケーションの更新が(JTAG経由で)可能
セーフブート(ダメなユーザーアプリケーションが書き込まれた際に、再プログラム実施)
- POR もしくはリセットボタン
- SPI Flash (0x20000000) に書き込まれたブートローダーを起動し初期化を実施、緑のLEDが点灯
- 緑のLEDが点灯の際にリセットボタンを押す
- 赤のLEDが点滅(ユーザーアプリケーションは実行されない)
- ユーザーアプリケーションの更新
HiFive1の動作周波数
HiFive1の動作周波数は、Arduino IDEのToolsメニューから16MHz、256MHz、 320MHzの3種類が選べます。
HiFive1のXIP (QSPI Flash上のアプリ実行)
HiFive1はXIP(eXecute-In-Place)でQSPI Flash上のアプリを実行します。CPUからQSPIメモリへのアクセスは遅いため、2Wayのインストラクションキャシュ16KBが搭載されています。ただし、QSPIメモリへのアクセスは通常はシングルモードですので、DualかQuadに変更すれば実行速度が速くなります。現在のチップはQuadモードにバグがありDualでしか動きませんが、アプリのSetupで下記を追加すればFlashからの命令コードの読み込みが速くなります。
SPI0_REG(SPI_REG_FFMT) =
SPI_INSN_CMD_EN |
SPI_INSN_ADDR_LEN(3) |
SPI_INSN_PAD_CNT(4) |
SPI_INSN_CMD_PROTO(0) |
SPI_INSN_ADDR_PROTO(1) |
SPI_INSN_DATA_PROTO(1) |
SPI_INSN_CMD_CODE(0xbb) |
SPI_INSN_PAD_CODE(0x00);