目录
[1. 简介](#1. 简介)
[2. VIO 配置](#2. VIO 配置)
[2.1 VIO IP](#2.1 VIO IP)
[2.2 VIO 对比 ILA](#2.2 VIO 对比 ILA)
[3. VIO 示例](#3. VIO 示例)
[3.1 Led](#3.1 Led)
[3.1.1 工程配置](#3.1.1 工程配置)
[3.1.2 效果展示](#3.1.2 效果展示)
[3.2 Key](#3.2 Key)
[3.2.1 工程配置](#3.2.1 工程配置)
[3.2.1 效果展示](#3.2.1 效果展示)
[3.3 门控触发](#3.3 门控触发)
[3.3.1 工程配置](#3.3.1 工程配置)
[3.3.2 效果展示](#3.3.2 效果展示)
[4. 远程调试](#4. 远程调试)
[4.1 配置目标主机](#4.1 配置目标主机)
[4.2 配置本机](#4.2 配置本机)
[4.3 vmWare 网线直连](#4.3 vmWare 网线直连)
[5. 远程综合实现](#5. 远程综合实现)
[5.1 设置 SSH 密钥代理转发](#5.1 设置 SSH 密钥代理转发)
[5.2 设置 dash](#5.2 设置 dash)
[5.3 测试连通](#5.3 测试连通)
[5.4 统一文件](#5.4 统一文件)
[5.4.1 本地机 NFS 共享](#5.4.1 本地机 NFS 共享)
[5.4.2 远程机 NFS 客户端](#5.4.2 远程机 NFS 客户端)
[5.5 执行远程编译](#5.5 执行远程编译)
[5.5.1 设置环境变量](#5.5.1 设置环境变量)
[5.5.2 选择 remote hosts](#5.5.2 选择 remote hosts)
[6. X11-forwarding 转发](#6. X11-forwarding 转发)
[7. 附](#7. 附)
[7.1 启用共享导致 DUP](#7.1 启用共享导致 DUP)
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 灯的状态(亮或灭)。
cpp
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 约束:
bash
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 配置目标主机
1)确保连通信
通过 ping 能否发现目标主机。
在目标主机上启动 hw_server。我的目标主机 IP 地址为:192.168.101.220。
bash
# 目录: /opt/Xilinx/Vivado/2022.1/bin
# 运行如下程序
>> ./hw_server
2)出现如下信息表示启动服务成功:
bash
****** Xilinx hw_server v2022.1
**** Build date : Apr 18 2022 at 16:10:30
** Copyright 1986-2022 Xilinx, Inc. All Rights Reserved.
INFO: hw_server application started
INFO: Use Ctrl-C to exit hw_server application
INFO: To connect to this hw_server instance use url: TCP:ubuntu:3121
4.2 配置本机
1)在本机 Vivado 中,选件打开新的目标(Open New Target)。
2)输入目标主机的 IP,端口保持默认。
3)启动后,成功发现目标主机。
4)可进行正常程序下载和调试
4.3 vmWare 网线直连
1)打开 vmWave 中的网络编辑器
打开:菜单栏 -> 编辑(E) -> 虚拟网络编辑器(N)
2)配置虚拟网络
如果电脑包含多个网卡,需要选择对应网卡(和 FPGA 相连的主机)。
此步骤会生成对应的虚拟网络适配器。
上图三个配置中,由于桥接模式会直接连接到相关网络硬件,不会生成虚拟网络适配器,另外两个配置,均会生成对应的虚拟网络适配器。如下图:
三者区别:
- VMnet0,桥接模式,虚拟机相当于一台实体机,可以与外网互相 ping 通。
- VMnet1,仅主机模式,虚拟机之间、主机与虚拟机之间互访,但虚拟机无法访问外网。
- VMnet8,NAT 模式,虚拟机之间、主机与虚拟机之间互访,虚拟机可以通过主机的 VMnet8 访问外网,外网无法ping通虚拟机。
3)应用虚拟网络
在虚拟机实体中,选择某一个虚拟网络适配器,下面这个配置选择了 VMnet0,即桥接模式。
5. 远程综合实现
5.1 设置 SSH 密钥代理转发
bash
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)测试
bash
ssh fo@192.168.137.3
可以直接建立连接而无需密码,则成功。
5.2 设置 dash
1)查看当前 sh 设置
bash
ll /bin/sh
---
lrwxrwxrwx 1 root root 4 7月 30 19:35 /bin/sh -> dash*
2)重新配置 dash
bash
sudo dpkg-reconfigure dash
否希望将 dash 作为 /bin/sh 的默认选项?
- 是,系统会将 /bin/sh 的链接指向 dash。
- 否,则 sh 将继续链接到 bash 或其他当前设置的 shell。
注意:远程、本地都需要运行一遍。
5.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)
即表示连接成功。
5.4 统一文件
5.4.1 本地机 NFS 共享
1)在本地主机安装 NFS 服务器
bash
sudo apt update
sudo apt install nfs-kernel-server
2)创建共享目录
bash
sudo mkdir /nfsroot
sudo chown nobody:nogroup /nfsroot
sudo chmod 777 /nfsroot
3)配置NFS导出文件,编辑/etc/exports文件,添加共享目录及其权限
bash
sudo nano /etc/exports
在文件中添加以下行:
bash
/nfsroot *(rw,sync,no_subtree_check,no_root_squash)
4)使配置生效,重启 NFS 服务器
bash
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
5)验证 NFS 服务器
在本地机器上运行:
bash
>> showmount -e
---
Export list for ubuntu:
/nfsroot *
在远程机上运行:
bash
>> showmount -e 192.168.137.2
---
Export list for 192.168.137.2:
/nfsroot *
均表示 NFS 服务器生效。
5.4.2 远程机 NFS 客户端
1)安装 NFS 客户端
bash
sudo apt update
sudo apt install nfs-common
2)查看 NFS 服务器上的共享目录
bash
>> showmount -e 192.168.137.2
---
Export list for 192.168.137.2:
/nfsroot *
3) 挂载NFS共享目录
创建一个本地目录作为挂载点,然后挂载NFS共享目录。
bash
sudo mkdir /nfsroot
sudo chmod 777 /nfsroot
sudo mount -t nfs 192.168.137.2:/nfsroot /nfsroot
4)查看挂载的目录
挂载成功后,可以在远程机上使用 ls 命令查看挂载目录的内容:
bash
>> 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 共享目录,可以使用以下命令:
bash
sudo umount /nfsroot
5.5 执行远程编译
5.5.1 设置环境变量
在远程主机的 bashrc 中,添加环境变量:
bash
export XILINX_VIVADO="/opt/Xilinx/Vivado/2022.1"
export PATH="$PATH:$XILINX_VIVADO/bin"
5.5.2 选择 remote hosts
6. X11-forwarding 转发
最直接,最方便。
如果网络延迟低,通过 X11-forwarding 可以更为方便使用远程主机。
在 MobaXTerm 中 SSH 执行命令:
bash
>> 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 图形界面:
7. 附
7.1 启用共享导致 DUP
bash
>> 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 消失:
bash
>> 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