调试环境搭建: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,也没必要强行迁移——工具只是手段,稳定才是王道。
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为例)
- 下载Xilinx Unified Installer,给执行权限:
chmod +x Xilinx_Unified_2020.1_0602_1208_Lin64.bin - 运行安装程序,选择"Vivado + Vitis"。
- 选择设备时,勾选你板子对应的型号。比如Zynq-7000系列就勾选"Zynq-7000"。
- 安装路径不要有中文或空格。我曾经用"我的工具"做路径名,结果编译时报路径解析错误——血的教训。
- 安装完成后,设置环境变量:
# 添加到 ~/.bashrc
source /tools/Xilinx/Vivado/2020.1/settings64.sh
source /tools/Xilinx/Vitis/2020.1/settings64.sh
# 验证安装
vivado -version
vitis -version
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口和波特率就行。
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 知识体系总览
下面这张图把本章的核心逻辑串起来了。你可以把它当作调试环境搭建的"路线图":
2.6 本章小结
嗯,到这里,调试环境就算搭好了。你有了Vivado做硬件开发,Vitis做软件调试,JTAG让PC和板子能通信,串口让板子能跟你"说话"。这三样东西,就是后面所有调试工作的基础。
我记得第一次独立搭环境时,光JTAG就折腾了两天。后来总结出经验:先确认硬件(线、供电、焊接),再查软件(驱动、权限、版本),最后才怀疑工具本身。这个排查顺序,能帮你省下至少一半的时间。