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 板子时,还特意拿示波器去量波形才确认,确实是这么玩的。
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 左右。
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 走线等长要求稍微宽松一些。
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° 模式容易采样错误 |