TinyFPGA BX の使い方
2022-03-26
TinyFPGA BX は Lattice 社製の FPGA、iCE40LP8K を搭載した開発ボードです。iCE40 は一連の開発ツールが完全にオープンソース化されている数少ない FPGA です。
情報リンク
- iCE 40
- IceStudio
- TinyFPGA BX
- ウェブサイト
- TinyFPGA BX ユーザーガイド
- リポジトリ
- TinyFPGA BX 回路図
- TinyFPGA ブートローダ
- 通販
- CrowdSupply
- Sparkfun
- Mouser
- 千石電商
- ※ どこも在庫切れ(2022/06/26 確認)みたいです orz………おらの村には半導体がねぇ
- ほか
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
開発環境
- Lattice の iCEcube2
- iCE40 ユーザーガイドに書かれてる方法
- OSS の CLI ツールでやる方法
- APIO (Atom プラグイン)
- オープンソースのツールチェーン
- APIO ドキュメント
- Icestorm
- Icestudio ← 今回はこれ
- オープンソースのビジュアル HDL 開発環境
Icestudioをインストールします。インストーラに従うだけなので省略。
Icestudio を開いて、
ボードの選択画面が出てきたら、TinyFPGA BX を選択。
右下のポップアップに従って必要なツールをインストール。
L チカ
サンプルコードから、L チカを選択。
Convert を選択。
LED を接続するピンを選択。
TinyFPGA ボードを接続して、右下の Upload をクリック。
L チカしました。
※ うまくいかない場合、USB アダプタに接続して電源のみを供給 すると、L チカするはずです。PC に接続すると、ブートローダは通信待機状態で起動してしまい、ユーザーイメージを読み込みません。
WSL2 + Ubuntu での環境構築
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