RGMII 时钟与数据关系(DDR)

好,我们直接进入正题。RGMII 这个接口,名字里就带着“简化”。但你要是真把它想简单了,调试的时候肯定得吃苦头。我最早接触这个接口时,就犯过一个低级错误——以为它跟普通并行接口一样,时钟沿抓数据就完事了。结果板子调了三天,死活不通。

实际上,RGMII 最核心的特点,就是它用了 DDR(双数据速率) 传输。这意味着什么?说白了,就是时钟的上升沿和下降沿都要传输数据。

一根时钟线,两根数据线(TXD/RXD),再加两根控制线(TX_CTL/RX_CTL),总共七根线就把 GMII 的 25 根线给替代了。代价是什么?代价就是对时序的要求更苛刻了。

3.1 什么是 DDR 模式

你想想看,传统的 SDR 模式,比如 SPI,一个时钟周期只传一个 bit。时钟上升沿来一次,数据才动一次。但 RGMII 不是,它一个时钟周期里,上升沿传低 4 位(TXD[3:0]),下降沿传高 4 位(TXD[7:4])。

这样一来,同样是 125MHz 的时钟,SDR 只能跑 125Mbps,RGMII 却能跑到 250Mbps。这就是效率翻倍的秘密。

但问题也来了——下降沿的数据怎么保证稳定?如果时钟占空比不是严格的 50% 呢?嗯,这里要特别注意。

SDR 与 DDR 对比
项目 SDR(单数据速率) DDR(双数据速率)
数据采样边沿 仅使用上升沿(或仅下降沿) 上升沿 + 下降沿
时钟频率 125 MHz 125 MHz
数据速率 125 Mbps 250 Mbps
对时钟占空比要求 宽松(±10% 以内即可) 严格(需控制在 ±5% 以内)
布线要求 等长较宽松 严格等长匹配

3.2 数据与时钟的相位关系

这是我调试时最头疼的部分。RGMII 协议规定,时钟和数据之间是 中心对齐(Center-Aligned) 的关系。什么意思?就是说数据在时钟边沿 中间位置 跳变。

你看下面的波形示意图就明白了:时钟的上升沿到来时,数据正处于稳定区域;下降沿来临时,数据也刚好在稳定区。这样一来,接收端无论是用上升沿还是下降沿采样,都能抓到正确的数据。

核心要点:

  • 数据跳变发生在时钟边沿的中间位置
  • 接收端直接用时钟边沿采样即可
  • 不需要额外的延迟调整

但理想很丰满,现实很骨感。我在项目中遇到过一个问题:PCB 走线明明等长了,示波器一看,数据和时钟之间的偏移还是很大。后来才发现,是驱动芯片内部的输出延迟不一致导致的。这就是所谓的 Tskew 问题。

3.3 关键在于 Tskew 控制

RGMII 的时序参数里,最重要的就是 Tskew。它指的是数据和时钟之间的相对偏移。协议要求这个偏移量必须控制在 ±500ps 以内。

为什么是 500ps?因为 125MHz 时钟周期是 8ns,DDR 模式下每个数据窗口只有 4ns。如果偏移超过 500ps,再加上 PCB 走线的抖动、芯片本身的抖动,很容易就把数据窗口给吃了。

避坑指南:

我曾经有一次,因为 MAC 和 PHY 之间走线长了 2 英寸,导致 Tskew 超标。示波器上看波形完全正常,但就是偶尔丢包。后来加了一级 delay chain 才解决。所以啊,不要迷信示波器看到的单个波形,要看眼图和 jitter。

3.4 实际布线时的经验

关于布线,我个人习惯把时钟线和数据线的长度差控制在 ±50 mil 以内(约 1.27mm)。这个经验值来自多次失败的教训。记得有一次,我觉得 ±100 mil 应该没问题,结果量产时发现 10% 的板子跑不稳定。

我来总结一下,RGMII 布线需要特别注意的几点:

  1. 时钟线单独走:不要跟其他高速信号并行走,减少串扰
  2. 等长要精确:时钟到每组数据线的长度差,尽量做到 ±50 mil 以内
  3. 避免过孔:过孔越多,信号质量越差。实在不行,最多两个过孔
  4. 参考平面完整:最好有完整的 GND 层作为回流路径

3.5 占空比与时钟质量

DDR 模式下,时钟的占空比特别重要。如果占空比不是严格的 50% 怎么办?那上升沿和下降沿之间的时间就不对称了。比如占空比是 45%/55%,那么上升沿到下降沿的时间是 3.6ns,下降沿到上升沿却是 4.4ns。

这样一来,低 4 位数据的建立时间只有 3.6ns,而高 4 位却有 4.4ns。两边不等,就很容易导致其中一组数据采样出问题。

我在项目里就吃过这个亏。当时用的 PHY 芯片时钟占空比偏差比较大,达到 8%。结果百兆模式没问题,千兆模式就频繁 CRC 错误。查了三天,最后是加了一个时钟扇出缓冲器才解决的。

小技巧:

调试时,可以先测一下时钟占空比。用示波器的占空比测量功能,看是否在 45% ~ 55% 之间。如果超出这个范围,建议先解决时钟源的问题,再排查其他。

你可能会问,为什么百兆模式没问题?因为百兆模式下时钟只有 25MHz,每个数据窗口是 40ns,占空比偏差的影响就没那么明显了。所以说,速率越高,对时钟质量的要求也越严格。这个道理其实放之四海而皆准。

3.6 板级调试的常见现象

最后分享几个我在调试中遇到过的典型现象,如果你们遇到类似情况,可以快速定位问题:

常见问题与根因
现象 可能根因
链路能建立,但大量丢包 Tskew 超标,数据采样不稳定
百兆正常,千兆不通 时钟占空比偏差过大
偶发性 CRC 错误 时钟抖动(jitter)偏大
仅单向通(TX 或 RX 之一正常) 某一路数据线等长不匹配
靠近板边时问题更严重 参考平面不连续,阻抗突变

嗯,今天就聊这么多吧。这部分内容看着简单,但很多实际问题的根因都在这里。你们有空可以拿着示波器实际测一下自己板子的时钟和数据波形,印象会深刻得多。