ネットワークで簡単にパーシャルリコンフィギュレーション (1)

この記事では、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 のコードを編集して、パーシャルリコンフィギュレーションのためのビットストリームファイルを簡単に作成する方法を説明する予定です。

東京工業大学 吉瀬謙二

タイトルとURLをコピーしました