介绍
将比特流(bitstream)发送到 FPGA 通常需要使用图形用户界面。 Vivado的 Hardware Manager 等工具提供了此功能,但是对于这个简单的任务来说,该过程通常感觉太复杂了。特别是,当只有一 FPGA 通过一 JTAG cable连接到计算机时,用户界面需要很多不必要的步骤。如果只有一 FPGA,为什么计算机不能推断出它应该将比特流文件写入这 FPGA?为什么需要明确告诉工具我们想要做什么?实际上只有一个选择。
一个可能的解决方案是使用一个可以一步完成这个任务的 bash 脚本。这个脚本(script)通过 JTAG cable找到连接到电脑的 FPGA ,并将比特流文件发送给这 FPGA。
脚本(script)
这是将比特流文件发送到 FPGA的脚本:
#!/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 脚本包含一个 Tcl 脚本。提供给“vivado”命令的 arguments 之一是“-source /dev/stdin”。这导致 Vivado 从标准输入(standard input)读取 Tcl 脚本。在“<<”的帮助下,可以使用众所周知的“here document”方法。
使用脚本
将上面显示的脚本写入文件,例如名为 fpga_program。使用以下命令使此文件可执行:
$ chmod a+x fpga_program
在尝试运行脚本之前,请使用类似以下命令设置 environment 变量:
$ source /opt/xilinx/Vivado/2023.1/settings64.sh
更改此命令中的“/opt/xilinx/Vivado/2023.1”部分,以便路径(path)反映计算机上安装 Vivado 的位置。
然后使用以下命令运行脚本:
$ ./program_fpga myproj.bit
当然,将“myproj.bit”更改为您的比特流文件的名称。
当脚本运行时,Vivado 会产生大量输出,但最后一行要么是“Programming successful”,要么是“Programming failed”。
关于脚本的一些评论
此脚本已在 Vivado 2015.2 和 Vivado 2023.1上进行了测试,因此很有可能适用于所有版本的 Vivado。但是,对于较新版本的 Vivado,该软件会打印出以下警告:
WARNING: 'open_hw' is deprecated, please use 'open_hw_manager' instead.
尽管有此警告,脚本仍可正常工作。但是,未来版本的 Vivado 可能无法识别“open_hw”命令。如果此命令导致错误,请在脚本中将此命令更改为“open_hw_manager”。
脚本的另一个可能变化与脚本生成的输出量有关。如果您不想要那么多文本输出,请添加 redirection ,以便输出转到 /dev/null。
如果你想要这个,请在脚本中找到此行:
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 使用 TCP/IP server 与硬件通信(监听端口 3121(port 3121))。 Vivado 会根据需要自动启动此 server 。
但是如果 server 是由某个版本的 Vivado启动的,而另一个版本的 Vivado 尝试与 FPGA连接,则通信可能不起作用。原因是 server 的版本与 Vivado的版本相同。使用带有图形用户界面的 Hardware Manager 时也会发生这种情况。
出现该问题时,可以用以下命令停止 server :
$ killlall hw_server
请注意,如果一段时间内不使用, server 会自动停止运行。