LoginSignup
18
15

More than 5 years have passed since last update.

HiFive1(Arduino互換RISC-Vボード) を動かしてみる

Last updated at Posted at 2016-12-31

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

HiFive1の入手方法

この記事で用いた開発環境

  • 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ボタンを押す
    • 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

/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 を実行

Screenshot from 2017-01-01 07-06-52.png

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);

参照

18
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
15