目录
1. 简介
分享 Vivado 远程开发的一些实用干货:
- 远程 JTAG Debug
- 远程综合实现(Run on remote hosts)
- vmWare 网络配置
- NFS 文件共享
- X11-forwarding
附带介绍 VIO 核使用经验,Vivado 中的 ILA,不必多说,但凡需要抓取信号都要用到。相比于 ILA 善于捕获波形,而 VIO 则专注于静态信号的注入和输出。在没有不引入物理按键和 LED 灯的板卡中,非常好用。
本文分享三个案例,解释实际 VIO 常用到的几个场景(时钟门控信息、Key、Led)
测试板卡:Alinx XCKU5P
2. VIO 配置
2.1 VIO IP
每个 Probe_IN 或者 Probe_OUT 均可支持多比特。
2.2 VIO 对比 ILA
1)VIO(Virtual Input/Output)
主要特点:
- 动态控制:允许用户在FPGA运行时动态修改信号的值。
- 监视功能:可以实时监控信号的状态,帮助分析和调试。
- 灵活性:适用于测试不同的设计方案,而无需物理改动硬件。
2)ILA(Integrated Logic Analyzer)
主要特点:
- 信号捕获:可以配置触发条件,当这些条件满足时捕获信号数据。
- 时序分析:帮助检测和分析信号之间的时序问题。
- 深度分析:可以查看信号的历史数据,帮助理解复杂的逻辑问题。
3. VIO 示例
3.1 Led
3.1.1 工程配置
通过 VIO 指示状态。
led_blink 模块:
模块接收一个时钟信号 clk 并控制一个 LED 灯的状态(亮或灭)。
module led_blink(
input clk,
output reg led
);
parameter High_Time = 100_000_000 - 1;
reg [31:0] counter = 0;
always @(posedge clk) begin
if (counter < High_Time) begin
counter <= counter + 1;
end
else begin
counter <= 0;
led = ~led;
end
end
endmodule
XDC 约束:
set_property PACKAGE_PIN K22 [get_ports {CLK_IN_D_0_clk_p[0]}]
set_property IOSTANDARD DIFF_SSTL12 [get_ports {CLK_IN_D_0_clk_p[0]}]
3.1.2 效果展示
可以看到 LED 按照指定频率闪烁。
3.2 Key
3.2.1 工程配置
通过 VIO 触发 ILA。
3.2.1 效果展示
其中按键可以配置成多种模式:
- 文本
- 高电平有效的 Button(按下为高,松开为低)
- 低电平有效的 Button(按下为低,松开为高)
- 翻转 Button(按下则翻转高低电平)
3.3 门控触发
3.3.1 工程配置
通过 VIO 控制时钟的输出。
3.3.2 效果展示
4. 远程调试
4.1 网络连接
4.2 远程主机 hw_server
远程主机操作系统为:Windows 10 企业版
1)安装 Hardware Server 服务:
2)安装后目录结构(在对应目录,按住 shift,右键单击空白处,打开 powershell):
>> ls C:\Xilinx\HWSRVR\202x.x
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2025/ bin
d----- 2025/ data
d----- 2025/ lib
d----- 2025/ scripts
d----- 2025/ tps
3)启动 hw_server 服务,直接运行脚本即可:
****** Xilinx hw_server v2022.1
**** Build date : Apr 18 2022 at 16:02:36
** Copyright 1986-2022 Xilinx, Inc. All Rights Reserved.
INFO: hw_server application started
INFO: Use Ctrl-C to exit hw_server application
Server-Properties: {xxx}
INFO: To connect to this hw_server instance use url: TCP:xxx.xxx.xxx.xxx:3121
4.3 program_ftdi 编程
即便安装了最简单的 hw_server,也可以使用 program_ftdi 进行编程:
1)在 C:\Xilinx\HWSRVR\202x.x\bin 目录中,启动 powershell。
2)查看帮助信息:
PS C:\Xilinx\HWSRVR\202x.x\bin> .\program_ftdi -help
---
****** program_ftdi v2022.1
**** Build date : Apr 18 2022-16:02:33
** Copyright 1986-2021 Xilinx, Inc. All Rights Reserved.
Short Description:
Write/Read to FTDI EEPROM for Xilinx JTAG Tools support
Syntax:
program_ftdi {-write -ftdi=<ftdi_part> -serial=<serial_number> [options] |
-write -filein=<cfg_filein> |
-read [-fileout=<cfg_fileout>] |
-erase} [-help]
options:
Name Description
------------------------------------------------------------------------------------------------------
-f, -fdti Specify the ftdi device to be programmed <FT232H | FT2232H | FT4232H>
-s, -serial Serial number to be written into the EEPROM
[-v, --vendor] Vendor information
[-b, --board] Name of the board/product being programmed
[-d, -desc, -description] A short description of the board
-fi, -filein Input file with all fields to be written
[-fo, -fileout] File to which the FDI EEPROM should be read back
[-lh, -longhelp] Get long help description for program_ftdi util
Examples:
program_ftdi -write -ftdi FT2232H -serial 0ABC01 -vendor "my vendor co" -board "my board" -desc "my product desc"
program_ftdi -write -filein <path_to_config_file>
program_ftdi -read
program_ftdi -read -fileout <path_to_config_file>
program_ftdi -erase
3)编程示例:
.\program_ftdi -write -ftdi FT2232H -serial 0ABC01 -vendor "my vendor co" -board "my board" -desc "my product desc"
成功后有如下提示:
****** program_ftdi v2022.1
**** Build date : Apr 18 2022-16:02:33
** Copyright 1986-2021 Xilinx, Inc. All Rights Reserved.
INFO: ftdi part = FT2232H
INFO: Serial = 0ABC01
INFO: Detected 1 devices
INFO: Device location = 609
INFO: fwid=xxx
INFO: FTDI Programming Passed
4.4 配置本地主机
1)确保连通信
通过 ping 能否发现远程主机。
2)在本地主机 Vivado 中,选件打开新的目标(Open New Target)。
3)输入目标主机的 IP,端口保持默认。
4)启动后,成功发现目标主机。
5)可进行正常程序下载和调试
5. vmWare 网线直连
1)打开 vmWave 中的网络编辑器
打开:菜单栏 -> 编辑(E) -> 虚拟网络编辑器(N)
2)配置虚拟网络
如果电脑包含多个网卡,需要选择对应网卡(和 FPGA 相连的主机)。
此步骤会生成对应的虚拟网络适配器。
上图三个配置中,由于桥接模式会直接连接到相关网络硬件,不会生成虚拟网络适配器,另外两个配置,均会生成对应的虚拟网络适配器。如下图:
三者区别:
- VMnet0,桥接模式,虚拟机相当于一台实体机,可以与外网互相 ping 通。
- VMnet1,仅主机模式,虚拟机之间、主机与虚拟机之间互访,但虚拟机无法访问外网。
- VMnet8,NAT 模式,虚拟机之间、主机与虚拟机之间互访,虚拟机可以通过主机的 VMnet8 访问外网,外网无法ping通虚拟机。
3)应用虚拟网络
在虚拟机实体中,选择某一个虚拟网络适配器,下面这个配置选择了 VMnet0,即桥接模式。
6. 远程综合实现
6.1 设置 SSH 密钥代理转发
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub | ssh fo@192.168.137.3 "cat - >> ~/.ssh/authorized_keys"
ssh-add
1)ssh-keygen
生成 SSH 密钥对,-t rsa 指定密钥类型为 RSA,运行此命令后,系统通常会询问你保存密钥的位置(保持默认~/.ssh/id_rsa),以及输入一个密码(可选)来保护私钥。
生成两个文件:一个私钥文件(默认为 id_rsa)和一个公钥文件(默认为 id_rsa.pub)。私钥不应该泄露给任何人,而公钥可以安全地分享。
2)cat
这条命令用于将你的公钥添加到远端服务器的 authorized_keys 文件中,这是 SSH 服务器用来验证登录请求的公钥列表。设置后,当你使用 SSH 尝试从本地机器登录到远程服务器时,服务器可以通过比对 authorized_keys 中的公钥来验证你的身份,从而允许无密码登录。
3)ssh-add
ssh-add 命令用于将私钥添加到 SSH 代理中。
4)测试
ssh fo@192.168.137.3
可以直接建立连接而无需密码,则成功。
6.2 设置 dash
1)查看当前 sh 设置
ll /bin/sh
---
lrwxrwxrwx 1 root root 4 7月 30 19:35 /bin/sh -> dash*
2)重新配置 dash
sudo dpkg-reconfigure dash
否希望将 dash 作为 /bin/sh 的默认选项?
- 是,系统会将 /bin/sh 的链接指向 dash。
- 否,则 sh 将继续链接到 bash 或其他当前设置的 shell。
注意:远程、本地都需要运行一遍。
6.3 测试连通
或者在 TCL console 中执行:
exec ssh -q -o BatchMode=yes fo@192.168.137.3 who
---
fo pts/0 2024-12-17 11:18 (192.168.137.1)
fo :0 2024-12-17 10:59 (:0)
即表示连接成功。
6.4 统一文件
6.4.1 本地机 NFS 共享
1)在本地主机安装 NFS 服务器
sudo apt update
sudo apt install nfs-kernel-server
2)创建共享目录
sudo mkdir /nfsroot
sudo chown nobody:nogroup /nfsroot
sudo chmod 777 /nfsroot
3)配置NFS导出文件,编辑/etc/exports文件,添加共享目录及其权限
sudo nano /etc/exports
在文件中添加以下行:
/nfsroot *(rw,sync,no_subtree_check,no_root_squash)
4)使配置生效,重启 NFS 服务器
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
5)验证 NFS 服务器
在本地机器上运行:
>> showmount -e
---
Export list for ubuntu:
/nfsroot *
在远程机上运行:
>> showmount -e 192.168.137.2
---
Export list for 192.168.137.2:
/nfsroot *
均表示 NFS 服务器生效。
6.4.2 远程机 NFS 客户端
1)安装 NFS 客户端
sudo apt update
sudo apt install nfs-common
2)查看 NFS 服务器上的共享目录
>> showmount -e 192.168.137.2
---
Export list for 192.168.137.2:
/nfsroot *
3) 挂载NFS共享目录
创建一个本地目录作为挂载点,然后挂载NFS共享目录。
sudo mkdir /nfsroot
sudo chmod 777 /nfsroot
sudo mount -t nfs 192.168.137.2:/nfsroot /nfsroot
4)查看挂载的目录
挂载成功后,可以在远程机上使用 ls 命令查看挂载目录的内容:
>> ll /nfsroot/
---
total 60
drwxrwxrwx 4 nobody nogroup 4096 12月 17 14:29 ./
drwxr-xr-x 21 root root 4096 12月 17 15:17 ../
-rw-rw-r-- 1 fl fl 1896 12月 17 14:56 vivado.jou
-rw-rw-r-- 1 fl fl 10063 12月 17 14:56 vivado.log
-rw-rw-r-- 1 fl fl 21961 12月 17 14:56 vivado_pid12961.str
drwxrwxr-x 3 fl fl 4096 12月 17 14:28 v_tt/
drwxrwxr-x 3 fl fl 4096 12月 17 14:29 .Xil/
5)卸载NFS共享目录
如果需要卸载 NFS 共享目录,可以使用以下命令:
sudo umount /nfsroot
6.5 执行远程编译
6.5.1 设置环境变量
在远程主机的 bashrc 中,添加环境变量:
export XILINX_VIVADO="/opt/Xilinx/Vivado/2022.1"
export PATH="$PATH:$XILINX_VIVADO/bin"
6.5.2 选择 remote hosts
7. X11-forwarding 转发
最直接,最方便。
如果网络延迟低,通过 X11-forwarding 可以更为方便使用远程主机。
在 MobaXTerm 中 SSH 执行命令:
>> vivado
---
****** Vivado v2022.1 (64-bit)
**** SW Build 3526262 on Mon Apr 18 15:47:01 MDT 2022
**** IP Build 3524634 on Mon Apr 18 20:55:01 MDT 2022
** Copyright 1986-2022 Xilinx, Inc. All Rights Reserved.
start_gui
可以直接在本地打开远程主机的 Vivado IDE 图形界面:
8. 附
8.1 启用共享导致 DUP
>> ping -c 3 192.168.101.220
---
PING 192.168.101.220 (192.168.101.220) 56(84) bytes of data.
From 192.168.101.225 icmp_seq=1 Redirect Network(New nexthop: 220.101.168.192)
64 bytes from 192.168.101.220: icmp_seq=1 ttl=64 time=0.986 ms
64 bytes from 192.168.101.220: icmp_seq=1 ttl=64 time=0.986 ms (DUP!)
64 bytes from 192.168.101.220: icmp_seq=1 ttl=63 time=1.56 ms (DUP!)
64 bytes from 192.168.101.220: icmp_seq=1 ttl=63 time=1.56 ms (DUP!)
From 192.168.101.225 icmp_seq=2 Redirect Network(New nexthop: 220.101.168.192)
64 bytes from 192.168.101.220: icmp_seq=2 ttl=64 time=1.42 ms
64 bytes from 192.168.101.220: icmp_seq=2 ttl=64 time=1.42 ms (DUP!)
64 bytes from 192.168.101.220: icmp_seq=2 ttl=63 time=1.42 ms (DUP!)
64 bytes from 192.168.101.220: icmp_seq=2 ttl=63 time=1.42 ms (DUP!)
From 192.168.101.225 icmp_seq=3 Redirect Network(New nexthop: 220.101.168.192)
64 bytes from 192.168.101.220: icmp_seq=3 ttl=64 time=0.993 ms
64 bytes from 192.168.101.220: icmp_seq=3 ttl=64 time=0.993 ms (DUP!)
64 bytes from 192.168.101.220: icmp_seq=3 ttl=63 time=0.993 ms (DUP!)
64 bytes from 192.168.101.220: icmp_seq=3 ttl=63 time=0.993 ms (DUP!)
--- 192.168.101.220 ping statistics ---
3 packets transmitted, 3 received, +9 duplicates, +3 errors, 0% packet loss, time 2007ms
rtt min/avg/max/mdev = 0.986/1.228/1.561/0.242 ms
取消共享设置:
DUP 消失:
>> ping -c 3 192.168.101.220
---
PING 192.168.101.220 (192.168.101.220) 56(84) bytes of data.
64 bytes from 192.168.101.220: icmp_seq=1 ttl=64 time=0.784 ms
64 bytes from 192.168.101.220: icmp_seq=2 ttl=64 time=1.39 ms
64 bytes from 192.168.101.220: icmp_seq=3 ttl=64 time=1.10 ms
--- 192.168.101.220 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2011ms
rtt min/avg/max/mdev = 0.784/1.090/1.392/0.248 ms
Vivado的加速之路:Launch runs on Remote hosts-在下天锦