3. RGMII时钟与数据关系:源同步传输、DDR双沿采样

好,咱们今天来聊聊RGMII最核心的两个概念——源同步传输和DDR双沿采样。

说穿了,RGMII就是一种同步接口。但它跟普通的同步接口不太一样。我刚开始接触RGMII时,第一反应是:“这不就是给个时钟,然后数据在时钟边沿采一下嘛?”实际一调试才发现,里头门道不少。

RGMII用的是一种叫做“源同步”的传输方式。什么意思呢?就是发送端把数据和时钟打包一起送出去。接收端拿到这个时钟,就用它来采对应的数据。这和咱们常见的“共同时钟同步”完全是两码事。

核心区别一句话:

  • 源同步:时钟跟随数据一起走,时钟偏移(skew)只存在发送端内部。
  • 共同时钟:所有器件共享同一个时钟源,时钟偏移受PCB走线长度、温度、电压影响巨大。

我在项目中调试一款国产PHY和FPGA的对接时,就是吃了这个亏。一开始以为时钟和数据随便走一走就能采样,结果读回来的数据全是乱的。查了半天,才发现我用的布局方式忽略了源同步的根本要求——时钟和数据必须是“同源同路径”的关系。

3.1 源同步传输的本质

源同步传输,说白了就是发送端要告诉你:“嘿,我发数据的时候,顺便也把这个数据的眼睛时钟发给你,你用这个时钟来抓数据就行。”

在RGMII里,发送端的MAC或PHY会根据发送的数据产生一个随附时钟。这个时钟和数据在芯片内部经过相似的路径,然后通过各自的引脚输出。因为它们在片内的路径基本一致,所以时钟和数据的相对相位关系是可控的。

为什么要搞这么麻烦?你想想看,在高速传输(比如125MHz时钟,250Mbps数据率)下,如果采用共同时钟方案,PCB走线的延迟误差、外界温度变化、芯片间的工艺差异,都会让时钟和数据的相对位置变得不可预测。而源同步就把这个问题“局部化”了——时钟和数据在发送芯片内部已经对齐好,接收端直接用这个时钟去采样,大大减小了时钟分配网络的压力。

经验之谈:

实际上,RGMII接口的发送端(不管是MAC还是PHY)在生成时钟时,内部会自动引入一个约1.5ns~2.0ns的延迟(对于125MHz时钟来说,大约就是90°的相移)。这个相移的目的,就是让时钟的跳变沿正好落在数据位的中央。你别自己去加,也别去减,先确认芯片手册里是怎么写的。

3.2 DDR双沿采样机制

接着说说DDR。

RGMII的每个数据通道(TXD或RXD)都是4位宽的。但时钟只有一个。那怎么做到在同一个时钟周期里传输4位数据呢?答案就是DDR——双倍数据速率采样。

其实很简单:

  • 时钟的上升沿:采样低4位(例如TXD[3:0]的低两位,或者控制信号)。
  • 时钟的下降沿:采样高4位(剩下的两位,以及对应的控制信号)。

这样一来,在一个时钟周期内,一个4位的数据通道上实际上传输了4位+4位=8位的数据。这就是为什么RGMII在125MHz时钟下能达到1000Mbps(千兆)的吞吐量。

我刚开始用DDR时,总觉得下降沿采样不太靠谱。毕竟咱们做FPGA,默认都是上升沿触发。后来我专门写了个双沿采样的模块,在Altera器件上跑了一下,才发现只要时序约束做好,其实完全没问题。

注意:

DDR采样的关键在于,数据必须在时钟的两个边沿都保持稳定。也就是说,数据的变化只能发生在时钟沿之间。如果数据在时钟沿附近跳变,那就容易导致亚稳态。为了避免这个问题,RGMII规范要求数据相对于时钟的建立时间和保持时间要有足够的裕量。

你可以想象一下,时钟上升沿采到的数据和下降沿采到的数据,它们之间只隔了半个时钟周期(对于125MHz是4ns)。所以,对PCB走线的等长要求就非常苛刻。我曾经因为一组TXD走线比另一组长了1.5cm,导致在高温下出现间歇性的误码。那时候我就记住了:数据线的组内等长,是RGMII调试的第一道坎。

3.3 时钟与数据的相位关系

前面说到RGMII的时钟带了一个约90°的相移。这个相移是干什么用的?

请先看下面这张图:

RGMII源同步传输:时钟与数据相位关系 发送端MAC/PHY 数据生成 时钟生成 数据线 (TXD[3:0]) 时钟线 (TXC) 接收端 (RGMII接口) 有效数据窗口 (建立+保持) 数据跳变区 时钟沿应对准窗口中央 ← 约90°相移 (1.5-2ns) → 时钟沿采样 上升沿/下降沿 4bit数据 (低半字节) 上升沿采低4位

从图上看出什么来了吗?

时钟的边沿(无论是上升沿还是下降沿)都落在了数据的中央区域。这个“中央区域”就是数据的有效窗口。正因为有这个90°的相移,接收端才能安稳地采到数据,而不受跳变沿的干扰。

为什么会这样?其实逻辑很简单:

  1. RGMII的数据是DDR的,数据变化频率是时钟频率的两倍。
  2. 如果不加相移,时钟沿正好落在数据跳变的位置上,那采样结果就是不确定的。
  3. 加上90°相移后,时钟沿恰好在数据位的中间,这时候数据最稳定。

我在调试某款国产FPGA时发现,它的RGMII接收端没有做内部相移。这意味着必须在PCB上通过绕线给时钟线增加额外的延迟,或者在FPGA内部用PLL对时钟进行移相。否则,直接用这个时钟去采数据,十有八九会出错。那次我花了两天时间确认问题,最后在PHY的数据手册里找到了一行小字——“本芯片不提供内部时钟偏移”。嗯,从此我再也不会忽略数据手册的细枝末节了。

3.4 关键参数总结

好了,我整理一下RGMII时钟与数据关系的关键点:

参数 说明 典型值
时钟频率 千兆时为125MHz,百兆时为25MHz 125MHz / 25MHz
数据速率 DDR采样,每时钟周期传输2个半字节 250Mbps / 50Mbps per pin
时钟相移 时钟沿相对数据中央偏移约90° 1.5ns ~ 2ns(125MHz时)
数据建立时间(setup) 数据在时钟沿前需稳定 ≥ 1ns(典型)
数据保持时间(hold) 数据在时钟沿后需保持 ≥ 1ns(典型)
PCB等长要求 组内数据线与时钟线长度差 ≤ ±100mil(约±2.5mm)

避坑提示:

我曾经在一款千兆交换机的项目中,因为PCB上TXD[0]比TXD[1]长了200mil,结果在长时间运行后(板子发热)出现了偶发的CRC错误。查了好几天,最后用示波器一看,TXD[0]的边沿已经压到了TXD[1]的采样窗口边缘。所以,数据线组内等长是硬要求,不要心存侥幸。

3.5 小结

咱把这一章的核心梳理一下:

  • 源同步:时钟跟着数据一起走,接收端用这个时钟采样,大大减小了时钟偏移问题。
  • DDR双沿:在一个时钟周期内,上升沿和下降沿各采一次数据,提高了传输效率。
  • 90°相移:时钟沿故意偏移约1.5~2ns,让采样点落在数据中央,保证采样可靠。

理解这些,是后续调试时钟偏移的基础。你可能会问:“那如果板子上的延迟导致这个相移不准了怎么办?”嗯,这就是咱们后面几章要聊的——如何通过时序约束和PCB设计来保证相移的准确性。

记住一句话:RGMII的成败,就看时钟沿有没有落在数据窗里。