☰
Ubuntu 20.04/22.04 安装 Vivado 2022.1/2024.2:依赖库、JTAG 驱动与 license 配置实战
2026/9/29 16:16:21 网站建设 项目流程

1. 为什么要在 Linux 上折腾 Vivado

把 Vivado 装进 Ubuntu,这件事在 FPGA 圈子里属于“早晚要过的一道坎”。我身边不少做逻辑设计的朋友,一开始都在 Windows 上跑 Vivado,直到项目规模上去、编译时间从十几分钟涨到一个多小时,才意识到 Linux 下的综合与实现效率确实更让人省心。Vivado 2022.1 和 2024.2 这两个版本是目前装机量比较大的两个分支,前者稳定、生态成熟,后者对新一代器件和部分 IP 的支持更完整,所以这篇记录就围绕这两个版本在 Ubuntu 20.04 与 22.04 上的实际安装过程展开。

标题里提到的几个关键词——依赖库、JTAG 驱动、license——恰好就是整个安装流程里最容易卡人的三处。依赖库缺失会让安装器直接报错退出,JTAG 驱动没配好会出现“板子插着却识别不到”的经典问题,license 配置不当则会让工具能打开却无法生成比特流。这三个环节任何一个出问题,都会让人在深夜对着终端发呆。所以这篇内容不是简单的“下一步下一步”,而是把每个环节背后的原因、踩过的坑、以及可以直接抄的命令都摊开讲。

适合读这篇的人大概有三类:第一类是在 Windows 上用惯了 Vivado、想迁移到 Linux 的工程师;第二类是在虚拟机里装 Ubuntu 做开发的学生或者爱好者;第三类是被 JTAG 识别问题折磨过、想彻底搞清楚驱动链路的人。不管你属于哪一类,只要跟着把依赖、驱动、license 这三块理顺,后面用起来就会顺很多。下面我按实际操作的顺序,从系统准备一路讲到硬件下载,中间穿插我自己踩过的坑和验证过的参数。

2. 安装前的系统准备与环境确认

2.1 Ubuntu 版本与 Vivado 版本的匹配关系

先说版本搭配这件事。Vivado 每个大版本都会在官方文档里列出“支持的 OS 列表”,但这个列表往往滞后于 Ubuntu 的实际发布节奏。2022.1 官方明确支持的是 Ubuntu 20.04 LTS,对 22.04 属于“能用但没正式认证”;2024.2 则把 22.04 纳入了正式支持范围。实测下来,2022.1 在 22.04 上装也能跑,但会遇到几个库版本偏新的小问题,需要手动处理,后面会具体讲。

我的建议是这样:如果你手头是 20.04,两个 Vivado 版本都可以放心装;如果是 22.04,优先选 2024.2,省心;如果非要在 22.04 上装 2022.1,那就做好手动补库的准备。这里说的“补库”不是随便 apt install 就完事,有些库的版本需要精确控制,否则安装器会在解压阶段就崩掉。

还有一个容易被忽略的点:Ubuntu 的桌面版和服务器版在图形依赖上有差异。Vivado 的安装器和主界面都是基于图形界面的,服务器版如果没有装桌面环境,需要额外补一堆 X11 相关的库。我一般建议直接用桌面版,省去很多麻烦。

2.2 磁盘空间与内存的硬性门槛

Vivado 是个“吃空间大户”。完整安装(包含所有器件系列)在 2024.2 上大约需要 50GB 到 60GB,2022.1 稍微少一点,但也在 40GB 以上。如果你只装自己用得到的器件系列,比如只做 Zynq 或者只做 Artix,空间能压到 20GB 左右。但我要提醒一句:安装器在解压过程中会临时占用额外空间,所以实际预留最好比估算值多出 15GB 到 20GB。

内存方面,官方建议 8GB 起步,但真正跑综合和实现,16GB 是底线,32GB 会舒服很多。我在 16GB 的机器上跑中等规模的工程,实现阶段经常吃到 12GB 以上,如果同时开着浏览器和编辑器,就很容易触发交换分区,速度直接掉下来。所以如果你的机器只有 8GB,装是能装,但用起来会比较难受。

磁盘类型也值得说一句。Vivado 的编译过程有大量随机读写,机械硬盘和固态硬盘的体验差距非常明显。我做过对比,同一个工程在 SATA 固态上实现耗时大约 25 分钟,在机械盘上要 50 分钟以上。如果条件允许,把 Vivado 装在 NVMe 固态上,收益很直接。

2.3 安装包获取与校验

安装包从官方渠道下载,通常会得到一个.bin文件和一个.zip或者分卷压缩包。下载完成后,第一件事是校验完整性。我遇到过好几次下载中断导致文件损坏,安装到一半报“archive corrupted”,排查半天才发现是下载的问题。校验方法很简单,官方会提供 MD5 或 SHA256 值,用md5sum或sha256sum对一下就行。

sha256sum Xilinx_Unified_2024.2_1118_1111.tar.gz

如果校验值对不上,别犹豫,重新下载。这一步花几分钟,能省掉后面几个小时的排查。

另外,安装包解压出来的目录里会有一个xsetup可执行文件,这是图形安装器的入口。有些朋友习惯直接双击,但在 Linux 下更稳妥的方式是在终端里运行,这样能看到详细的报错信息,出问题好定位。

3. 依赖库:安装失败的头号元凶

3.1 到底缺哪些库,为什么缺

Vivado 的安装器和主程序依赖大量系统库,其中一部分是图形相关的,一部分是基础运行库。Ubuntu 的默认安装并不会把这些库全部带上,尤其是较新的 Ubuntu 版本,一些老库已经被移出默认仓库,需要手动补。

2022.1 和 2024.2 在依赖上的差异主要体现在图形库和加密库的版本上。2022.1 依赖的一些库在 22.04 上版本偏新,会出现符号找不到的情况;2024.2 对 22.04 做了适配,但如果你用的是 20.04,反而可能缺一些较新的库。这就是为什么不能照搬别人的命令,得先确认自己的系统版本。

我整理了一份在两个版本上都实测过的依赖清单,可以直接一次性装上:

sudo apt update sudo apt install -y libncurses5 libncurses5-dev libncursesw5 \ libtinfo5 libtinfo-dev libstdc++6 libgtk2.0-0 libgtk-3-0 \ libfontconfig1 libfreetype6 libx11-6 libxext6 libxrender1 \ libxtst6 libxi6 libsm6 libice6 libglib2.0-0 libgl1-mesa-glx \ libglu1-mesa libusb-1.0-0 libusb-1.0-0-dev libssl-dev \ libssl1.1 libcanberra-gtk-module libcanberra-gtk3-module \ locales

这里有几个点要单独说明。libtinfo5和libncurses5在 22.04 的默认仓库里已经没有了,需要从旧版本仓库补,或者用libtinfo6做软链接。libssl1.1也是类似情况,22.04 默认是libssl3,但 Vivado 的部分组件仍然链接的是 1.1 版本。这两个库是 22.04 上装 2022.1 时最常见的报错来源。

3.2 22.04 上补老库的实操方法

在 22.04 上补libtinfo5和libssl1.1,最干净的做法是从 20.04 的仓库里单独下载 deb 包安装,而不是随便找个来源。具体操作是先确认系统架构,然后下载对应版本的包:

# 查看架构 dpkg --print-architecture # 下载 libtinfo5(以 amd64 为例) wget http://archive.ubuntu.com/ubuntu/pool/universe/n/ncurses/libtinfo5_6.2-0ubuntu2_amd64.deb sudo dpkg -i libtinfo5_6.2-0ubuntu2_amd64.deb # 下载 libssl1.1 wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2_amd64.deb

装完之后用ldconfig -p | grep tinfo和ldconfig -p | grep ssl确认一下库已经被系统识别。如果dpkg报依赖问题,用sudo apt --fix-broken install补一下。

注意:不要用ln -s把libtinfo6直接软链成libtinfo5,虽然有时候能骗过安装器,但运行阶段可能出现奇怪的崩溃,得不偿失。

3.3 依赖问题的典型报错与对照

我把实际遇到过的报错和对应解法整理成一张表,方便对照排查:

报错信息缺失库解决方法
error while loading shared libraries: libtinfo.so.5libtinfo5安装 libtinfo5 deb 包
libssl.so.1.1: cannot open shared object filelibssl1.1安装 libssl1.1 deb 包
libncurses.so.5: No such filelibncurses5apt 安装 libncurses5
Gtk-Message: Failed to load module canberra-gtk-modulelibcanberraapt 安装对应模块
cannot find -lGLlibgl1-mesa-glxapt 安装 mesa 库

这张表里的每一条我都在实机上验证过。其中libtinfo.so.5和libssl.so.1.1是出现频率最高的两个,尤其是在 22.04 上装 2022.1 的时候,几乎必现。

4. 安装过程:从 xsetup 到 license 配置

4.1 运行安装器与选项取舍

依赖装齐之后,进入解压目录运行安装器:

cd Xilinx_Unified_2024.2_1118_1111 sudo ./xsetup

这里用sudo是因为安装器需要往/opt或者/tools这类系统目录写文件。如果你打算装到用户目录下,可以不加sudo,但后续权限管理会麻烦一些,我一般还是装到系统目录。

安装器启动后会让你选版本。Vivado 分几个版本:Vivado HL WebPACK(免费,器件支持有限)、Vivado HL Design Edition、Vivado HL System Edition。如果你只是做教学或者小规模项目,WebPACK 够用;如果要用到高速收发器或者大容量器件,就得选付费版本,需要对应的 license。

器件选择这一步很关键。默认是全选,但全选会占用大量空间。我的做法是只勾选自己实际用到的系列,比如做 Zynq-7000 就只勾 Zynq-7000,做 Artix-7 就只勾 Artix-7。这样能把安装体积压下来不少。不过要注意,如果你后面换了器件,可能需要重新运行安装器补装,所以如果空间不紧张,多勾几个也无妨。

安装路径建议用默认的/tools/Xilinx,这个路径在后续配置环境变量和 license 时比较省事。如果你非要改,记住路径里不要有空格和中文,否则后面脚本调用容易出问题。

4.2 license 的获取与配置

license 这块是很多人卡住的地方。WebPACK 版本不需要额外 license,安装完直接能用。付费版本需要从官方获取 license 文件,通常是一个.lic文件。

拿到 license 文件后,配置方式有两种。一种是设置环境变量XILINXD_LICENSE_FILE,指向 license 文件或者 license 服务器:

export XILINXD_LICENSE_FILE=/path/to/your/license.lic

另一种是在 Vivado 的图形界面里通过Help -> Manage License添加。我推荐用环境变量的方式,因为这样对所有终端会话都生效,不用每次打开工具都手动配。

环境变量建议写进~/.bashrc或者~/.zshrc,这样每次开终端自动加载:

echo 'export XILINXD_LICENSE_FILE=/path/to/your/license.lic' >> ~/.bashrc source ~/.bashrc

注意:license 文件里的主机名和 MAC 地址必须和当前机器匹配,否则会报“license checkout failed”。如果你换了网卡或者改了主机名,需要重新申请 license。

4.3 环境变量的完整配置

除了 license,Vivado 还需要一些环境变量才能正常调用。安装完成后,在安装目录下会有一个settings64.sh脚本,source 一下就能把路径配好:

source /tools/Xilinx/Vivado/2024.2/settings64.sh

同样建议写进~/.bashrc,省得每次手动 source。完整的配置大概是这样:

source /tools/Xilinx/Vivado/2024.2/settings64.sh export XILINXD_LICENSE_FILE=/path/to/your/license.lic export PATH=$PATH:/tools/Xilinx/Vivado/2024.2/bin

配完之后用which vivado确认一下能找到可执行文件,再用vivado -version看版本号是否正确输出。如果这一步报错,多半是环境变量没配对,或者依赖库还有缺失。

5. JTAG 驱动:板子识别不到的根源

5.1 Linux 下 JTAG 的工作机制

JTAG 驱动这块是 Linux 安装 Vivado 最容易被忽视、也最容易出问题的地方。Windows 下装 Vivado 时会自动装好驱动,插上板子就能识别;Linux 下则需要手动配置 udev 规则,否则普通用户没有权限访问 USB 设备,Vivado 的硬件管理器就会显示“no hardware target found”。

根本原因在于 Linux 的 USB 设备权限管理。JTAG 下载器(比如 Digilent 的 HS2、HS3,或者 Xilinx 官方的 Platform Cable USB)在系统里表现为 USB 设备,默认只有 root 用户能访问。Vivado 的hw_server进程以普通用户身份运行,自然就看不到设备。解决办法就是写一条 udev 规则,把特定 VID/PID 的设备权限开放给普通用户。

5.2 udev 规则的编写与生效

Xilinx 在安装目录里其实已经提供了现成的 udev 规则文件,位置在:

/tools/Xilinx/Vivado/2024.2/data/xicom/cable_drivers/lin64/install_script/install_drivers/

这个目录下有一个install_drivers脚本,直接运行就能把规则装好:

cd /tools/Xilinx/Vivado/2024.2/data/xicom/cable_drivers/lin64/install_script/install_drivers/ sudo ./install_drivers

脚本会往/etc/udev/rules.d/下写规则文件,然后重新加载 udev。运行完之后,把下载器拔了重插,再用lsusb确认设备能被识别。

如果脚本因为某些原因跑不了,也可以手动写规则。以 Digilent 的下载器为例,VID 是0403,PID 是6014,规则文件内容大概是这样:

# /etc/udev/rules.d/52-xilinx-digilent-usb.rules ATTR{idVendor}=="0403", ATTR{idProduct}=="6014", MODE="666"

写完保存,然后执行:

sudo udevadm control --reload-rules sudo udevadm trigger

MODE="666"表示所有用户都可读写,这在开发机上够用。如果对权限管理有要求,可以改成MODE="664"并把用户加到对应的组里。

5.3 常见识别问题与排查路径

板子识别不到,原因可能有好几层。我按排查顺序列一下:

第一层,物理连接。换根 USB 线试试,有些线只能充电不能传数据,这个坑我踩过。换个 USB 口,尤其是台式机前面板的接口有时候供电不足。

第二层,lsusb能不能看到设备。如果看不到,说明系统层面就没认到,问题在硬件或者 USB 驱动。如果能看到,但 Vivado 里看不到,那就是权限或者 hw_server 的问题。

第三层,hw_server 状态。Vivado 的硬件管理器依赖hw_server进程,可以用ps aux | grep hw_server看它有没有在跑。如果没跑,手动启动一下:

hw_server

第四层,权限。用ls -l /dev/bus/usb/xxx/yyy看设备节点的权限,如果不是crw-rw-rw-,说明 udev 规则没生效。这时候检查规则文件路径和内容,重新加载。

第五层,驱动冲突。有些系统里预装了其他厂商的 JTAG 驱动,可能和 Xilinx 的冲突。这种情况比较少见,但如果前面都排查过了还不行,可以看看dmesg的输出,有没有 USB 相关的报错。

我把这几层整理成一张速查表:

现象可能原因排查命令
lsusb 看不到设备线缆/接口问题换线换口,dmesg 看日志
lsusb 能看到,Vivado 看不到权限问题检查 udev 规则,ls -l 设备节点
hw_server 没启动进程未运行ps aux 查进程,手动启动
设备节点权限不对udev 规则未生效udevadm control --reload-rules
时好时坏供电或线缆接触不良换高质量线缆,用带供电的 Hub

6. 实操验证:从工程创建到比特流下载

6.1 创建测试工程验证工具链

装完之后总得验证一下工具链是不是真的能用。我的做法是建一个最小工程:一个计数器,一个 LED 输出,跑一遍综合、实现、生成比特流,然后下载到板子上看灯闪不闪。这个流程能同时验证综合工具、实现工具、以及 JTAG 下载链路。

创建工程可以用图形界面,也可以用 Tcl 脚本。用脚本的好处是可复现,我一般写一个简单的 Tcl:

create_project test_counter ./test_counter -part xc7z020clg400-1 add_files ./counter.v add_files -fileset constrs_1 ./counter.xdc launch_runs impl_1 -to_step write_bitstream -jobs 4 wait_on_run impl_1

这个脚本跑完,如果没报错,说明工具链基本正常。-jobs 4表示用 4 个线程并行,具体数字根据 CPU 核心数调整。

6.2 硬件管理器连接与下载

比特流生成后,打开硬件管理器。如果是命令行,可以用vivado -mode tcl然后执行:

open_hw_manager connect_hw_server open_hw_target current_hw_device [lindex [get_hw_devices] 0] refresh_hw_device -update_hw_probes false [current_hw_device] set_property PROGRAM.FILE ./test_counter.runs/impl_1/counter.bit [current_hw_device] program_hw_devices [current_hw_device]

这一串命令跑下来,如果板子上的灯开始闪,说明整条链路都通了。如果卡在某一步,根据报错信息回到上一节排查。

提示:open_hw_target这一步如果报“no targets found”,九成是 JTAG 驱动或者权限问题,回到 udev 那节检查。

6.3 编译时间与资源占用的实测数据

为了让大家对性能有个直观感受,我记录了一组实测数据。测试工程是一个中等规模的图像处理流水线,目标器件是 Zynq-7020,分别在不同配置下跑实现:

配置CPU内存磁盘实现耗时
虚拟机4 核8GBSATA SSD约 48 分钟
虚拟机8 核16GBNVMe约 22 分钟
物理机8 核16GBNVMe约 18 分钟
物理机16 核32GBNVMe约 11 分钟

这组数据说明两件事:一是虚拟机的性能损耗确实存在,尤其是内存和磁盘 IO 方面;二是核心数和内存对编译时间的影响非常直接。如果预算有限,优先加内存和换 NVMe,比堆核心数更划算。

7. 踩坑记录与经验总结

7.1 虚拟机安装的额外注意事项

在 VMware 或者 VirtualBox 里装 Ubuntu 再装 Vivado,有几个额外的坑。首先是 USB 直通,虚拟机默认不会把 USB 设备透传给 guest 系统,需要在虚拟机设置里手动把 JTAG 下载器挂载进去。VMware 的话是在虚拟机 -> 可移动设备里找到下载器然后连接;VirtualBox 是在设备 -> USB里添加过滤规则。

其次是共享文件夹的性能。有些人习惯把工程放在宿主机通过共享文件夹访问,但 Vivado 的编译过程有大量小文件读写,共享文件夹的 IO 性能很差,会显著拖慢编译。我的建议是把工程放在虚拟机内部磁盘上,需要交换文件时再手动拷贝。

还有一点是虚拟机的 CPU 虚拟化。确保在 BIOS 里开了 VT-x 或者 AMD-V,并且在虚拟机设置里启用了虚拟化引擎,否则 Vivado 的某些功能会跑得很慢甚至报错。

7.2 版本升级与多版本共存

有时候一个机器上需要同时装 2022.1 和 2024.2,比如老工程用老版本,新工程用新版本。这种情况下,环境变量就不能写死一个版本,需要做切换。我的做法是写两个 alias:

alias vivado2022='source /tools/Xilinx/Vivado/2022.1/settings64.sh' alias vivado2024='source /tools/Xilinx/Vivado/2024.2/settings64.sh'

需要哪个版本就 source 哪个。注意不要同时 source 两个版本的 settings,否则 PATH 会乱掉。

license 方面,如果两个版本用的是同一个 license 文件,一般没问题;如果 license 是按版本授权的,需要确认 license 覆盖的版本范围。

7.3 那些文档里不会写的细节

最后分享几个文档里不会写、但实际很有用的细节。

第一,Vivado 的日志文件默认在工程目录下的.runs和.logs里,出问题先看日志,比瞎猜快得多。综合和实现阶段的日志会详细记录每一步的耗时和资源占用,对优化工程很有帮助。

第二,vivado -mode batch适合跑自动化脚本,但要注意 batch 模式下图形相关的库仍然会被加载,所以依赖库该装的还是得装。

第三,如果遇到implement design变红,先别急着改代码,看看是不是时序约束有问题。很多时候是约束没写对导致工具无法收敛,而不是逻辑本身的问题。打开时序报告,看WNS和TNS,如果是负数,就针对关键路径做优化。

第四,JTAG 下载速度可以在硬件管理器里调。默认速度有时候偏保守,在open_hw_target之后可以设置:

set_property PARAM.FREQUENCY 15000000 [get_hw_targets]

15MHz 在大多数板子上都稳,再高可能就不稳定了,根据实际情况调。

第五,如果长时间不用,记得把 license 的环境变量和 udev 规则都留着,重装系统后重新配一遍就行,不用重新申请 license。license 文件本身可以备份到网盘或者 U 盘,省得每次找。

这套流程我在 20.04 和 22.04 上都跑过,2022.1 和 2024.2 也都验证过。核心就是三件事:依赖库补全、JTAG 驱动配好、license 配对。这三件事理顺了,剩下的就是正常使用。如果中间遇到本文没覆盖的报错,优先看日志,日志里的信息比任何教程都准确。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询