TinyFPGA BX の使い方

2022-03-26

\[ \newcommand{dn}[3]{\frac{\mathrm{d}^{#3} #1}{\mathrm{d} #2^{#3}}} \newcommand{\d}[2]{\frac{\mathrm{d} #1}{\mathrm{d} #2}} \newcommand{\dd}[2]{\frac{\mathrm{d}^2 #1}{\mathrm{d} {#2}^2}} \newcommand{\ddd}[2]{\frac{\mathrm{d}^3 #1}{\mathrm{d} {#2}^3}} \newcommand{\pdn}[3]{\frac{\partial^{#3} #1}{\partial {#2}^{#3}}} \newcommand{\pd}[2]{\frac{\partial #1}{\partial #2}} \newcommand{\pdd}[2]{\frac{\partial^2 #1}{\partial {#2}^2}} \newcommand{\pddd}[2]{\frac{\partial^3 #1}{\partial {#2}^3}} \newcommand{\p}{\partial} \newcommand{\D}[2]{\frac{\mathrm{D} #1}{\mathrm{D} #2}} \newcommand{\Re}{\mathrm{Re}} \newcommand{\Im}{\mathrm{Im}} \newcommand{\bra}[1]{\left\langle #1 \right|} \newcommand{\ket}[1]{\left|#1 \right\rangle} \newcommand{\braket}[2]{\left\langle #1 \middle|#2 \right\rangle} \newcommand{\inner}[2]{\left\langle #1 ,#2 \right\rangle} \newcommand{\l}{\left} \newcommand{\m}{\middle} \newcommand{\r}{\right} \newcommand{\f}[2]{\frac{#1}{#2}} \newcommand{\eps}{\varepsilon} \newcommand{\ra}{\rightarrow} \newcommand{\F}{\mathcal{F}} \newcommand{\L}{\mathcal{L}} \newcommand{\t}{\quad} \newcommand{\intinf}{\int_{-\infty}^{+\infty}} \newcommand{\R}{\mathcal{R}} \newcommand{\C}{\mathcal{C}} \newcommand{\Z}{\mathcal{Z}} \newcommand{\bm}[1]{\boldsymbol{#1}} \]

TinyFPGA BX は Lattice 社製の FPGA、iCE40LP8K を搭載した開発ボードです。iCE40 は一連の開発ツールが完全にオープンソース化されている数少ない FPGA です。

情報リンク

TinyFPGA 内蔵ブートローダのアップデート

Python と pip が必要なのでインストールしておきましょう。

TinyFPGA に必要なツールをインストールします。依存するモジュールをインストールしろと言われたらインストールします。

pip install tinyprog

TinyFPGA ボードを PC に接続して、認識されるか確認します。

※ Windows 10 以前のバージョンを使っている場合、Virtual Serial Port が必要なようです。

TinyFPGA のブートローダのアップデートをします。

tinyprog --update-bootloader

※ TinyFPGA BX にはプログラマ基板が不要です。その代わり、FPGA の一部にプログラマ回路が書き込まれています。間違えて上書きしてしまった場合、Arduino を使ってブートローダを復元することができます。参考 → Programming with an Arduino

開発環境

Icestudioをインストールします。インストーラに従うだけなので省略。

Icestudio を開いて、

ボードの選択画面が出てきたら、TinyFPGA BX を選択。

右下のポップアップに従って必要なツールをインストール。

L チカ

サンプルコードから、L チカを選択。

Convert を選択。

LED を接続するピンを選択。

TinyFPGA ボードを接続して、右下の Upload をクリック。

L チカしました。

※ うまくいかない場合、USB アダプタに接続して電源のみを供給 すると、L チカするはずです。PC に接続すると、ブートローダは通信待機状態で起動してしまい、ユーザーイメージを読み込みません。

WSL2 + Ubuntu での環境構築

Project Ice Storm

makeは-jで適宜並列化してね

sudo apt update
sudo apt install build-essential git cmake clang bison flex libreadline-dev gawk tcl-dev libffi-dev mercurial graphviz xdot pkg-config libftdi-dev qt5-default libboost-all-dev libeigen3-dev python python3 python3-dev

icestorm

git clone https://github.com/YosysHQ/icestorm.git
cd icestorm
make
sudo make install

arachine-pnr

git clone https://github.com/cseed/arachne-pnr.git
cd arachne-pnr
make
sudo make install

nextpnr

git clone https://github.com/YosysHQ/nextpnr.git
cd nextpnr
cmake . -DARCH=ice40
make
sudo make install

yosys

git clone https://github.com/YosysHQ/yosys.git
cd yosys
git checkout <select release commit (yosys-0.30)>
sudo apt update
sudo apt install build-essential clang bison flex \
    libreadline-dev gawk tcl-dev libffi-dev git \
    graphviz xdot pkg-config python3 libboost-system-dev \
    libboost-python-dev libboost-filesystem-dev zlib1g-dev
make
sudo make install
make test

riscv-gnu-toolchain

git clone https://github.com/riscv/riscv-gnu-toolchain
sudo apt-get install autoconf automake autotools-dev curl python3 python3-pip libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev ninja-build git cmake libglib2.0-dev

ここでターゲットのアーキテクチャを指定します。 multilib にするといろいろなISA(IとかMとかC)に対応できる。

./configure --prefix=/opt/riscv --enable-multilib
make newlib

RISC-VでLチカ

TinyFPGA-BXにあるサンプルを試します。

参考

WSL2 に USB を渡す

WSL2でUSBを使うには、USB デバイスを接続する

PowerShellをadminで開き、

usbipd wsl list
usbipd wsl attach --busid <BUS-ID>

ここでエラーが出たので、 WSL-support に従ってコマンドをたたいたら、いけました。

WSL2側で lsusb すれば認識されてるはず。

※ attach でエラーが出る。FPGA側のUSBを書き換える必要がありそう。

Windows 側で書き込む

WSL側からWindowsのプロセスを起動し書き込みを行う。

Windowsの環境変数に $env:WSLHome = \\wsl.localhost\Ubuntu\home\[user] を追加し、PowerShellで、

tinyprog -p $env:WSLHome\TinyFPGA-BX\examples\picosoc\hardware.bin -u $env:WSLHome\TinyFPGA-BX\examples\picosoc\hardware.bin

すれば書き込めます。これをWSL側から起動します。Makefile参照。Windowsの環境変数 $env:WSLHome を使うには、Linuxの環境変数記号 $ をエスケープして \$env:WSLHome とし、Makefileの変数記号 $ をエスケープするために \$$env:WSLHome とする。

Makefile

CC=riscv64-unknown-elf-gcc
OBJCOPY=riscv64-unknown-elf-objcopy

upload: hardware.bin firmware.bin
    powershell.exe /c "tinyprog -p \$$env:WSLHome\TinyFPGA-BX\examples\picosoc\hardware.bin -u \$$env:WSLHome\TinyFPGA-BX\examples\picosoc\firmware.bin"

hardware.json: hardware.v spimemio.v simpleuart.v picosoc.v picorv32.v
    yosys -ql hardware.log -p 'synth_ice40 -top hardware -json hardware.json' $^

hardware.asc: hardware.pcf hardware.json
    nextpnr-ice40 --lp8k --package cm81 --asc hardware.asc --pcf hardware.pcf --json hardware.json

hardware.bin: hardware.asc
    icetime -d lp8k -c 12 -mtr hardware.rpt hardware.asc
    icepack hardware.asc hardware.bin


firmware.elf: sections.lds start.S firmware.c 
    $(CC) -march=rv32imc -mabi=ilp32 -nostartfiles -Wl,-Bstatic,-T,sections.lds,--strip-debug,-Map=firmware.map,--cref  -ffreestanding -nostdlib -o firmware.elf start.S firmware.c

firmware.bin: firmware.elf
    $(OBJCOPY) -O binary firmware.elf /dev/stdout > firmware.bin


clean:
    rm -f firmware.elf firmware.hex firmware.bin firmware.o firmware.map \
          hardware.json hardware.log hardware.asc hardware.rpt hardware.bin