序章
bitstream を FPGA に送信するには、通常、グラフィカル ユーザー インターフェイスを使用します。 Vivadoの Hardware Manager などのツールはこの機能を提供しますが、この単純なタスクには手順が複雑すぎると感じることがよくあります。特に、1 つの JTAG cableを介してコンピューターに接続されている FPGA が 1 つしかない場合、ユーザー インターフェイスには多くの不要な手順が必要です。 FPGAが 1 つしかない場合、コンピューターは bitstream ファイルをこの FPGAに書き込む必要があると推測できないのはなぜでしょうか。ツールに何をしたいのかを明示的に伝える必要があるのはなぜでしょうか。実際には、オプションは 1 つしかありません。
考えられる解決策としては、このタスクを 1 ステップで実行する bash script を使用することです。この script は、 JTAG cableを介してコンピューターに接続されている FPGA を見つけ、 bitstream ファイルをこの FPGAに送信します。
script
これは、 bitstream ファイルを FPGAに送信する script です。
#!/bin/bash
set -e
if [ "$#" -ne 1 ]; then
echo "Usage: $0 bitstream-file.bit"
exit 1
fi
if ! which vivado >/dev/null ; then
echo Vivado is not in the execution path. Please run something like
echo source /path/to/..../Vivado/20nn.n/settings64.sh
exit 1
fi
if [ ! -f "$1" ] ; then
echo \"$1\" file doesn''t exist
exit 1
fi
if vivado -mode batch -nolog -nojournal -source /dev/stdin -tclargs "$1" <<"EOF"
# Tcl script begins here.
set bitfile [lindex $argv 0]
open_hw
connect_hw_server
open_hw_target [lindex [get_hw_targets -of_objects [get_hw_servers localhost*]] 0]
set thefpga [lindex [get_hw_devices] 0]
set_property PROGRAM.FILE "$bitfile" $thefpga
set_property PROBES.FILE {} $thefpga
current_hw_device $thefpga
refresh_hw_device -update_hw_probes false $thefpga
program_hw_devices $thefpga
# Tcl script ends here
EOF
then
echo -e "\nProgramming successful.\n"
else
echo -e "\nProgramming failed.\n"
fi
この bash script には Tcl scriptが含まれていることに注意してください。「vivado」コマンドに渡される arguments の 1 つは「-source /dev/stdin」です。これにより、 Vivado は standard inputから Tcl script を読み取ります。よく知られている「here document」メソッドは、「<<」の助けを借りて使用されます。
scriptの使用
上記の script をファイルに書き込みます (たとえば、 fpga_programという名前で)。次のようなコマンドを使用して、このファイルを実行可能にします。
$ chmod a+x fpga_program
scriptを実行する前に、次のようなコマンドで environment variables を設定します。
$ source /opt/xilinx/Vivado/2023.1/settings64.sh
このコマンドの「/opt/xilinx/Vivado/2023.1」の部分を変更して、 path がコンピューター上で Vivado がインストールされている場所を反映するようにします。
次に、次のようなコマンドで script を実行します。
$ ./program_fpga myproj.bit
もちろん、「myproj.bit」を bitstream ファイルの名前に変更します。
script の実行中にVivado は大量の出力を生成しますが、最後の行は「Programming successful」または「Programming failed」のいずれかになります。
scriptについてのコメント
この script は Vivado 2015.2 および Vivado 2023.1でテストされているため、 Vivadoのすべてのバージョンで動作する可能性が高いです。ただし、 Vivadoの最近のバージョンでは、ソフトウェアによって次の警告が表示されます。
WARNING: 'open_hw' is deprecated, please use 'open_hw_manager' instead.
script はこの警告にもかかわらず動作します。ただし、 Vivado の将来のバージョンでは、「open_hw」コマンドが認識されない可能性があります。このコマンドでエラーが発生する場合は、 script でこのコマンドを「open_hw_manager」に変更してください。
script に可能なもう 1 つの変更は、この script が生成する出力の量に関係します。テキスト出力をそれほど多くしたくない場合は、 redirection を追加して、出力が /dev/nullに送られるようにします。
これが必要な場合は、 scriptで次の行を見つけます。
if vivado -mode batch -nolog -nojournal -source /dev/stdin -tclargs "$1" <<"EOF"
次のように変更します。
if vivado -mode batch -nolog -nojournal -source /dev/stdin -tclargs "$1" > /dev/null <<"EOF"
hardware serverの停止
同じコンピュータで複数のバージョンの Vivado を使用する場合、 JTAG cableへの接続に問題が生じる可能性があります。この問題の原因は、 Vivado がハードウェアと通信する ( port 3121をリッスンする) ために TCP/IP server を使用するためです。 Vivado は必要に応じてこの server を自動的に起動します。
しかし、 server が Vivadoの 1 つのバージョンによって起動され、別のバージョンの Vivado が FPGAに接続しようとすると、通信が機能しない可能性があります。これは、 server のバージョンが Vivadoのバージョンと同じであるためです。この状況は、グラフィカル ユーザー インターフェイスで Hardware Manager を使用する場合にも発生します。
この問題が発生した場合、次のコマンドで server を停止できます。
$ killlall hw_server
server は、一定期間使用しないと自動的に実行を停止することに注意してください。