1. Zynq多时钟系统架构总览

Zynq 系列 SoC 把 ARM 处理系统(PS)与可编程逻辑(PL)集成在同一芯片内,二者各自拥有独立的时钟生成与分配网络,又通过 AXI 接口、DMA、中断等通路互相连接。理解这套多时钟系统的第一步,是分清“谁给谁供时钟、哪些时钟可以共享、哪些必须异步”。

一、PS 侧时钟域划分

PS 的时钟来源是外部晶振,通常接在 PS_CLK 引脚上,典型频率为 33.333 MHz。该参考时钟进入 PS 内部的时钟管理单元后,由 PLL 生成三路主要时钟:ARM PLL、DDR PLL 和 I/O PLL。ARM PLL 主要供 CPU 与部分互连使用,DDR PLL 供 DDR 控制器与 DDR 接口使用,I/O PLL 则为 UART、SPI、SD、USB、以太网等外设以及部分 AXI 互连提供时钟。

这些 PLL 输出经过分频器后,形成多个可独立配置的时钟域。例如 CPU 时钟可配置为 666 MHz、766 MHz 或 866 MHz 等档位;DDR 时钟根据 DDR 颗粒速率配置;UART 参考时钟通常为 100 MHz 左右,再在控制器内部分频得到波特率。PS 内部各外设时钟域之间虽然同源,但经过不同分频路径后,相位与频率关系并不固定,跨域访问仍需按同步设计处理。

二、PL 侧时钟资源分布

PL 的时钟资源与 PS 不同,它不依赖 PS 的 PLL 直接驱动,而是通过以下四类来源获得时钟:

  • PS 到 PL 的时钟:PS 可向 PL 输出最多四路时钟(PL Clock 0~3),频率由 PS 端配置,常用于让 PL 逻辑与 PS 外设保持同源。
  • PL 外部时钟引脚:通过 MRCC/SRCC 引脚直接输入外部晶振或时钟源,适合需要独立参考时钟的场景。
  • PL 内部 MMCM/PLL:PL 内的时钟管理单元可对输入时钟进行倍频、分频、相移和占空比调整,是 PL 内部多时钟生成的核心。
  • GT 收发器时钟:高速串行收发器有独立的参考时钟输入,用于 Aurora、PCIe、SATA 等高速接口。

PL 的时钟布线通过 BUFG、BUFH、BUFR 等全局/区域时钟缓冲器分配到不同时钟区域。BUFG 覆盖全芯片,BUFH 覆盖单个时钟区域,BUFR 覆盖单个时钟区域并支持分频。设计时必须关注时钟区域约束,避免跨区域使用区域时钟缓冲器导致布线失败或时序恶化。

PS 处理系统 PS_CLK 33.333 MHz PS PLL ARM / DDR / IO CPU 域 666~866 MHz DDR 域 DDR 控制器 IO 外设域 UART/SPI/SD PS → PL 时钟输出 PL Clock 0~3(最多 4 路,频率可配) AXI 互连 / DMA / 中断 跨时钟域数据通路 PL 可编程逻辑 PS 输出时钟 PL CLK 0~3 外部时钟引脚 MRCC / SRCC GT 参考时钟 高速收发器 MMCM / PLL 倍频 / 分频 / 相移 / 占空比调整 BUFG 全局时钟 BUFH 区域时钟 BUFR 区域+分频 PL 用户逻辑 / IP 核 多时钟域并行运行 CDC PS 域 PL 域 时钟源 时钟缓冲 跨时钟域通路

三、典型多时钟应用场景

在实际工程中,Zynq 多时钟系统最常见的场景包括以下几类。第一类是“PS 采集 + PL 预处理 + PS 后处理”的流水线:PS 通过 AXI 将数据写入 PL 的 FIFO,PL 用独立时钟对数据进行滤波或打包,再通过 DMA 写回 DDR。此时 PS 侧 AXI 时钟与 PL 侧处理时钟往往不同频,FIFO 两侧的读写指针必须做 CDC 同步。

第二类是“多路异步接口汇聚”:例如 PL 同时接入千兆以太网、Camera Link 和自定义 LVDS 接口,三路数据分别使用 125 MHz、85 MHz 和 200 MHz 的恢复时钟,最终汇聚到同一 AXI 数据通路。三路时钟彼此异步,汇聚点必须使用异步 FIFO 或双口 RAM 加握手同步。

第三类是“低功耗动态调频”:PS 根据负载动态调整 CPU 频率,而 PL 逻辑仍按固定频率运行。此时 PS 与 PL 之间的 AXI 接口时钟会发生变化,若 PL 侧未正确约束或未使用异步桥,容易出现建立/保持时间违例。

四、CDC 验证的必要性

跨时钟域(CDC)问题的本质是:当信号从时钟域 A 传到时钟域 B 时,若两个时钟没有固定的相位和频率关系,采样时刻可能落在源信号的跳变沿附近,导致目标寄存器进入亚稳态。亚稳态不会立即表现为逻辑错误,但会在后续逻辑中传播,造成偶发、难复现的功能异常。

在 Zynq 中,CDC 风险主要出现在以下位置:PS 到 PL 的 AXI 接口、PL 内部不同 MMCM 输出驱动的模块之间、异步 FIFO 的读写指针、中断跨域传递、以及复位信号跨域释放。对于这些路径,仅靠功能仿真往往无法覆盖所有相位组合,必须通过 CDC 专项验证来检查。

CDC 验证通常包括三类检查:结构检查(是否使用了正确的同步器)、协议检查(握手或 FIFO 协议是否完整)、以及时序检查(是否对跨域路径设置了 false path 或 max delay 约束)。在 Vivado 中可通过 report_cdc 命令生成 CDC 报告,重点关注“无同步器”“多比特跨域”“同步器级数不足”等告警。

一个典型的 CDC 验证流程是:先在设计阶段为所有跨域信号标注时钟域属性,再在综合后运行 report_cdc,逐条确认每个跨域路径都有明确的同步策略;对多比特总线,检查是否使用了格雷码或握手协议;对异步 FIFO,检查读写指针是否各自在对方时钟域做了两级同步。只有结构、协议、时序三方面都通过,才能认为该 CDC 路径是安全的。

总结来说,Zynq 的多时钟系统不是“一个时钟走天下”,而是 PS 与 PL 各自拥有独立的时钟生成与分配网络,通过有限的同源时钟和大量异步接口协同工作。理解 PS 的 PLL 分频结构、PL 的 MMCM/BUFG 资源分布,以及两者之间的 AXI 与 DMA 通路,是后续进行 CDC 约束与验证的基础。