2018年11月25日日曜日

iCE40向けにIceStormで回路を合成してLEDを点滅させてみた


背景

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

何かの参考になれば嬉しいです。

参考

Raspberry Pi上にFPGA開発環境を構築する

0 件のコメント :