FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

RISC-Vの実装をZedBoardで手っ取り早く試すためのチュートリアル

自分でも良く分からなくなるのでまとめておく。RISC-Vを手っ取り早くFPGAボードで動作させたいときのために、githubからいろんなビルド済みの何かをダウンロードして動作させる方法をまとめておく。

用意するもの

FPGAボード (ZedBoard, Zybo, zc706)

私はZedBoardしか持っていないのでそれで試す。

www.avnet.co.jp

SDカード

4GBもあれば十分。

ZedBoard向けの環境を作る手順

1. RISC-Vビルド用のLinux(ゲストOS)をVirtualBox上で構築する

Vagrant上でUbuntu Linuxを構築しても良いのだけど、SDカードを認識させるのに随分苦労しているので、普通にVirtualBox上でUbuntu 16.10の環境を構築する。

ただし、僕はGUI環境が大嫌いなので、sshでmsys2からログインできるようにしておく。

Ubuntu 16.10 (Yakkety Yak)

SDカードが認識できることを確認しておくこと。

f:id:msyksphinz:20161124003045p:plain

また、ポーテフォワーディングにより、sshでmsys2からログインできるようにしておくと作業が楽だ。

f:id:msyksphinz:20161124003159p:plain

fpga-zynqというリポジトリが、githubで公開されているのでそれをcloneする。

git clone https://github.com/ucb-bar/fpga-zynq.git
git submodule status
cd zedboard/fpga-images-zedboard
git submodule update .

2. ビルド済みバイナリをダウンロードする

一からビルドするのは面倒なので、ビルドしたものをダウンロードしてくる。

cd fpga-zynq/zedboard
make fetch-images
make fetch-riscv-linux

3. SDカードを準備しておく

lsblkで、SDカードが認識されていることを確認しておく。下記では、/dev/sdbに認識されていることが分かる。

lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   50G  0 disk
├─sda1   8:1    0   46G  0 part /
├─sda2   8:2    0    1K  0 part
└─sda5   8:5    0    4G  0 part [SWAP]
sdb      8:16   1  3.7G  0 disk
sr0     11:0    1 1024M  0 rom

SDカードのフォーマットとマウントをして、書き込みの準備を整えよう。fdiskを使ってSDカードのパーディションを割り当てる。特に何か設定をする必要は無い。

$ sudo fdisk /dev/sdb

Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


コマンド (m でヘルプ): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p):

Using default response p.
パーティション番号 (1-4, default 1):
First sector (2048-7626751, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-7626751, default 7626751):

Created a new partition 1 of type 'Linux' and of size 3.7 GiB.

コマンド (m でヘルプ): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

lsblkをすると、sdb1が追加されていることが確認できる。

lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   50G  0 disk
├─sda1   8:1    0   46G  0 part /
├─sda2   8:2    0    1K  0 part
└─sda5   8:5    0    4G  0 part [SWAP]
sdb      8:16   1  3.7G  0 disk
└─sdb1   8:17   1  3.7G  0 part
sr0     11:0    1 1024M  0 rom

SDカードをMSDOSでフォーマットし、必要なファイルを転送する。これはmakeで一発で出来る。

$ sudo mkfs.msdos -n LABEL1 /dev/sdb1
$ sudo mount /dev/sdb1 /media/masayuki/SDCARD
$ sudo make load-sd SD=/media/masayuki/SDCARD
/home/masayuki/fpga-zynq/common/load_card.sh /media/masayuki/SDCARD
+ cp fpga-images-zedboard/boot.bin /media/masayuki/SDCARD
+ cp fpga-images-zedboard/devicetree.dtb /media/masayuki/SDCARD
+ cp fpga-images-zedboard/uImage /media/masayuki/SDCARD
+ cp fpga-images-zedboard/uramdisk.image.gz /media/masayuki/SDCARD
+ '[' -a fpga-images-zedboard/riscv/vmlinux ']'
+ mkdir -p /media/masayuki/SDCARD/riscv
+ cp fpga-images-zedboard/riscv/vmlinux /media/masayuki/SDCARD/riscv/
+ cp fpga-images-zedboard/riscv/root.bin /media/masayuki/SDCARD/riscv/
$ sudo umount /media/masayuki/SDCARD

4. ZedBoardでLinuxを起動する

SDカードを取り出し、ZedBoardに挿入して、SDカードからブートするモードに切り替えて起動する。

TeraTermから起動する様子を観察する。ビットレートは115200に設定しておく。

f:id:msyksphinz:20161124005032p:plain

放っておくとLinuxが起動する。ユーザ名root, パスワードrootでログインできる。

5. fesvr-pkのテスト

まずは、fesvr-pkという、RISC-Vを制御するためのフロントエンドのテストだ。

root@zynq:~# ./fesvr-zynq pk hello
hello!

hello!と表示されたOKだ。

5. ZedBoardでRISC-V Linuxを起動する。

まずは、SDカードのファイルシステムをマウントする。

root@zynq:~# mkdir /sdcard
root@zynq:~# mount /dev/mmcblk0p1 /sdcard

フロントエンドから、RISC-V Linuxを起動する。

root@zynq:~# ./fesvr-zynq +disk=/sdcard/riscv/root.bin bbl /sdcard/riscv/vmlinux

起動した!

f:id:msyksphinz:20161124005526p:plain

unameをして、確認する。

[    0.120000] Freeing unused kernel memory: 568K (ffffffff80000000 - ffffffff8008e000)
[    0.120000] This architecture does not have kernel memory protection.
/ #
/ # uname -a
Linux ucbvax 4.6.2-g8205b66 #3 Tue Sep 20 17:52:08 PDT 2016 riscv GNU/Linux
/ #

riscv GNU/Linuxと表示されている。OKだ。

ただし、やはりPL環境で100MHz?程度で動作しているので、動作はかなりもっさりだ。