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

AMD Kria 是一类面向边缘计算与嵌入式视觉的 SoM(System-on-Module,系统级模块)产品线,它把 Zynq UltraScale+ MPSoC 的 PS(Processing System)与 PL(Programmable Logic)资源、DDR 内存、eMMC、电源管理以及启动配置集成到一块邮票孔或连接器模块上,用户只需设计一块载卡(Carrier Card)即可完成整机。理解 Kria 的定位,是理解 PCIe 在其中扮演什么角色的前提。

Kria SOM 产品线概览

目前主流的 Kria SOM 包括 K26、K24、KV260 视觉套件所基于的 K26,以及面向工业与机器人方向的 KR260、KD240 等。它们共享同一套软件栈与载卡生态,但资源规模不同:K26 侧重视觉与 AI 推理,逻辑资源与 DSP 规模较大;K24 成本更低、功耗更小,适合对算力要求不高的控制类应用。所有 Kria SOM 都基于 Zynq UltraScale+ MPSoC,PS 端包含 ARM Cortex-A53 应用核与 Cortex-R5 实时核,PL 端提供可编程逻辑,二者通过 AXI 总线与 PS-PL 接口互联。

对 PCIe 开发而言,需要重点关注的是 PS 端集成的 PCIe 控制器。Zynq UltraScale+ 的 PS 通常提供 PCIe Gen2 x4 或 Gen3 x4 的硬核控制器,可直接作为 Root Complex(RC)或 Endpoint(EP)使用。Kria SOM 通过载卡上的高速连接器把 PCIe 差分对引出,因此载卡设计决定了 PCIe 的通道数、参考时钟来源以及复位信号连接方式。

PCIe 在 Kria 系统中的角色

在 Kria 系统中,PCIe 通常承担三类任务:一是作为 Root Complex 连接外部 Endpoint 设备,例如 NVMe SSD、图像采集卡、AI 加速卡;二是作为 Endpoint 被上位机枚举,把 Kria 当作加速板卡使用;三是作为 PS 与 PL 之间的高速数据通道的补充,虽然 PS-PL 本身已有 AXI 互联,但在需要与外部主机交换大量数据时,PCIe 的 DMA 能力更合适。

以 KV260 为例,载卡上引出的 PCIe 通道可以连接 M.2 NVMe 转接板。此时 Kria 作为 RC,上电后由 PS 端的 PCIe 控制器发起链路训练(Link Training),协商链路宽度与速率,成功后枚举设备、分配 BAR 空间,Linux 下即可看到 lspci 输出的设备信息。若把 Kria 配置为 EP,则需要上位机先上电或先完成枚举,Kria 侧等待主机配置,这一顺序在调试中非常关键。

Kria SOM 中 PCIe 的角色与连接关系 Kria SOM (Zynq UltraScale+ MPSoC) PS (Processing System) Cortex-A53 / R5 DDR / eMMC PCIe 控制器 Gen2/Gen3 x4 硬核 PL (Programmable Logic) 可编程逻辑资源 DSP / BRAM / URAM AXI 互联 PS-PL 接口 载卡 (Carrier Card) 高速连接器 · PCIe 差分对 · 参考时钟 · PERST# 通道数 / 时钟来源 / 复位连接由载卡决定 PCIe 链路 Link Training 枚举 / BAR 分配 DMA 数据传输 差分信号 外部设备 / 上位机 NVMe SSD · 采集卡 AI 加速卡 · 主机 RC 角色可配置 RC (Root Complex) 或 EP (Endpoint) PS 端 PCIe 硬核经载卡引出,链路速率与宽度由双方协商决定

Vivado/Vitis 工具链安装

Kria 开发使用 AMD 统一的 Vivado 与 Vitis 工具链。建议安装版本与 Kria 官方 Ubuntu 镜像所支持的版本保持一致,例如 2022.2 或 2023.1,避免因版本错配导致 PL 比特流与 PS 端驱动不兼容。安装时选择 Vitis Unified Software Platform,它会同时安装 Vivado、Vitis、Vitis HLS 以及对应的器件支持包。安装过程中务必勾选 Zynq UltraScale+ MPSoC 器件系列,否则后续无法对 Kria 器件进行综合与实现。

安装完成后,需要安装 Kria 的板级支持文件(Board Support Package)。AMD 提供了 Kria SOM 的板卡文件,安装后 Vivado 中创建工程时可以直接选择 KV260、KR260 等板卡,工具会自动配置 PS 端的 DDR、时钟、PCIe 等预设参数。若没有板卡文件,也可以手动配置 PS,但工作量明显增加。Linux 侧则使用 Kria 官方 Ubuntu 镜像,通过 apt 安装 xrt、xmutil 等运行时工具,用于加载 PL 比特流和运行加速应用。

开发板与载卡准备

以 KV260 为例,开发板本身是一块载卡,上面已有 HDMI、以太网、USB、MIPI 等接口,并引出一个 240 针高速连接器用于扩展。若要做 PCIe 实验,通常需要额外的转接板或自制载卡,把 PCIe 差分对、参考时钟和 PERST# 信号引出到标准 PCIe 插槽或 M.2 接口。上电前应确认以下几点:载卡上 PCIe 参考时钟是来自 SOM 还是外部晶振;PERST# 是由 SOM 驱动还是由载卡上的上位机驱动;通道映射是否与 PS 端 PCIe 控制器的 Lane 分配一致。

软件环境就绪后,可以用一条简单命令验证 PCIe 链路是否被识别。在 Kria 的 Linux 终端中执行:

lspci -nn
# 示例输出(假设连接了 NVMe SSD):
# 01:00.0 Non-Volatile memory controller [0108]: ...

如果 lspci 没有任何输出,说明链路训练未成功,需要检查参考时钟、复位信号和供电。若能看到设备但 BAR 分配异常,则要检查设备树中 PCIe 节点的 ranges 与 interrupt-map 配置。这些判断依据会在后续章节反复用到。

建议在首次上电时先用 dmesg | grep pcie 观察内核启动日志中 PCIe 控制器的初始化信息,确认链路速率与宽度是否与预期一致,再进入设备枚举与驱动调试。