调试环境搭建:Vivado与SDK/Vitis安装、JTAG配置、串口终端设置

说实话,很多同学拿到Zynq板子第一件事就是急着写代码。但我见过太多人卡在环境搭建这一步,一卡就是好几天。调试环境没搭好,后面所有工作都是空中楼阁。

这一章,我带你一步步把地基打牢。咱们从工具安装讲起,到JTAG链路确认,再到串口能打印出"Hello World"。每一步我都会把踩过的坑指给你看。

2.1 工具链选型:Vivado + Vitis 还是 SDK?

先解决一个最实际的问题:到底装哪个版本?

对比项 Vivado + SDK (2019.1及之前) Vivado + Vitis (2019.2及之后)
IDE基础 Eclipse Eclipse + 统一平台
工程管理 独立SDK工程 统一平台工程
调试器 XSCT + GDB XSCT + GDB (集成度更高)
库支持 需手动添加 自动管理依赖
我个人推荐 老项目维护用 新项目首选

我个人习惯用Vivado 2020.1 + Vitis。为什么?因为2019.2刚出Vitis时bug不少,2020.1相对稳定。当然,如果你手头有老项目用的是SDK,也没必要强行迁移——工具只是手段,稳定才是王道。

小提示: 安装时记得勾选"Vitis Platform"组件。我见过有人只装了Vivado,打开Vitis发现找不到设备,又回头重装——白白浪费两小时。

2.2 安装流程与避坑指南

安装过程其实不复杂,但有几个关键点你必须注意。

2.2.1 安装前的准备

  • 硬盘空间: 至少预留100GB。完整安装大概需要60-80GB,但后续工程、IP库会持续膨胀。
  • 操作系统: Ubuntu 18.04/20.04 或 Windows 10 64位。我个人更推荐Linux,因为串口和JTAG驱动问题少很多。
  • 网络环境: 安装过程中需要下载大量文件,建议用有线网络,别用WiFi——我曾在咖啡馆下载到99%断线,心态直接崩了。

2.2.2 安装步骤(以Linux为例)

  1. 下载Xilinx Unified Installer,给执行权限:chmod +x Xilinx_Unified_2020.1_0602_1208_Lin64.bin
  2. 运行安装程序,选择"Vivado + Vitis"。
  3. 选择设备时,勾选你板子对应的型号。比如Zynq-7000系列就勾选"Zynq-7000"。
  4. 安装路径不要有中文或空格。我曾经用"我的工具"做路径名,结果编译时报路径解析错误——血的教训。
  5. 安装完成后,设置环境变量:
# 添加到 ~/.bashrc
source /tools/Xilinx/Vivado/2020.1/settings64.sh
source /tools/Xilinx/Vitis/2020.1/settings64.sh

# 验证安装
vivado -version
vitis -version
警告: 安装过程中如果提示"libtinfo.so.5"缺失,别慌。运行 sudo apt install libtinfo5 即可。这是Linux版的老问题了,Xilinx官方论坛里讨论了几百页。

2.3 JTAG配置:让调试器找到你的芯片

环境装好了,接下来就是让PC和板子"对上话"。JTAG是调试的生命线,这一步出问题,后面寸步难行。

2.3.1 硬件连接

以Zynq-7020开发板为例,JTAG链路通常是这样的:

PC (USB) → 调试器 (如Digilent JTAG-HS3) → 板子JTAG接口 (10pin/14pin)
                    ↓
              目标芯片 (Zynq-7020)

连接时注意:

  • 调试器与板子之间的JTAG线序要对。我见过有人把TMS和TCK接反了,折腾半天才发现。
  • 板子要上电。JTAG本身不供电,只传信号。
  • 如果板子有多个JTAG链(比如同时连FPGA和ARM),需要确认跳线设置。

2.3.2 驱动安装与验证

Windows下需要安装Digilent或Xilinx的USB驱动。Linux下一般免驱,但需要给权限:

# 添加当前用户到 dialout 组
sudo usermod -a -G dialout $USER

# 重启后验证
lsusb | grep -i xilinx
# 应该看到 "Xilinx, Inc." 或 "Digilent" 设备

然后在Vivado里打开Hardware Manager:

# 命令行方式
vivado -mode tcl
open_hw
connect_hw_server
open_hw_target
current_hw_device [lindex [get_hw_devices] 0]
refresh_hw_device -update_hw_probes false [current_hw_device]
# 如果看到设备信息,说明JTAG链路通了
关键检查点: 如果 get_hw_devices 返回空,先检查USB线。我遇到过一根线只能充电不能传数据的情况——换了根带屏蔽的数据线就好了。

2.3.3 常见JTAG故障排查

现象 可能原因 解决办法
找不到设备 驱动未安装或权限不足 检查lsusb输出,重新安装驱动
设备ID读出来全是0xFF JTAG链路断开或芯片未上电 检查连接线,测量板子供电
连接后频繁断开 USB线质量差或干扰大 换短一些的USB线,远离电源适配器
能识别但无法编程 FPGA配置模式设置错误 检查板子跳线(如MIO配置)

我曾经在一个项目里,JTAG死活连不上。换了三根线、重装两次驱动,最后发现是板子上的JTAG插座虚焊了——拿放大镜一看,一个引脚根本没焊上。所以硬件问题别忽略。

2.4 串口终端设置:让Zynq开口说话

JTAG搞定了,但调试时你还需要一个"耳朵"——串口终端。ARM核跑起来后,打印信息全靠它。

2.4.1 硬件连接

Zynq的UART通常通过USB转串口芯片(如CP2102、FT232)连接到PC。连接方式:

Zynq UART_TX (MIO14) → USB转串口 RX
Zynq UART_RX (MIO15) → USB转串口 TX
GND → GND

注意:有些开发板已经把USB转串口集成在板上了,你只需要插一根Micro USB线到PC即可。

2.4.2 终端软件配置

我个人习惯用 screen 或 minicom(Linux),或者 PuTTY(Windows)。参数如下:

参数 值
波特率 115200
数据位 8
停止位 1
校验位 无
流控 无

Linux下用screen的示例:

# 先找到串口设备
ls /dev/ttyUSB*  # 或 /dev/ttyACM*
# 连接
screen /dev/ttyUSB0 115200

Windows下用PuTTY,选"Serial",填上COM口和波特率就行。

小技巧: 如果串口打印乱码,99%是波特率不匹配。检查一下你的代码里UART初始化是不是设成了9600或38400。我见过有人把板子上的波特率跳线设错了,结果怎么调终端都没用。

2.4.3 验证串口通信

最简单的验证方法:在Vitis里写一个裸机程序,让UART输出"Hello World"。

#include "xparameters.h"
#include "xuartps.h"
#include "xil_printf.h"

int main() {
    init_platform();
    
    xil_printf("Hello from Zynq!\r\n");
    xil_printf("UART is working at 115200 baud.\r\n");
    
    while(1) {
        // 空循环,保持程序运行
    }
    
    cleanup_platform();
    return 0;
}

下载到板子上后,如果串口终端打印出这两行字,恭喜你——环境搭建成功了。

2.5 知识体系总览

下面这张图把本章的核心逻辑串起来了。你可以把它当作调试环境搭建的"路线图":

调试环境搭建知识体系 调试环境搭建核心流程 Vivado + Vitis 安装 驱动与权限配置 环境变量验证 JTAG 硬件连接 → 驱动验证 → 设备识别 → 链路测试 串口硬件连接 → 终端参数设置 → 裸机程序验证 → 打印输出确认 常见故障排查清单 调试环境就绪确认 关键:每一步都要验证通过再往下走。JTAG不通就别急着调串口,否则问题叠加更难排查。
核心原则: 调试环境搭建不是一次性的工作。每次换板子、换电脑、换操作系统,都要重新走一遍这个流程。我习惯把每一步的验证命令写成脚本,换环境时一键跑通。

2.6 本章小结

嗯,到这里,调试环境就算搭好了。你有了Vivado做硬件开发,Vitis做软件调试,JTAG让PC和板子能通信,串口让板子能跟你"说话"。这三样东西,就是后面所有调试工作的基础。

我记得第一次独立搭环境时,光JTAG就折腾了两天。后来总结出经验:先确认硬件(线、供电、焊接),再查软件(驱动、权限、版本),最后才怀疑工具本身。这个排查顺序,能帮你省下至少一半的时间。