背景
iCE40とはLattice社が販売しているFPGAです。FPGAとは、内部の回路をソフトウェアのように書き換えられるハードウェアです。
IceStormとは、Verilogというハードウェア記述言語で記述した回路からiCE40に書き込めるファイルを作成するプログラムです。
IceStormでFPGAに回路を書き込み、FPGAに繋がったLEDを点滅(通称Lチカ)できたので、備忘録を兼ねてその方法を共有します。
使ったもの
iCE40-HX8K Breakout Board
iCE40-XH8Kが載っているボードです。
Laticeのwebページから購入できます。
LinuxをインストールしたPC
Ubuntu18.04で動作確認しました。Raspberry Pi + Raspbianの組み合わせでも可能です。
(その場合、IceStormのビルドに数時間かかります。)
IceStormをインストール
インストール方法を参考にしながら下記のコマンドを実行して、~/gitprojects/ディレクトリにファイルを配置しながら、ビルドとインストールを行いました。sudo apt-get install -y \ git build-essential clang bison flex libreadline-dev \ gawk tcl-dev libffi-dev git mercurial graphviz \ xdot pkg-config python python3 libftdi-dev \ qt5-default python3-dev libboost-dev echo 'ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="0660", GROUP="plugdev", TAG+="uaccess"' | sudo tee $RULE_FILE sudo udevadm control --reload-rules && udevadm trigger mkdir ^p ~/gitprojects cd ~/gitprojects git clone https://github.com/cliffordwolf/icestorm.git icestorm cd icestorm make -j$(nproc) sudo make install cd ../ git clone https://github.com/cseed/arachne-pnr.git arachne-pnr cd arachne-pnr make -j$(nproc) sudo make install cd ../ git clone https://github.com/YosysHQ/nextpnr nextpnr cd nextpnr cmake -DARCH=ice40 -DCMAKE_INSTALL_PREFIX=/usr/local . make -j$(nproc) sudo make install cd ../ git clone https://github.com/cliffordwolf/yosys.git yosys cd yosys make -j$(nproc) sudo make install
「Raspberry Pi上にFPGA開発環境を構築する」によると、Raspberry Piで実行する場合はメモリが足りなくなる可能性があるようです。
そのため、Raspberry Piでビルドを行う場合は、上記のビルドコマンド実行前に下記のようなコマンドでスワップ領域を広げ、
sudo sed -i -e 's/CONF_SWAPSIZE=100$/CONF_SWAPSIZE=500/g' /etc/dphys-swapfile sudo /etc/init.d/dphys-swapfile restart
Raspberry Piでのビルドが終わったら、下記のようなコマンドでスワップ領域を元の大きさに戻すのが良いと思います。
sudo sed -i -e 's/CONF_SWAPSIZE=500$/CONF_SWAPSIZE=100/g' /etc/dphys-swapfile sudo /etc/init.d/dphys-swapfile restart
LED点滅回路を準備
今回のプロジェクト用のディレクトリ(~/gitprojects/icestorm_led_blink)を作成し、その中に下記の2つのファイルを作成しました。mkdir ~/gitprojects/icestorm_led_blink
1秒ごとにLEDの光らせ方を変える回路を作りました。
Breakout Boardには12MHzのオシレーターが使われているので、12000000カウントを1秒としています。
blink.v
module top ( input clk, output [7:0] LED ); parameter TOGGLE_CLOCK = 32'd12000000; reg [31:0] counter = 32'd0; reg [7:0] led_state = 8'd0; assign LED = led_state; always @(posedge clk) begin if (counter == TOGGLE_CLOCK) begin counter <= 32'd0; if (led_state == 8'd1) begin led_state <= 8'd2; end else begin led_state <= 8'd1; end end else begin counter <= counter + 1'd1; end end // always @ (posedge CLK) endmodule // top
今回利用するBreakout BoardのLEDとクロックの信号線をpcfファイルとして定義します。
hx8k.pcf
set_io LED[7] B5 set_io LED[6] B4 set_io LED[5] A2 set_io LED[4] A1 set_io LED[3] C5 set_io LED[2] C4 set_io LED[1] B3 set_io LED[0] C3 set_io clk J3
回路の合成と書き込み
コマンドをそれぞれ入力する場合
下記のようなコマンドで、先ほど作成したverilogファイルとpcfファイルから回路を合成してbitファイルを出力し、FPGAに書き込みます。cd ~/gitprojects/icestorm_led_blink yosys -p 'synth_ice40 -top top -blif blink.blif' blink.v arachne-pnr -d 8k -o blink.asc -p hx8k.pcf blink.blif icepack blink.asc blink.bin iceprog blink.bin
成功すると、D3とD2のLEDが1秒間隔で交互に光ります。
Makefileを領する場合
先ほど紹介したコマンドを毎回入力するのは手間なので、下記のようなMalefileを作っておくと、bitファイル生成時のコマンドが少なくて済みます。
Makefile
PROJECT = blink PCF = hx8k.pcf DEVICE_SHORT = 8k DEVICE = hx$(DEVICE_SHORT) SOURCE = *.v all: $(PROJECT).rpt $(PROJECT).bin $(PROJECT).blif: $(SOURCE) yosys -p 'synth_ice40 -top top -blif $(PROJECT).blif' $(SOURCE) $(PROJECT).asc: $(PCF) $(PROJECT).blif arachne-pnr -d $(DEVICE_SHORT) -o $(PROJECT).asc -p $(PCF) $(PROJECT).blif $(PROJECT).bin: $(PROJECT).asc icepack $(PROJECT).asc $(PROJECT).bin $(PROJECT).rpt: $(PROJECT).asc icetime -d $(DEVICE) -mtr $(PROJECT).rpt $(PROJECT).asc prog: $(PROJECT).bin iceprog $(PROJECT).bin prog-ram: $(PROJECT).bin iceprog -S $(PROJECT).bin clean: rm -f $(PROJECT).blif $(PROJECT).asc $(PROJECT).rpt $(PROJECT).bin
上記のMakefileがあれば、下記のようなコマンドでbitファイルの出力と書き込みができます。
cd ~/gitprojects/icestorm_led_blink make make prog
まとめ
iCE40-HX8KにIceStormを使って回路を書き込めました。以前の記事(ubuntuからminiSpartan6+にテストプログラムを送信する)で利用したXilinxのSpartan6を使うためのISEという開発プログラムは、会員登録後に数GBの開発環境のダウンロードが必要でした。
それに比べて、今回利用したIceStormはコマンド動作だけで開発環境を構築できたので、取り組みやすく感じました。
記事内で紹介したファイルは、下記のリポジトリでも公開しています。
asukiaaa/icestorm_led_blink
何かの参考になれば嬉しいです。
0 件のコメント :
コメントを投稿