1. 为什么要在 CentOS 上折腾 Vivado
先把话说在前头:如果你只是想在 Windows 上点几下装个 Vivado 跑跑例程,那这篇内容可能不太适合你。但如果你手头有一台跑着 CentOS 的服务器或者工作站,想把它变成一台正经的 FPGA 开发机,那咱们就是同路人了。
Vivado 是 Xilinx(现在叫 AMD)那套 FPGA 开发工具链的核心,从综合、实现到生成比特流,全流程都靠它。官方主推的安装环境是 Windows 和 Ubuntu,CentOS 并不在“官方最舒服”的名单里。但现实情况是,很多公司的编译服务器、CI 机器、还有一堆老机房里的工作站,跑的都是 CentOS 7.9。你不可能为了装个 Vivado 就把整台机器的系统换掉,所以“在 CentOS 上把 Vivado 部署起来”这件事,就成了一项必须啃下来的硬骨头。
这篇内容要解决的就是这个问题:从零开始,在一台干净的 CentOS 7.9 上,把 Vivado 完整装好、依赖补齐、驱动搞定、License 配好,最后能正常连板子、跑综合、出比特流。我会把每一步背后的原因讲清楚,把踩过的坑标出来,让你少走弯路。适合谁看?适合有基本 Linux 操作能力、手上有 CentOS 机器、准备入门或者正在做 FPGA 开发的工程师。哪怕你之前没碰过 Vivado,跟着走也能装起来。
2. 装之前必须想清楚的几件事
2.1 版本选择:别盲目追新
Vivado 的版本号是“年份.季度”的格式,比如 2022.2 就是 2022 年第二季度发布的版本。热词里出现了vivado 2022.2安装教程和vivado 2018下载,说明大家在这两个版本之间纠结得比较多。我的建议很直接:看你手头的板子和 IP 核支持哪个版本。
- 如果你用的是比较新的器件(比如 Versal、UltraScale+ 的新型号),那必须用较新的版本,2020.2 以后基本是底线。
- 如果你用的是老器件(比如 Spartan-6、Virtex-5 这些),那反而要用老版本,2018.3 是很多老项目的“黄金版本”,因为新版本早就把老器件的支持砍掉了。
- 如果你只是学习,跟着教程走,那就选教程用的版本,避免版本差异带来的界面和流程不一致。
这里有个很多人忽略的点:Vivado 的 Linux 安装包是分版本的,但安装器本身对 CentOS 的兼容性在不同版本间差异很大。2020 以前的版本在 CentOS 7 上相对好搞,2021 以后的版本对系统库的要求更高,尤其是 glibc 的版本。CentOS 7.9 自带的 glibc 是 2.17,这个版本对于 Vivado 2022.2 来说是够用的,但如果你用的是更老的 CentOS 7.6 以下,就可能会遇到库版本不够的问题。
2.2 磁盘空间:别等装到一半才发现不够
Vivado 是个“空间杀手”。完整安装(所有器件系列都选上)能吃掉 100GB 以上。就算你只选一两个器件系列,加上安装器本身、临时文件、后续的工程文件,预留 150GB 是比较稳妥的。热词里有centos扩容,我猜不少人就是装到一半发现磁盘满了才去搜扩容的。
我的做法是:单独挂一块盘给 Vivado,挂载到/tools/Xilinx这样的路径下。这样以后重装系统或者升级版本,工程和工具都还在。用df -h先看一眼,确认目标分区有足够空间再动手。
2.3 依赖库:CentOS 的“先天不足”
Vivado 的安装器和运行环境依赖一大堆 32 位和 64 位的库。CentOS 7 默认安装是不带这些的,尤其是 32 位的兼容库。如果你装的是最小化安装的 CentOS,那缺的库就更多了。这一步是后面安装失败的头号原因,所以我会在下一节专门讲怎么把依赖一次性补齐。
3. 系统准备与依赖补齐实操
3.1 系统基础环境确认
先确认你的系统版本和架构:
cat /etc/centos-release uname -m输出应该是CentOS Linux release 7.9.2009 (Core)和x86_64。Vivado 不支持 32 位系统,也不支持 ARM 架构的 CentOS(除非你用 QEMU 模拟,那性能没法看)。确认是 x86_64 之后再往下走。
接着更新一下系统,把已有的包升到最新:
sudo yum update -y这一步不是必须的,但能避免一些因为旧包导致的依赖冲突。更新完建议重启一次,确保内核和库都是最新的。
3.2 一次性补齐所有依赖库
这是整个部署过程中最关键的一步。我把 Vivado 在 CentOS 7 上需要的库整理成了一个安装命令,你可以直接复制执行:
sudo yum install -y epel-release sudo yum install -y libstdc++.i686 libgcc.i686 glibc.i686 \ ncurses-libs.i686 ncurses-devel.i686 libXext.i686 libXrender.i686 \ libXtst.i686 libXi.i686 libXft.i686 libXp.i686 libXmu.i686 \ libpng12 libpng12.i686 libjpeg-turbo.i686 freetype.i686 \ fontconfig.i686 libselinux.i686 libXcomposite.i686 libXdamage.i686 \ libXrandr.i686 libXcursor.i686 libXfixes.i686 libXinerama.i686 \ gtk2.i686 gtk2-engines.i686 PackageKit-gtk3-module.i686 \ libcanberra-gtk2.i686 alsa-lib.i686 libXScrnSaver.i686 \ libxml2.i686 libxslt.i686 zlib.i686 bzip2-libs.i686 \ compat-libstdc++-33.i686 compat-libstdc++-33.x86_64 \ libaio.i686 libaio.x86_64这里面的逻辑是:Vivado 的图形界面是基于 GTK2 的,所以需要一堆 X11 相关的 32 位库;安装器本身是 Java 写的,需要 glibc 和 libstdc++ 的 32 位版本;还有一些是给 USB 驱动和串口通信用的。
注意:
libpng12这个包在 CentOS 7 的默认源里可能没有,需要先装 epel-release。如果还是找不到,可以去网上找一个libpng12的 rpm 包手动安装。这个库是 Vivado 图形界面的硬依赖,缺了它安装器根本起不来。
装完之后,用ldd检查一下关键库是否都能找到:
ldd /path/to/vivado/installer/xsetup | grep "not found"如果输出为空,说明依赖齐了。如果有not found,就根据缺失的库名去 yum 里搜对应的包补上。
3.3 关闭 SELinux 和防火墙(可选但推荐)
SELinux 有时候会阻止 Vivado 访问某些设备文件,尤其是后面连板子的时候。如果你不想在调试驱动时被 SELinux 折腾,可以临时把它设为 permissive:
sudo setenforce 0要永久生效就改/etc/selinux/config,把SELINUX=enforcing改成SELINUX=permissive。防火墙一般不影响 Vivado 的本地使用,但如果你要用硬件服务器或者远程调试,可能需要放行相关端口。这个看你的实际场景,不是必须的。
4. Vivado 安装过程详解
4.1 下载与解压安装包
Vivado 的安装包是一个自解压的 bin 文件,从 AMD 官网下载。文件名类似Xilinx_Unified_2022.2_1014_8888.tar.gz。下载完之后先解压:
tar -xzf Xilinx_Unified_2022.2_1014_8888.tar.gz cd Xilinx_Unified_2022.2_1014_8888解压出来会有一个xsetup文件,这就是安装器。给它加上执行权限:
chmod +x xsetup4.2 启动安装器:图形界面还是命令行
Vivado 的安装器支持图形界面和命令行两种模式。如果你有 X11 转发或者直接在桌面环境下操作,直接运行:
./xsetup如果你是在纯命令行服务器上装,没有图形界面,那就用批处理模式:
./xsetup -b ConfigGen这个命令会生成一个配置文件模板,你编辑好之后再运行:
./xsetup -b Install -c config.txt配置文件里主要填这几项:安装路径、要装的器件系列、是否安装 Cable Drivers、是否安装 DocNav。我一般会把安装路径设成/tools/Xilinx,器件系列根据实际用的板子选,Cable Drivers 一定要勾上,不然连不上板子。
4.3 安装过程中的选项取舍
图形界面安装的话,流程大概是:欢迎页 -> 选择版本(Vivado HL WebPACK / System Edition / Design Edition)-> 选择器件 -> 选择安装组件 -> 同意协议 -> 选择安装路径 -> 开始安装。
这里有几个点值得说:
- 版本选择:WebPACK 是免费的,但只支持部分小器件。如果你用的是 Kintex-7、Artix-7 这些,WebPACK 够用。但如果你用的是 Zynq UltraScale+ 或者 Versal,那就必须用 System Edition 或者 Design Edition,这俩是要 License 的。
- 器件选择:别全选,全选能多占几十 GB。只选你实际用到的系列。比如你只用 Zynq-7000,那就只勾 Zynq-7000。
- Cable Drivers:这个必须勾。它包含了 Xilinx Platform Cable USB 的驱动,后面连板子全靠它。热词里有人搜
xilinx platform cable usb firmware loader windows无法加载这个硬件的设备驱动,那是 Windows 下的问题,Linux 下驱动是集成在 Vivado 里的,但前提是你安装时勾了这个选项。
安装过程大概需要 30 分钟到 1 小时,取决于磁盘速度和选的组件多少。期间安装器会往系统里写一些 udev 规则,用于识别 USB 下载器。
4.4 安装后的目录结构
装完之后,/tools/Xilinx下会有这样的结构:
/tools/Xilinx/ ├── Vivado/ │ └── 2022.2/ │ ├── bin/ # 可执行文件 │ ├── data/ # 器件数据 │ ├── lib/ # 库文件 │ └── scripts/ # 各种脚本 ├── Vitis/ # 如果装了 Vitis 也会有 └── .xinstall/ # 安装记录日常使用主要是把bin目录加到 PATH 里:
export PATH=/tools/Xilinx/Vivado/2022.2/bin:$PATH写到~/.bashrc里,下次登录自动生效。
5. 驱动、License 与硬件连接
5.1 Cable Driver 的安装与验证
如果你安装时勾了 Cable Drivers,Vivado 会自动装好 udev 规则。但有时候需要手动触发一下:
cd /tools/Xilinx/Vivado/2022.2/data/xicom/cable_drivers/lin64/install_script/install_drivers sudo ./install_drivers这个脚本会往/etc/udev/rules.d/下写规则文件,然后重新加载 udev。执行完之后,插上 Xilinx Platform Cable USB,用lsusb看一下:
lsusb | grep Xilinx应该能看到类似Bus 001 Device 005: ID 03fd:0008 Xilinx, Inc.的输出。如果看不到,说明驱动没装好,或者线没插紧。
注意:如果你用的是第三方兼容下载器(比如 Digilent 的),可能需要额外装 Digilent 的驱动。Xilinx 官方的 Cable Driver 只认官方下载器。
5.2 License 的获取与配置
WebPACK 版本不需要 License,装完就能用。但如果你用的是需要 License 的版本,就得去 AMD 官网申请。申请的时候需要提供网卡 MAC 地址,所以先查一下:
ip link show找到你的有线网卡,记下 MAC 地址。然后在官网填申请,会得到一个.lic文件。把这个文件放到一个固定路径,比如/tools/Xilinx/licenses/,然后设置环境变量:
export XILINXD_LICENSE_FILE=/tools/Xilinx/licenses/Xilinx.lic或者用LM_LICENSE_FILE也行。写到~/.bashrc里。验证 License 是否生效:
vivado -mode batch -source check_license.tclcheck_license.tcl里就一行puts [get_license]。如果输出里有你的 License 信息,就说明配好了。
5.3 连接板子并识别器件
驱动和 License 都搞定之后,就可以连板子测试了。把下载器插到板子的 JTAG 口,然后打开 Vivado 的 Hardware Manager:
vivado -mode gui在 Hardware Manager 里点 Open Target -> Auto Connect。如果一切正常,应该能看到器件列表。如果报错说找不到器件,先检查这几点:
- 下载器的 USB 线是不是插在 USB 3.0 口上(有些下载器对 USB 2.0 兼容性不好)
- 板子有没有上电
- JTAG 线有没有插反
- udev 规则有没有生效(可以
sudo udevadm control --reload-rules再试)
热词里有人搜vivado安装驱动无法识别板子,大概率就是这几步里某一步没做对。
6. 常见问题与排查技巧实录
6.1 安装器启动报错“找不到 libpng12”
这是 CentOS 7 上最常见的问题。libpng12在默认源里没有,需要手动装。去网上找一个libpng12-1.2.50-10.el7.x86_64.rpm,然后:
sudo rpm -ivh libpng12-1.2.50-10.el7.x86_64.rpm如果提示依赖冲突,加--nodeps强制装。这个库只被 Vivado 用,不会影响系统其他部分。
6.2 安装到一半卡住或者报“磁盘空间不足”
先df -h看是哪个分区满了。如果是/tmp满了,可以临时把TMPDIR指到别的地方:
export TMPDIR=/tools/tmp mkdir -p /tools/tmp然后再重新运行安装器。如果是安装目标分区满了,那就只能扩容或者换路径了。热词里的centos扩容就是干这个的,用 LVM 的话可以lvextend加空间,不是 LVM 的话就得用 GParted 之类的工具调整分区。
6.3 综合时 implement design 变红
热词里有vivado implement design变红,这个问题的原因很多。最常见的是时序不满足,或者引脚约束有问题。先看 Tcl Console 里的报错信息,找到具体的 critical warning 或者 error。如果是时序问题,可以试着降低时钟频率或者优化代码;如果是引脚约束问题,检查 XDC 文件里的引脚号是不是和板子原理图对得上。
6.4 常见问题速查表
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 安装器启动报错缺库 | 32 位兼容库没装 | 按 3.2 节的命令补齐依赖 |
| 安装中途卡住 | 磁盘空间不足或 TMPDIR 满 | 检查 df -h,设置 TMPDIR |
| 连不上板子 | 驱动没装或 udev 规则没生效 | 重装 Cable Driver,reload udev |
| License 报错 | 环境变量没设或 MAC 地址不对 | 检查 XILINXD_LICENSE_FILE,重新申请 |
| 综合报错 | 代码或约束问题 | 看 Tcl Console 具体报错,逐条排查 |
| 图形界面花屏 | 显卡驱动或 X11 配置问题 | 换用命令行模式,或更新显卡驱动 |
6.5 几个独家避坑技巧
第一个技巧:安装前先建一个快照。如果你用的是虚拟机,装 Vivado 之前打个快照。万一装崩了,回滚比卸载重装快得多。Vivado 的卸载器不太好用,有时候卸不干净,残留的文件和注册表项会影响下次安装。
第二个技巧:把安装包和 License 放在同一个目录。这样以后重装或者迁移的时候,不用到处找文件。我习惯在/tools/Xilinx下建一个install目录,专门放安装包和 License。
第三个技巧:用vivado -mode batch跑自动化脚本。如果你要频繁地综合同一个工程,可以写一个 Tcl 脚本,用批处理模式跑,比开图形界面快得多,也省资源。比如:
open_project /path/to/project.xpr reset_run synth_1 launch_runs synth_1 -jobs 8 wait_on_run synth_1 launch_runs impl_1 -to_step write_bitstream -jobs 8 wait_on_run impl_1这个脚本可以直接在 CI 里跑,配合 Jenkins 或者 GitLab CI,实现自动出比特流。
7. 装完之后还能做点什么
Vivado 装好只是第一步。如果你后面要做 FPGA 图像处理、MIPI 实现、或者 Aurora 8b/10b 这些高速接口,那还需要装对应的 IP 核和参考设计。热词里提到的xilinx aurora 8b/10b ip核、fpga实现mipi、xilinx ltpi ip,这些都是在 Vivado 里通过 IP Catalog 来添加的。装好 Vivado 之后,这些 IP 核大部分是随工具一起安装的,少部分需要单独下载。
另外,如果你要做 AI 相关的加速,比如pytorch fpga或者xilinx 7045 xadc功能,那可能还需要装 Vitis 或者 Vitis AI。这些工具的安装方式和 Vivado 类似,也是用 Xilinx Unified Installer,可以在同一个安装器里勾选。
我个人在实际操作中的体会是:CentOS 上装 Vivado,难点不在 Vivado 本身,而在系统环境的准备。把依赖库补齐、磁盘空间留够、驱动装对,后面就是一马平川。最怕的就是装到一半发现缺库或者空间不够,那种进退两难的感觉最难受。所以宁可前期多花十分钟检查,也不要中途返工。
最后再分享一个小技巧:如果你有多台 CentOS 机器要装 Vivado,可以把装好的/tools/Xilinx目录直接打包,拷到其他机器上,然后只需要重新跑一遍 Cable Driver 的安装脚本和设置环境变量就行。这样比每台机器都跑一遍安装器快得多。当然,前提是这些机器的系统版本和架构一致。