1. 课程导入与开发环境搭建

AMD Zynq 系列把 ARM 处理器系统(PS)与可编程逻辑(PL)集成在同一芯片上,再配合 PCIe 硬核,就构成了一条从主机到板卡的完整高速互连通路。典型应用包括:数据采集卡把 ADC 采样经 PL 打包后通过 PCIe DMA 写入主机内存;工业相机把图像帧经 PCIe 上传做实时处理;以及基于 Zynq 的加速卡,由主机下发描述符、板卡完成计算后回传结果。这些场景的共同点是:主机侧需要枚举设备、映射 BAR 空间、分配 DMA 缓冲区,板卡侧需要配置 PCIe 硬核、实现地址转换与中断上报。本课程围绕这条链路展开,从环境搭建一直讲到驱动与性能调优。

1.1 整体开发流程与工具分工

Zynq PCIe 系统的开发不是单一工具能完成的,而是三个工具链协同:Vivado 负责硬件平台,Vitis 负责 PS 端裸机或 Linux 应用,PetaLinux 负责生成带 PCIe 驱动与设备树的 Linux 系统。三者之间的交付物关系是理解整个流程的关键,下图给出从硬件工程到主机侧验证的完整数据流与产物依赖。

Zynq PCIe 开发流程与工具链产物依赖 Vivado:硬件平台 • 选型 Zynq 器件与板卡 • 配置 PS:PCIe Root/EP • 例化 PCIe 硬核 + XDMA • 分配 BAR / 中断 / 时钟 产物:.xsa 硬件描述文件 PetaLinux:Linux 系统 • petalinux-create 建工程 • 导入 .xsa 生成设备树 • 使能 pcie / xdma 驱动 • 打包 BOOT.BIN + image.ub 产物:可启动 SD 卡镜像 Vitis:应用与驱动 • 裸机:XDMA 寄存器读写 • Linux:用户态 mmap BAR • 编写 DMA 收发测试程序 • 交叉编译并部署到板卡 产物:可执行测试程序 .xsa sysroot Zynq 开发板(EP 端) • SD 卡启动 Linux • PCIe 金手指插入主机插槽 • 串口 / JTAG 用于调试 主机(RC 端) • lspci 枚举设备 • 加载 xdma 驱动 • 运行 DMA 读写验证 PCIe 链路 TLP / DMA 数据流 验证判据 lspci 可见设备 → BAR 可读写 → DMA 回环数据一致 → 中断正常上报

1.2 工具安装与版本选择

建议统一使用 Vivado/Vitis 2022.2 或 2023.2 这类长期支持版本,PetaLinux 版本必须与 Vivado 完全一致,否则导入 .xsa 时会出现器件或 IP 版本不匹配。安装时勾选 Zynq-7000、Zynq UltraScale+ MPSoC 器件族,以及 Vitis 的嵌入式开发组件。Linux 主机推荐 Ubuntu 20.04 LTS,因为 PetaLinux 对发行版和依赖库版本较敏感。

PetaLinux 安装前需先装依赖,典型命令如下:

sudo apt-get install -y gcc g++ make python3 python3-pip \
  libncurses5-dev libssl-dev flex bison texinfo zlib1g-dev \
  libgtk2.0-0 tftpd-hpa

# 安装 PetaLinux(示例路径)
./petalinux-v2022.2-10141622-installer.run --dir /opt/pkg/petalinux
source /opt/pkg/petalinux/settings.sh
echo $PETALINUX   # 应输出安装路径,验证环境变量生效

Vivado 安装完成后,需确认 vivado -version 与 vitis -version 均可正常输出。若主机同时装有多个版本,建议用环境变量脚本切换,避免工程被高版本工具静默升级。

1.3 硬件与主机环境准备

硬件侧需要一块带 PCIe 金手指的 Zynq 开发板(如 ZCU102、ZC706 或自研板),一根 PCIe 延长线或直接插入主机 PCIe x4/x8 插槽,以及 USB 转串口线用于查看板卡启动日志。主机侧建议使用一台带空闲 PCIe 插槽的 x86 机器,BIOS 中关闭 Secure Boot,避免未签名驱动被拦截。

上电前先做三项检查:一是确认开发板供电与主机供电相互独立,避免 PCIe 插槽供电不足;二是确认 JTAG 与串口线已连接且驱动正常;三是确认 SD 卡已按后续章节烧录镜像。首次上电时,主机执行 lspci -nn | grep -i xilinx,若能看到类似 10ee:9038 的设备号,说明 PCIe 链路已建立、枚举成功;若看不到,应优先检查链路训练状态与参考时钟。

建议为每块板卡建立一份环境记录:Vivado 版本、PetaLinux 版本、主机内核版本、PCIe 插槽编号、设备 ID 与 BAR 分配结果。后续排障时,这份记录能快速区分是工具版本问题还是硬件链路问题。

1.4 一个最小可跑通的验证路径

环境搭好后,不要急着写复杂逻辑,先用最小系统验证链路。流程是:在 Vivado 中创建一个仅含 PS + PCIe 硬核的工程,生成 .xsa;用 PetaLinux 导入该 .xsa,生成带 xdma 驱动的镜像并烧录 SD 卡;板卡插入主机后启动,主机侧加载驱动并执行一次 DMA 回环测试。若回环数据与写入数据一致,说明从硬件配置、驱动加载到数据通路全部打通,后续再逐步加入自定义 IP 与业务逻辑。

这一章的目标不是把系统做到最优,而是把“工具装好、板卡点亮、链路可见、数据能通”这条基线建立起来。基线稳定后,后面关于 BAR 映射、DMA 描述符、中断聚合与吞吐优化的内容才有可靠的对照起点。