3. Zynq PCIe硬核架构剖析

Zynq-7000 与 UltraScale+ MPSoC 的 PCIe 实现方式有本质差异,理解这一点是后续做链路调试、DMA 设计和驱动移植的前提。Zynq-7000 的 PCIe 是一个独立的硬核 IP(PCIE_0),挂在 PS 的 AXI 互联上,与 PL 逻辑相对独立;而 UltraScale+ MPSoC 把 PCIe 控制器集成进 PS 的 CCIX/PCIe 子系统,通过 PS-PCIe 控制器与 PL 侧的 GT 收发器协同工作,链路宽度、速率和参考时钟来源都更灵活。本节按"控制器—收发器—时钟—复位—电源"这条信号与供电链,把两代器件的集成块结构拆开来看。

PS-PCIe 控制器:从 AXI 到事务层的桥接

PCIe 控制器内部按协议栈分层:事务层(TL)、数据链路层(DLL)和物理层逻辑(PCS/PMA 的数字部分)。对用户可见的接口主要是三类:AXI 主/从端口、配置空间访问端口,以及中断与错误上报端口。在 Zynq-7000 中,PCIE_0 提供最多 4 个 AXI 主端口(用于发起 Memory Read/Write 请求)和 1 个 AXI 从端口(用于接收来自 RC 或 EP 的访问),并支持 32 位或 64 位地址映射。UltraScale+ 的 PS-PCIe 控制器则通过 AXI 桥接至 PS 的 AXI 互联,支持更大的地址窗口和更细的 QoS 配置。

实际配置时,控制器需要明确几个关键参数:链路速率(Gen1 2.5 GT/s、Gen2 5.0 GT/s、Gen3 8.0 GT/s)、链路宽度(x1/x2/x4/x8)、设备类型(Root Complex 或 Endpoint)、BAR 空间大小与映射方式。以 Zynq-7000 作为 Endpoint 为例,典型配置是 Gen2 x4,BAR0 映射 1 MB 到 DDR,BAR1 映射 64 KB 到 PL 的 AXI-Lite 寄存器区。这些参数在 Vivado 的 PCIe IP 配置界面中设定,最终体现在控制器寄存器的 Link Control、Link Status 和 BAR 配置寄存器中。

GT 收发器:物理层的模拟前端

GT(Gigabit Transceiver)是 PCIe 物理层的模拟核心,负责串并转换、时钟数据恢复(CDR)、均衡和驱动。Zynq-7000 的 PCIe 使用 GTP 收发器(7 系列),每 lane 一对差分信号,支持 2.5 和 5.0 GT/s;UltraScale+ 使用 GTH/GTY 收发器,支持到 8.0 GT/s 甚至 16.0 GT/s。GT 的关键配置包括参考时钟频率(100 MHz 或 125 MHz)、PLL 分频比、预加重/去加重、接收均衡器模式(DFE 或 LPM)以及 TX/RX 极性反转。

调试时最常观察的是 GT 的 PCS 状态寄存器:RX 是否 CDR 锁定、是否完成块对齐、是否收到有效的 TS1/TS2 有序集。如果链路训练卡在 Detect 或 Polling 状态,通常先查参考时钟是否稳定、GT 的复位是否释放、以及 TX/RX 差分对是否接反。一个实用的检查顺序是:先确认参考时钟在 GT 引脚上的幅度和频率,再确认 GT 的 CPLL/QPLL 锁定状态,最后看 PCS 的 RX 状态机是否推进到 L0。

参考时钟、复位与电源管理

参考时钟是 PCIe 链路训练的基准。Zynq-7000 的 PCIE_0 通常使用 100 MHz 差分参考时钟,可由外部晶振经时钟缓冲器提供,也可从 PL 的 BUFG 分频得到。UltraScale+ 的 PS-PCIe 支持从 PS 的 PLL 或外部参考时钟输入,且每个控制器可独立选择时钟源。参考时钟的抖动(jitter)必须满足 PCIe 规范,Gen3 对 RMS 抖动的要求比 Gen1 严格得多,通常需要专用低抖动时钟芯片。

复位方面,PCIe 控制器有多个复位域:全局复位(PERST#)、热复位、链路复位和控制器内部复位。PERST# 是来自主机的边带信号,低有效,必须与参考时钟稳定后至少保持 100 ms 的建立时间。Zynq-7000 中 PERST# 通常接到 PS 的 MIO 或 PL 引脚,由软件或逻辑控制释放顺序。UltraScale+ 则通过 PS 的复位控制器统一管理,支持从 PS 的复位源触发 PCIe 控制器复位。

电源管理包括 L0/L0s/L1/L2/L3 链路电源状态和设备的 D0/D1/D3 电源状态。实际开发中,L1 低功耗状态和 ASPM(Active State Power Management)配置会影响链路延迟和吞吐,做高速数据采集时通常关闭 ASPM 或强制 L0。Zynq-7000 的 PCIe 控制器支持 L0s 和 L1,UltraScale+ 还支持 L1 PM Substates,配置时需在控制器寄存器和上游 RC 的配置空间中同时使能。

Zynq PCIe 硬核集成块结构:控制器—GT—时钟—复位—电源 PS 侧(Processing System) PS-PCIe 控制器 事务层 / 数据链路层 / 物理层逻辑 AXI 主/从端口 · 配置空间 · 中断 AXI 互联 / CCIX 桥 地址映射 · QoS · 64 位窗口 复位控制器 PERST# · 热复位 · 链路复位 电源管理单元 L0/L0s/L1 · ASPM · D 状态 参考时钟输入 100 MHz 差分 · 低抖动 GT 收发器(物理层模拟) PMA 模拟前端 CDR · 均衡 · 驱动 预加重 / 去加重 PCS 数字逻辑 块对齐 · 有序集 · 8b/10b PLL(CPLL/QPLL) 参考时钟倍频 · 锁定检测 TX/RX 差分对 x1/x2/x4/x8 lane GT 复位与状态 RX CDR 锁定 · L0 状态 链路与外部对象 PCIe 链路 Gen1/2/3 · x1~x8 TS1/TS2 训练序列 对端 RC / EP 配置空间 · BAR DDR / PL 寄存器 数据缓冲区 · 控制寄存器 外部参考时钟源 晶振 · 时钟缓冲器 PERST# 边带信号 主机复位 · 100 ms 建立 并行数据 AXI 事务 复位释放 参考时钟 串行差分 链路训练 PERST# 关键观察点:参考时钟稳定 → PLL 锁定 → CDR 锁定 → 块对齐 → TS1/TS2 交换 → L0 链路激活

两代器件的集成差异与配置要点

Zynq-7000 的 PCIe 硬核是"独立块",控制器和 GTP 在同一个 IP 内,参考时钟和复位相对固定,配置空间有限,适合快速实现 Endpoint 或 Root Complex。UltraScale+ MPSoC 的 PS-PCIe 则把控制器放进 PS,GT 放在 PL 侧,两者通过专用的并行接口连接,因此需要同时配置 PS 的 PCIe 控制器和 PL 的 GT 收发器,时钟和复位也要跨域协调。这种分离式结构带来更大的灵活性,但也增加了时钟域交叉和复位顺序的复杂度。

一个常见的配置顺序是:先确定参考时钟源和频率,再配置 GT 的 PLL 和 lane 映射,然后配置 PS-PCIe 控制器的设备类型、BAR 和中断,最后设置复位释放顺序和电源管理策略。在 Vivado 中,Zynq-7000 通过 "Zynq Processing System" IP 的 PCIe 配置页完成;UltraScale+ 则需要在 PS 配置中使能 PCIe 控制器,并在 PL 侧例化 GT 向导或直接使用 PCIe 集成块。无论哪一代,参考时钟的抖动、复位释放时序和 GT 的极性设置都是最容易出问题的三个点,建议在硬件设计阶段就预留测试点和时钟缓冲器。

调试建议:如果链路训练失败,先用示波器确认参考时钟在 GT 引脚上的差分幅度和频率,再读 GT 的 PLL 锁定状态寄存器,最后检查 PERST# 的释放时间是否满足 100 ms 要求。多数"链路起不来"的问题都出在这三处。