4. Vivado 中创建 Kria PCIe 工程

在 Kria 平台上搭建 PCIe 高速互连系统,第一步不是写 RTL,而是在 Vivado 中把工程骨架搭正确。Kria 的 PCIe 能力来自 PS 侧集成的 PCIe 控制器(PS-PCIe),它通过 GT 收发器与外部主机或端点通信,并在 PL 侧以 AXI 接口暴露给用户逻辑。因此本节的核心任务是:选对器件、配好 PCIe IP、把 AXI 通路接对、把时钟与复位约束写对,最后跑通综合与实现。

一、器件选型:先锁定 Kria 型号与封装

Kria 常见型号包括 K26、K24、KV260 载板对应的 SOM 等,它们内部都是 Zynq UltraScale+ MPSoC 器件。创建工程时,在 Vivado 的 Create Project 向导中,Project Type 选 RTL Project,Default Part 页面不要只按速度等级随便挑,而应直接搜索具体器件型号。例如 KV260 常用的器件为 xck26-sfvc784-2LV-c,K26 SOM 对应 xck26-sfvc784-2LV-c 一类封装。器件选错会导致后续 PCIe 硬核位置、GT 通道、时钟资源全部对不上,IP 核甚至无法例化。

选型时重点确认三件事:一是器件是否包含 PS-PCIe 硬核;二是封装是否引出了所需的 GT 通道;三是速度等级是否满足目标链路速率。Kria 的 PS-PCIe 通常支持 Gen2/Gen3,具体以器件手册和板卡原理图为准。工程创建完成后,建议先在 Reports → Report IP Status 中确认器件信息,再进入 IP 配置。

二、PCIe IP 核配置:PS-PCIe 与 AXI Bridge

Kria 的 PCIe 通常不通过 PL 的 PCIe Gen3 x4 软核实现,而是使用 PS 侧硬核。在 Vivado 中,最直接的方式是新建 Block Design,然后添加 Zynq UltraScale+ MPSoC IP,在 PS-PCIe 配置页中启用 PCIe 控制器。关键参数包括:

  • PCIe Controller:选择 PCIe0 或 PCIe1,需与板卡实际走线一致。
  • Lane Width:常见为 x1、x2、x4,Kria 载板通常为 x1 或 x4,必须与硬件匹配。
  • Link Speed:Gen1(2.5 GT/s)、Gen2(5.0 GT/s)、Gen3(8.0 GT/s),按主机能力与信号完整性选择。
  • Reference Clock:通常为 100 MHz 差分,来自板载时钟或主机提供。
  • AXI Interface:使能 AXI Master/Slave,用于访问用户逻辑或 DDR。

若需要 PL 侧用户逻辑通过 AXI 访问主机内存,应使能 AXI Master;若主机需要访问 PL 侧寄存器或 BRAM,则使能 AXI Slave。配置完成后,IP 会自动生成对应的 AXI 端口和中断信号。

三、AXI 接口连接:把数据通路接对

PS-PCIe 的 AXI 接口通常包括 M_AXI(Master)和 S_AXI(Slave)。连接原则是:Master 端接 AXI Interconnect 或直接接用户逻辑的 Slave 端口;Slave 端接 AXI Interconnect 或用户逻辑的 Master 端口。若用户逻辑需要访问 DDR,则通过 PS 的 S_AXI_HPM0 等端口接入;若主机需要访问 PL 寄存器,则把 PS-PCIe 的 S_AXI 接到 AXI Interconnect,再接到用户寄存器模块。

连接时注意位宽与时钟域。PS-PCIe 的 AXI 接口通常工作在 pl_clk0 或独立时钟域,若用户逻辑使用不同时钟,必须插入 AXI Clock Converter 或 AXI SmartConnect。地址映射方面,在 Address Editor 中为每个 Slave 分配基地址与范围,避免重叠。典型示例:给 PL 寄存器分配 0xA000_0000,范围 64K;给 DDR 高地址段分配 0x0_0000_0000 以上区域。

四、时钟与复位约束:让时序收敛有依据

Kria 的 PCIe 参考时钟通常由 PS 侧提供,但 PL 侧用户逻辑仍需自己的时钟。在 Block Design 中,PS 会输出 pl_clk0(默认 100 MHz 或 150 MHz),可作为 AXI 互联和用户逻辑的主时钟。若用户逻辑需要更高频率,可添加 Clocking Wizard 生成。约束文件(XDC)中必须明确:

create_clock -period 10.000 -name pl_clk0 [get_ports pl_clk0]
create_clock -period 4.000 -name pcie_refclk [get_ports pcie_refclk_p]
set_property PACKAGE_PIN F12 [get_ports pcie_refclk_p]
set_property IOSTANDARD LVDS [get_ports pcie_refclk_p]

复位方面,PS-PCIe 的复位通常由 PS 内部管理,但 PL 侧逻辑需要同步复位。建议使用 Processor System Reset IP,把 pl_resetn0 作为外部复位输入,输出同步后的 peripheral_aresetn 给 AXI 互联和用户逻辑。注意复位释放必须与时钟同步,避免亚稳态。

五、综合与实现流程:从 RTL 到比特流

完成 Block Design 后,依次执行 Validate Design、Generate Output Products、Create HDL Wrapper。然后添加用户 RTL 或约束,运行 Run Synthesis。综合完成后查看 Report Utilization 和 Report Timing Summary,确认 PCIe 相关路径是否满足时序。若时序违例,优先检查 AXI 互联是否插入过多流水级,或时钟约束是否遗漏。

实现阶段运行 Run Implementation,重点观察 Design Timing Summary 中的 WNS/TNS。若 WNS 为负,可尝试降低 PCIe 链路速率、优化 AXI 位宽或增加寄存器切片。最后 Generate Bitstream,导出 .xsa 文件供 Vitis 或 PetaLinux 使用。整个流程中,最容易被忽略的是地址映射与时钟域交叉,建议在实现前用 Report Clock Interaction 检查跨时钟路径。

Kria PCIe 工程创建与数据通路示意 器件选型 xck26-sfvc784-2LV-c 确认 PS-PCIe / GT 通道 PS-PCIe 硬核配置 Lane: x1/x4 Speed: Gen2/Gen3 Ref Clk: 100MHz AXI: M/S AXI 接口连接 SmartConnect / Interconnect 地址映射 + 位宽匹配 时钟与复位 pl_clk0 / 100MHz 同步复位释放 AXI 数据通路与地址映射 外部主机 / RC PCIe Root Complex PS-PCIe 控制器 M_AXI / S_AXI AXI Interconnect 地址译码 / 位宽转换 PL 用户逻辑 寄存器 / BRAM / DDR 基地址 0xA000_0000 范围 64K DDR 高地址段 综合与实现流程 Validate Design Generate Output Run Synthesis Run Implementation Generate Bitstream 导出 .xsa 检查 WNS/TNS,必要时优化 AXI 流水级 工程配置 综合 实现 比特流
在 Kria 上,PS-PCIe 的参考时钟和复位通常由 PS 管理,PL 侧只需关注 AXI 时钟域与用户逻辑复位。若主机无法枚举设备,优先检查 Link Speed 与 Lane Width 是否与硬件一致,再确认 pl_clk0 是否已正确约束。
地址映射冲突是常见错误:PS-PCIe 的 AXI Slave 与 PS DDR 控制器可能占用相同地址段。务必在 Address Editor 中逐项核对,确保每个 Slave 的基地址与范围互不重叠,否则综合虽能通过,但运行时会出现访问异常。