2、RGMII接口协议详解:信号定义、时序参数与电气特性

RGMII,全称是 Reduced Gigabit Media Independent Interface。说白了,就是简化版的千兆媒体独立接口。

它把原来 GMII 的 24 根线,硬生生压缩到了 12 根。怎么做到的?靠的是 DDR 双沿采样。时钟上升沿和下降沿各传一次数据,一根线当两根用。我第一次看 RGMII 波形的时候还挺不习惯,后来用多了发现,这招确实巧妙。

2.1 信号定义:每根线都不能错

RGMII 接口总共 12 根核心信号。我习惯把它们分成三组来记:时钟组、数据组、控制组。分组理清了,布线时就知道哪些线该扎堆走,哪些线要加长等长。

信号名 方向 宽度 说明
ETH_RXC PHY → MAC 1 接收时钟,125MHz
ETH_RX_CTL PHY → MAC 1 接收控制,上升沿传 RX_DV,下降沿传 RX_ERR
ETH_RXD[3:0] PHY → MAC 4 接收数据,上升沿传低 4 位,下降沿传高 4 位
ETH_TXC MAC → PHY 1 发送时钟,125MHz
ETH_TX_CTL MAC → PHY 1 发送控制,上升沿传 TX_EN,下降沿传 TX_ERR
ETH_TXD[3:0] MAC → PHY 4 发送数据,上升沿传低 4 位,下降沿传高 4 位

这里有一个非常关键的点:RXD 和 TXD 都只有 4 位宽。千兆模式下,数据位宽 8 位,全靠 DDR 把高 4 位和低 4 位分时传送。嗯,很多新入行的硬件同学第一次看到 4 位数据线能跑千兆,都会愣一下。我第一次搭 RGMII 板子时,还特意拿示波器去量波形才确认,确实是这么玩的。

每个数据信号在时钟的上升沿和下降沿各传输 4 位数据,合起来就是一个完整的 8 位字节。

2.2 控制信号的特殊编码

TX_CTL 和 RX_CTL 这两个信号,承担了 GMII 模式下 TX_EN、TX_ER、RX_DV、RX_ER 四个信号的功能。怎么做到的?同样靠 DDR 双沿。

发送方向(MAC → PHY):

  • 时钟上升沿:传送 TX_EN(发送使能)
  • 时钟下降沿:传送 TX_ER(发送错误)
  • 当 TX_EN=0 且 TX_ER=0:表示空闲
  • 当 TX_EN=1 且 TX_ER=0:表示正常发送数据
  • 当 TX_EN=1 且 TX_ER=1:表示发送 Carrier Extend

接收方向(PHY → MAC):

  • 时钟上升沿:传送 RX_DV(接收数据有效)
  • 时钟下降沿:传送 RX_ER(接收错误)

我曾经在一个项目里遇到过 RX_CTL 信号在下降沿抖动的问题。排查了整整两天,最后发现是 PCB 走线过长、参考平面不连续导致的。嗯,从此之后我布线时对 CTL 信号格外小心,要求它和数据线尽量等长。

2.3 时序参数:能不能稳定跑在 125MHz

RGMII 工作在 125MHz,DDR 模式下数据信号建立时间(Tsu)和保持时间(Th)都非常紧张。我个人习惯把时序要求分成三个等级:严格、中等、宽松,布线时心里有个优先级。

参数 最小值 典型值 最大值 说明
Tsu(建立时间) 1.0 ns 1.2 ns — 数据必须在时钟沿前 1ns 稳定
Th(保持时间) 1.0 ns 1.2 ns — 数据必须在时钟沿后保持 1ns
Skew(时钟到数据偏斜) -0.5 ns 0 +0.5 ns 时钟与数据之间的相对延迟差
Tj(时钟抖动) — ±40 ps ±100 ps 时钟周期抖动,越小越好

你想想看,125MHz 的一个时钟周期才 8ns。DDR 模式下,每个沿之间的间隔只有 4ns。再扣掉建立时间和保持时间的 2ns 预算,实际留给走线延迟的空间也就 2ns 左右。

RGMII 的时序余量非常小。PCB 上 1 英寸走线大约产生 140-180ps 的延迟。如果数据线和时钟线长度差超过 1 英寸,时序就可能出问题。在实际项目中遇到过几次因为等长没做够导致千兆跑不上去的案例。

2.4 电气特性:电压与驱动

RGMII 接口的电气特性,说白了就是电压等级和驱动能力。RTL8211 支持 1.8V 和 2.5V 两种模式,具体看芯片的 VDDO 引脚配置。

参数 1.8V 模式 2.5V 模式 单位
VOH(输出高电平) VDDO - 0.4 VDDO - 0.4 V
VOL(输出低电平) 0.4 0.4 V
VIH(输入高电平) 1.17 1.7 V
VIL(输入低电平) 0.58 0.7 V
IOL 4 4 mA
IOH 4 4 mA

有一点值得注意:RGMII 不是差分信号,是单端信号。所以不要把它和 Ethernet 的差分对混为一谈。RGMII 走线在 PCB 上要控制好 50Ω 单端阻抗,同时注意和相邻信号之间的间距,避免串扰。

我调试过一块板子,RGMII 的数据线跟一根时钟线挨得太近,串扰直接把信号质量搞坏了。示波器量波形,发现数据线上有毛刺。后来把间距拉到 3W(3 倍线宽),问题就解决了。很多时候,电气性能的问题都藏在布局布线的细节里。

2.5 时钟相位关系

RGMII 标准要求:时钟信号相对于数据信号,相位偏移 0° 或 90°。RTL8211 内部提供了相位调整的功能,可以通过寄存器配置。

  • 0° 模式:时钟沿与数据沿对齐。MAC 侧需要用 PLL 做相位调整把数据采样到时钟中间。
  • 90° 模式:时钟沿偏移 2ns(90° 相位),数据在时钟中间跳变。这种模式对 MAC 侧更友好,采样容限大。

从我个人的经验来看,我强烈建议使用 90° 模式。为什么呢?因为 0° 模式下,数据在时钟沿上跳变,MAC 侧稍微有一点点延迟偏差,采样窗口就没了。90° 模式把数据采样点放在时钟沿的中间,留出了 ±1ns 的余量,对 PCB 走线等长要求稍微宽松一些。

RGMII 信号组与时钟相位关系 发送组 TX TX_CLK TXD[3:0] TX_CTL MAC → PHY 接收组 RX RX_CLK RXD[3:0] RX_CTL PHY → MAC 时钟组 125MHz DDR 双沿采样 时钟偏斜 ≤ ±0.5ns 时钟相位关系说明 0° 模式:时钟沿与数据沿对齐,采样窗口窄 90° 模式:时钟沿偏移 2ns,数据在时钟中间跳变 推荐使用 90° 模式,采样容限更大,对 PCB 走线更友好 ⚠️ 数据线与时钟线等长偏差建议控制在 5mil 以内

2.6 总结几张表:核心知识点

信号、时序、电气特性,这三块合起来就是 RGMII 的全部家底。我最后用汇总表把它们串起来,方便你随时查阅。

知识点 核心要点 避坑提醒
信号定义 12 根线,分时钟、数据、控制三组 CTL 信号 DDR 双沿编码,容易忽略下降沿时序
时序参数 Tsu≥1ns,Th≥1ns,Skew≤±0.5ns 125MHz 周期 8ns,DDR 每个沿间隔 4ns,余量很小
电气特性 1.8V/2.5V 可选,单端 50Ω 阻抗 不是差分信号,别跟 Ethernet 差分对混淆
时钟相位 0° 或 90° 可选 强烈推荐 90° 模式,0° 模式容易采样错误
实际调试时,可以先看时钟信号是不是干净的 125MHz,幅度是不是达到 VIH 要求。时钟没问题,再查数据和控制信号的时序。我曾经吃过一次亏——时钟抖动太大导致千兆跑不稳,量了示波器才发现是电源纹波超标。