2. 开发环境搭建与工程创建

Zynq 的开发与纯 FPGA 或纯 ARM 开发最大的不同,在于它同时存在 PL(可编程逻辑)与 PS(处理系统)两个世界,而这两个世界分别由不同的工具链负责。Vivado 负责硬件平台(PL 逻辑、PS 配置、地址映射、引脚约束),Vitis 负责在 PS 上运行的裸机或 Linux 应用,PetaLinux 负责构建 Linux 系统镜像。三者不是并列关系,而是有明确的先后依赖:先有硬件平台,才有软件工程;先有 Linux 镜像,才有板级运行环境。理解这条依赖链,是搭建环境时避免“装了一堆工具却跑不起来”的关键。

工具链的职责与安装顺序

本节以 AMD(原 Xilinx)统一安装器为基础。Vivado、Vitis、PetaLinux 都可以通过同一安装器获取,但 PetaLinux 通常作为独立安装包提供,需要单独执行安装脚本。推荐的安装顺序是:先装 Vivado(含 Vitis),再装 PetaLinux,最后配置环境变量。

安装时需要注意几个实际参数:Vivado 安装目录不要包含中文和空格,例如使用 /tools/Xilinx;安装组件至少勾选 Zynq-7000 或 Zynq UltraScale+ 器件系列,否则创建工程时找不到目标芯片;PetaLinux 安装需要先安装其依赖包(如 libtinfo5、chrpath、socat、python3 等),否则 petalinux-create 会直接报错。

# 以 PetaLinux 2022.2 为例,安装到 /tools/Xilinx/petalinux
mkdir -p /tools/Xilinx/petalinux
./petalinux-v2022.2-10141622-installer.run \
    --dir /tools/Xilinx/petalinux

# 每次使用前 source 环境
source /tools/Xilinx/petalinux/settings.sh
echo $PETALINUX   # 应输出安装路径

Vivado 与 Vitis 的环境变量一般由安装器写入启动脚本,Linux 下可执行 source /tools/Xilinx/Vivado/2022.2/settings64.sh。判断安装是否成功,最直接的方式是执行 vivado -version 与 petalinux-util --version,能正确打印版本号即说明路径配置无误。

Zynq 硬件平台配置的核心内容

创建 Vivado 工程后,第一步是新建 Block Design 并添加 Zynq Processing System IP。这个 IP 的配置界面就是 Zynq 硬件平台配置的核心,其中几项直接决定后续软件能否运行:

  • PS-PL Configuration:决定是否启用 AXI HP/GP 接口、是否引出 M_AXI_GP0 等,影响 PL 与 PS 的数据通路。
  • Peripheral I/O Pins:启用 UART、SD、Ethernet、USB 等外设。Hello World 至少需要启用一个 UART,用于打印输出。
  • Clock Configuration:设置 PS 输入时钟频率(常见 33.333 MHz)和 CPU、DDR 时钟,需与开发板晶振一致。
  • DDR Configuration:选择 DDR 型号与位宽,错误配置会导致 FSBL 阶段就卡死。
  • MIO Configuration:分配 UART、SD 等信号到具体 MIO 引脚,必须与原理图一致。

配置完成后,需要执行 Validate Design,确认无地址冲突或未连接的关键接口。随后生成顶层 HDL Wrapper,导出硬件平台(Export Hardware),得到 .xsa 文件。这个 .xsa 是连接 Vivado 与 Vitis/PetaLinux 的桥梁,后续所有软件工程都基于它创建。

Zynq 开发工具链依赖与数据流 Vivado 硬件平台构建 Block Design + Zynq PS MIO / DDR / UART 配置 Generate Wrapper .xsa 硬件平台描述 Vitis 软件工程开发 Platform Project Application Project (Hello World) 编译 → .elf PetaLinux Linux 系统镜像构建 petalinux-create / config BOOT.BIN + image.ub 导入硬件描述 目标板运行 JTAG 下载 .elf SD 卡启动 Linux 串口输出 Hello World

第一个 Hello World 工程

在 Vitis 中,先基于导出的 .xsa 创建 Platform Project,工具会自动解析硬件信息并生成 BSP(板级支持包)。随后创建 Application Project,模板选择 Hello World,目标处理器选择 ps7_cortexa9_0(Zynq-7000)或 psu_cortexa53_0(Zynq UltraScale+)。

生成的 helloworld.c 内容非常简洁,核心就是通过 printf 向标准输出打印字符串。在裸机环境下,printf 默认重定向到 UART,因此只要 PS 端 UART 已启用且 MIO 配置正确,串口终端就能看到输出。

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"

int main()
{
    init_platform();
    print("Hello World\n\r");
    print("Successfully ran Hello World application\n\r");
    cleanup_platform();
    return 0;
}

编译后生成 .elf 文件。若使用 JTAG 调试,可直接在 Vitis 中右键 Run As → Launch Hardware,工具会自动下载比特流(若已生成)和 .elf,并在串口终端显示输出。若使用 SD 卡启动 Linux,则需要 PetaLinux 生成 BOOT.BIN 和 image.ub,将应用编译为 Linux 可执行文件后放入根文件系统。

判断 Hello World 是否真正跑通,不能只看 IDE 是否提示成功,而要看串口终端是否出现预期字符串。常见失败原因包括:UART 未在 PS 中启用、MIO 引脚分配与原理图不符、波特率不匹配(通常 115200)、DDR 配置错误导致 FSBL 卡死。建议先用 JTAG 方式验证裸机程序,确认硬件平台无误后,再转向 PetaLinux 构建 Linux 镜像。

PetaLinux 工程与镜像生成

PetaLinux 工程创建命令如下,其中 --template 常用 zynq 或 zynqMP:

petalinux-create --type project --template zynq --name hello_plnx
cd hello_plnx
petalinux-config --get-hw-description=/path/to/xsa_dir

配置阶段需要关注:串口选择(ps7_uart_1 或 psu_uart_1)、启动方式(SD 或 QSPI)、根文件系统类型。配置完成后执行 petalinux-build,最终在 images/linux 下得到 BOOT.BIN、image.ub 和 rootfs。将 BOOT.BIN 与 image.ub 放入 SD 卡 FAT 分区,设置启动模式为 SD,上电后串口即可看到 Linux 启动日志,登录后运行应用即可看到 Hello World 输出。