この記事では、ACRi ルームに設置されている vs800系のマシンと、それらに接続されている Arty A7 FPGA ボードの使い方を説明します。このプロジェクトでは、ネットワークで簡単にパーシャルリコンフィギュレーションを試すことができます。
具体的には、Arty A7 で動作するソフトプロセッサ、ネットワークやメモリを制御するコントローラを動作させながら、ユーザが作成したハードウェアだけを FPGA にコンフィギュレーションして動かします。加えて、JTAG を用いてコンフィギュレーションするのではなく、TCP パケットを Arty A7 に送信することで簡単にパーシャルコンフィギュレーションできる環境を提供します。
このプロジェクトを実行するためには、ACRi ルームの vs801または vs802 を予約して、予約したマシンで作業してください。
このプロジェクトは、Chiptip Technology と東京工業大学の共同研究の成果を活用しています。
プロジェクトディレクトリのコピーと実行
まず、予約した vs800系のマシン (例えば vs801) にログインします。そして、次のコマンドで自分のホームディレクトリに移動します。
$ cd ~
プロジェクトのファイルは、/tools/proj/arty_pr1 に格納されています。次のコマンドを実行して、プロジェクトのディレクトリ(に含まれる全てのファイル)をコピーします。
$ cp -r /tools/proj/arty_pr1 .
次のコマンドで、コピーしたディレクトリに移動します。
$ cd arty_pr1
プロジェクトのディレクトリの構造は次の通りです。
arty_pr1/
├ checkpoints/
│ └ static_routed.dcp
├ scripts/
│ ├ build_all.tcl
│ ├ create_project.tcl
│ └ create_template.tcl
├ srcs/
│ └ main.v
├ main_inc.bit
├ main_dec.bit
├ build_userlogic.sh
├ create_project.sh
├ getdata.py
└ pconfig.py
Arty A7 FPGA ボードと通信できることを、次のコマンドで確認します。
$ ping -c 3 arty1
次のようなメッセージが出力されていれば、Arty A7 と通信できています。(ログインしているマシンによって、IP アドレスが異なることがあります。)
PING arty1 (192.168.1.2) 56(84) bytes of data.
64 bytes from arty1 (192.168.1.2): icmp_seq=1 ttl=255 time=0.559 ms
64 bytes from arty1 (192.168.1.2): icmp_seq=2 ttl=255 time=0.421 ms
64 bytes from arty1 (192.168.1.2): icmp_seq=3 ttl=255 time=0.652 ms
--- arty1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2138ms
rtt min/avg/max/mdev = 0.421/0.544/0.652/0.094 ms
次のコマンドで、Arty A7 が実行しているデザインの4ビットの GPIO の出力を取得します。
$ ./getdata.py arty1
次のような表示が得られます。右端の値 d が、16進数で表示した4ビットの GPIO の出力です。
RM output: d
もう一度、同じコマンドを実行してみます。
$ ./getdata.py arty1
このデザインでは一定の間隔で出力を変えている (一定の間隔で出力を変更するハードウェアを FPGA で動作させている) ので、次の様に、異なる値が表示されるかもしれません。たまに、同じ値が表示されることもあります。
RM output: 3
getdata.py に記述されている Python のプログラムで TCP のパケットを Arty A7 に送信して、Arty A7 から受け取ったパケットを受信して、その内容を表示しています。
次に、Arty A7 で実行しているハードウェアの一部をコンフィギュレーション (パーシャルリコンフィギュレーション) します。次のコマンドを実行します。
$ ./pconfig.py main_inc.bit arty1
次のようなメッセージが出力されたら成功です。
Bitstream size: 123802
Sending bitstream file completed!
pconfig.py で指定している main_inc.bit がパーシャルリコンフィギュレーションのためのビットストリームファイルです。このファイルを TCP のパケットで Arty A7 に送信して、その内容でコンフィギュレーションして動作を開始します。
次のコマンドを実行することで、main_inc.bit に記述されたハードウェアとして動作している4ビットの GPIO の出力を取得できます。
$ ./getdata.py arty1
出力の例は次の通りです。
RM output: 1
定期的に値を取得して表示するためには watch コマンドを使います。次のコマンドは 0.2秒毎に ./getdata.py arty1 を実行して出力します。
$ watch -n 0.2 ./getdata.py arty1
しばらく動作の様子をながめてみましょう。RM output: の次に表示される値が1秒毎に変化する様子が見えるはずです。main_inc.bit は、1秒毎に値を1だけ増加するカウンタであることが想像できるかもしれません。「Ctrl + C」(Controlキーを押しながら C を押す) で、watch を終了させます。
次のコマンドでもうひとつのビットストリームファイルをコンフィギュレーションします。
$ ./pconfig.py main_dec.bit arty1
先ほどと同様に 0.2秒毎に ./getdata.py arty1 を実行して出力します。
$ watch -n 0.2 ./getdata.py arty1
今回は、1秒毎に値を1だけ減少させるカウンタであることが想像できるかもしれません。
「Ctrl + C」で、watch を終了させます。
main_inc.bit を生成するために用いた Verilog HDL のコード main.v はこちらです。
`define CLKHZ 83333333 // 83.333333 MHz clock signal
module prr_0_template (w_clk, r_dout);
input wire w_clk;
output reg [3:0] r_dout;
initial r_dout = 0;
reg [31:0] r_cnt = 0;
always @(posedge w_clk) begin
r_cnt <= (r_cnt < `CLKHZ) ? r_cnt+1 : 1;
if(r_cnt==1) r_dout <= r_dout+1;
end
endmodule
まとめ
この記事では、ACRi ルームに設置されている vs800系のマシンと、それらに接続された Arty A7 FPGA ボードの使い方 (ステップ1) を説明しました。TCP パケットを送信して Arty A7 で動いているハードウェアの GPIO の値を取得する方法と、TCP パケットを送信してパーシャルコンフィギュレーションを実現する方法を試しました。
次の記事では、Verilog HDL のコードを編集して、パーシャルリコンフィギュレーションのためのビットストリームファイルを簡単に作成する方法を説明する予定です。
東京工業大学 吉瀬謙二