GTY 收发器时钟结构:从参考时钟到 TX/RX 时钟

时钟,说白了就是高速收发器的心脏。GTY 再厉害,没有干净的时钟也是白搭。我刚开始接触 GTY 时被一堆 PLL 和时钟选项绕晕过,后来花了整整两周才理清楚。这一章咱们就把参考时钟、QPLL、CPLL,以及最后的 TX/RX 时钟捋一遍。你想想看,信号要从板子进来,经过 PLL 倍频,再送到串化器和解串器,每一步都有讲究。

参考时钟:一切从这里开始

参考时钟是整个 GTY 时钟树的源头。它可以是差分对、单端,也能从内部其他时钟资源引来。我个人习惯尽量用差分时钟输入,噪声抑制好很多。

参考时钟源 说明 注意事项
差分外部时钟 通过专用差分引脚输入 推荐用于高频场景,抗干扰强
单端外部时钟 通过单端引脚输入 避免超过 200MHz,容易受噪声影响
内部时钟资源 由 MMCM/PLL 生成后引入 注意抖动累积,我曾在这里踩过坑
实际经验:我建议参考时钟频率尽量选芯片手册推荐的“干净”频点,比如 125MHz、156.25MHz。这样做的好处是 QPLL/CPLL 容易锁定,而且抖动小。我曾经贪图方便用了一个非标频率,结果 PLL 死活锁不上,白白折腾了一整天。

QPLL 和 CPLL:两个 PLL 怎么选?

GTY 收发器里有两种 PLL:QPLL(Quarter PLL)和 CPLL(Channel PLL)。它们负责把参考时钟倍频到线速率所需的时钟。说白了,QPLL 是“大力士”,CPLL 是“灵活派”。

QPLL(共享型 PLL)

每个 QPLL 可以同时驱动相邻的 4 个通道(一个 Quad)。它支持的线速率范围更宽,抖动更小。我一般在高线速率场景(比如 25Gbps 以上)用 QPLL。但是要注意,一个 Quad 内所有通道必须用相同的线速率——这是它的硬限制。

CPLL(通道专用 PLL)

每个通道有一个独立的 CPLL。它只能驱动自己的通道,但好处是每个通道可以跑不同的速率。适合多速率混用的设计,比如一个 Quad 里既有 PCIe Gen3 又有 10G Ethernet。

特性 QPLL CPLL
共享范围 Quad 内 4 个通道 仅 1 个通道
线速率上限 最高 32.75Gbps 最高 16.3Gbps
通道速率独立性 必须一致 每个通道可不同
推荐场景 单一高速率协议 多速率混合设计
避坑指南:我曾经在一个项目里同时用了 QPLL 和 CPLL,结果发现 QPLL 的参考时钟抖动通过电源耦合到了 CPLL 上。嗯,这其实是 Layout 问题——两个 PLL 的供电网络必须做物理隔离,不能共用同一个 LDO。否则你可能会遇到随机链路失锁,特别头疼。

TX/RX 时钟:数据从哪来,到哪去?

经过 PLL 倍频后得到的是高速串行时钟,但收发器内部还需要并行时钟才能和 FPGA 逻辑交互。这里涉及两组时钟域:TXUSRCLK 和 RXUSRCLK。它们分别对应发送和接收的并行数据接口。

TX 时钟域

TXUSRCLK 是发送侧并行数据时钟。它的频率 = 线速率 / 数据位宽。比如线速率 10.3125Gbps,使用 64B/66B 编码(实际数据位宽 64),那么 TXUSRCLK = 10.3125 / 64 ≈ 161.1MHz。FPGA 逻辑在这个时钟下把并行数据推给收发器,再由 TX_PLL 把它串化出去。

RX 时钟域

RXUSRCLK 是接收侧并行数据时钟。注意,它和 TXUSRCLK 频率可以不同——因为收发器内部有弹性缓冲(elastic buffer)。但实际工程中我建议 RX 和 TX 用同一个时钟源,除非你有明确的异步需求。否则跨时钟域处理要小心,我会在后面的章节详述。

核心要点:TXUSRCLK 和 RXUSRCLK 的抖动容忍度比参考时钟严格很多。你在 FPGA 内部走线时,尽量让这两个时钟扇出少于 20 个负载,并且远离其他高频切换信号。我个人习惯在收发器旁边放一个专用的 BUFG_GT,专门给 TXUSRCLK 和 RXUSRCLK 缓冲用。
GTY 收发器时钟结构总览 差分/单端参考时钟 REFCLK0/1 PLL 选择 QPLL(共享) 驱动 4 通道 CPLL(专用) 驱动 1 通道 TX PLL RX PLL TXUSRCLK RXUSRCLK 弹性缓冲 (Elastic Buffer) 允许 TX/RX 异步
特别注意:弹性缓冲(Elastic Buffer)虽然可以处理 TX/RX 时钟的异步,但它不是万能的。缓冲深度有限,如果你两个时钟的频率偏差超过 ±300ppm,数据就可能溢出或下溢。我过去一个设计因为用了不同频率的参考时钟给 TX 和 RX,导致链路间歇性误码,排查了三天才发现是弹性缓冲满了。

时钟选型的实际建议

  1. 先确定线速率和协议——然后反推参考时钟和 PLL 选择。
  2. 尽量使用 QPLL,除非你需要混合速率。QPLL 的抖动表现通常优于 CPLL。
  3. 参考时钟的抖动指标:RMS 相位抖动最好小于 0.6ps(12kHz–20MHz 积分区)。我自己会留 0.4ps 的余量。
  4. 时钟分配网络:使用 IBUFDS_GTE4 原语来缓冲差分参考时钟,并加上 BUFG_GT 驱动 TXUSRCLK/RXUSRCLK。
  5. 跨通道共享:如果你想在一个 Quad 内所有通道用同一个 TXUSRCLK,得确认共用 QPLL——否则每个 CPLL 会生成不同频率的并行时钟,没法直接共享。

嗯,关于时钟结构的内容就这些。理解了参考时钟怎么进、PLL 怎么分、TX/RX 时钟怎么出,你就能自己规划整个时钟树了。下一部分我们聊聊收发器的发送和接收通道,看看数据是怎么一步一步串化和解串的。