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(双数据速率) |
|---|---|---|
| 数据采样边沿 | 仅使用上升沿(或仅下降沿) | 上升沿 + 下降沿 |
| 时钟频率 | 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 布线需要特别注意的几点:
- 时钟线单独走:不要跟其他高速信号并行走,减少串扰
- 等长要精确:时钟到每组数据线的长度差,尽量做到 ±50 mil 以内
- 避免过孔:过孔越多,信号质量越差。实在不行,最多两个过孔
- 参考平面完整:最好有完整的 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 之一正常) | 某一路数据线等长不匹配 |
| 靠近板边时问题更严重 | 参考平面不连续,阻抗突变 |
嗯,今天就聊这么多吧。这部分内容看着简单,但很多实际问题的根因都在这里。你们有空可以拿着示波器实际测一下自己板子的时钟和数据波形,印象会深刻得多。