LoginSignup
8
7

More than 3 years have passed since last update.

Freedom E300 Arty DevKit でRISCVを試す

Last updated at Posted at 2017-01-16

RISCVのArduino互換ボードであるHiFiveは日本国内ではすぐには入手できないので、DigilentのArtyをつかってRISCV(SiFiveのFreedom E300)を動かします。

Arty.png
左がHiFive、右がArtyで動かしたFreedomE300。

1. 開発環境

JTAGアダプターはFreedomで標準サポートのOlimex JTAG ARM-USB-TINY-Hを使っています。 Vivado WebPACKのインストールとセットアップは済んでいるものとします。

2. FPGAイメージの作成

2-1. FPGA用にFreedomをビルド

以下のように、Githubからコード一式をCloneして、MakeすればOK。Arty用のFreedom E300のMCSファイルが生成されます。

git clone https://github.com/sifive/freedom.git
cd freedom

Device Tree コンパイラをインストール

sudo apt install device-tree-compiler

RISCVのToolchainをインストール

wget https://static.dev.sifive.com/dev-tools/riscv64-unknown-elf-gcc-20170612-x86_64-linux-centos6.tar.gz
tar xvfz riscv64-unknown-elf-gcc-20170612-x86_64-linux-centos6.tar.gz
export RISCV=$PWD/riscv64-unknown-elf-gcc-20170612-x86_64-linux-centos6

submoduleを更新

git submodule update --init
cd rocket-chip/
git submodule update --init
cd ..

ChiselのソースコードからVerilog RTLを作成し、次にFPGAのイメージ(Bitfile)をビルドします。(この際vivadoにパスが通っていること)

make -f Makefile.e300artydevkit verilog
make -f Makefile.e300artydevkit mcs

2-2. ArtyのSPI FlashにMCSを書き込む

  • PCとArtyをUSBケーブルで接続。
  • Vivadoを起動し、hardware managerを起動。Open TargetからAuto connectで認識されます。
  • FPGAを右クリックし、Add Configuration Memory device を選択、
    • Micron
    • 128
    • spi
    • 25q128-3.3v-spi-x1_x2_x4 を選択
  • Configuration file で builds/e300artydevkit/sifive.freedom.everywhere.e300artydevkit.E300ArtyDevKitConfig.mcs を選択
  • プログラム実行
  • 書き込みが成功後、ボード上のPROGボタンを押せばFPGAイメージがFlashからFPGAにロードされ、Arty上のLED(LD4,5,6)が点灯します

3. アプリの実行

3-1. JTAGを接続をする

FreedomのJTAGはArtyの PMOD Dに割り当てられています。

PIN # Signal name PIN # Signal name
1 TDO 7 TDI
2 TRST_n 8 TMS
3 TCK 9 SRST_n
4 10
5 GBD 11 GND
6 VCC 12 VCC

Olimex JTAG ARM-USB-TINY-H はARMの20PINのJTAGになります。

PIN # Signal name PIN # Signal name
1 VREF 2 VREF
3 TTRST_N 4 GND
5 TTDI 6 GND
7 TTMS 8 GND
9 TTCK 10 GND
11 TRTCK 12 GND
13 TTDO 14 GND
15 TSRST_N 16 GND
17 NOT CONNECTED 18 GND
19 TARGET SUPPLY 20 GND

信号の6PINとGNDを上記のPMOD Dに接続します。

3-2. Arduino IDEを使ってアプリを動かす

2017−1−17時点(最初のFPGAコード)

OpenOCDがうまく動かないので、$HOME/.arduino15/packages/sifive/riscv/1.0.1/freedom-e-sdk/bsp/env/freedom-e300-arty/openocd.cfg を下記のように修正しておきます。

adapter_khz     10000

#source [find interface/ftdi/olimex-arm-usb-tiny-h.cfg]
interface ftdi
ftdi_device_desc "Olimex OpenOCD JTAG ARM-USB-TINY-H"
ftdi_vid_pid 0x15ba 0x002a
ftdi_layout_init 0x0808 0x0a1b
ftdi_layout_signal nSRST -oe 0x0200
ftdi_layout_signal nTRST -data 0x0100 -oe 0x0100
ftdi_layout_signal LED -data 0x0800

set _CHIPNAME riscv
jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x10e31913

set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME riscv -chain-position $_TARGETNAME
$_TARGETNAME configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1

flash bank my_first_flash fespi 0x20000000 0 0 0 $_TARGETNAME
init
#reset
halt
flash protect 0 64 last off

interface/ftdi/olimex-arm-usb-tiny-h.cfgがうまく見つけられないようなので、Olimexの設定を直接書き込んでおきます。あとFlashのProtectionを外すコマンドがコメントアウトされているので、元に戻しておきます。(この問題はForumでも指摘されているので、今後修正されると思います)

2017−10−03時点(2017年8月更新のFPGAコード)

新しいFPFAイメージだと、上記の方法ではUploadがうまく動きません。Forumにこの問題と修正方法のスレッドが有ります(https://forums.sifive.com/t/freedom-e300-mcs-file-not-working/710)。$HOME/.arduino15/packages/sifive/hardware/riscv/1.0.2/freedom-e-sdk/bsp/env/freedom-e300-arty/openocd.cfg を下記のように修正しておきます。

adapter_khz     10000

#source [find interface/ftdi/olimex-arm-usb-tiny-h.cfg]

interface ftdi
ftdi_device_desc "Olimex OpenOCD JTAG ARM-USB-TINY-H"
ftdi_vid_pid 0x15ba 0x002a

ftdi_layout_init 0x0808 0x0a1b
ftdi_layout_signal nSRST -oe 0x0200
ftdi_layout_signal nTRST -data 0x0100 -oe 0x0100
ftdi_layout_signal LED -data 0x0800
#

set _CHIPNAME riscv
#jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x10e31913
jtag newtap $_CHIPNAME cpu -irlen 5

set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME riscv -chain-position $_TARGETNAME
$_TARGETNAME configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1

#flash bank my_first_flash fespi 0x20000000 0 0 0 $_TARGETNAME
flash bank my_first_flash fespi 0x20000000 0 0 0 $_TARGETNAME 0x10014000
init
#reset
if {[ info exists pulse_srst]} {
  ftdi_set_signal nSRST 0
  ftdi_set_signal nSRST z
}
halt
#flash protect 0 64 last off

あとOpenOCDも最新の物に差し替えておきます。

$HOME/.arduino15/packages/sifive/tools
wget https://static.dev.sifive.com/dev-tools/riscv-openocd-20170612-x86_64-linux-centos6.tar.gz
tar xvfz riscv-openocd-20170612-x86_64-linux-centos6.tar.gz

$HOME/.arduino15/packages/sifive/hardware/riscv/1.0.2/platform.txt ファイルを上記を使うようにパスを(無理やり)修正しておきます。 SDK周りは最新のRISCVにまだ更新されていないので騙し騙し使います。

3-3. アプリの実行

あとは、Arduino IDEで BlinkサンプルをCompile&Uploadすれば、ArtyのLD1が赤く点滅します。

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

3-4. コメント

JTAGアダプターはOlimex以外も使えると思いますが、OpenOCD周りで修正が必要になります。

4. 参照

5. 更新履歴

  • 2017-01-17 初版
  • 2017-07-09 e300artydevkit-updateのブランチを使用してみる
  • 2017-10-03 8月に新しいRocket-CoreをベースにFreedomがアップデートされたので内容を更新
  • 2019-05-11 DigikeyのWikiを参照に追加
8
7
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
8
7