1. RGMII 接口概述
RGMII——Reduced Gigabit Media Independent Interface,直译过来就是“简化吉比特介质无关接口”。说白了,它是把原来的 25 根线(GMII)一刀砍到 12~13 根,省引脚、省 PCB 走线空间。我个人最早接触 RGMII 是在一个 4 端口交换机项目上,那时候对时序还不太敏感,结果样板一测,千兆死活不通。嗯,从那以后我就老老实实把 RGMII 的“定时关系”琢磨透了。
1.1 标准定义
RGMII 由 HP 公司与 Cisco 公司在 2000 年左右共同提出,后来被 IEEE 802.3 附件收录。它保留 GMII 的数据通道宽度(4-bit),但把时钟频率从 125 MHz 降为 125 MHz 双沿采样(DDR),实际上每位数据只用了半个时钟周期。在千兆模式下,芯片在时钟上升沿发送低 4 位,下降沿发送高 4 位。这样一根时钟线就能搞定 8-bit 数据的同步。
我建议大家把 RGMII 视为一个“简化版 DDR 接口”——它的核心就是源同步双沿传输。你想想看,一根时钟线要承载两倍数据速率,对时钟占空比、skew 的要求自然就高了。
| 项目 | GMII | RGMII |
|---|---|---|
| 信号线数 | 24(含独立收发时钟) | 12~13(收发共用时钟或独立) |
| 数据宽度 | 8-bit 单沿 | 4-bit 双沿(DDR) |
| 时钟频率(千兆) | 125 MHz | 125 MHz(双沿等效 250 MT/s) |
| 典型封装 | LQFP 多引脚 | BGA 少引脚 |
1.2 信号分类
RGMII 分成两大组:发送组和接收组。每组里就几根线——数据、时钟、控制。
- TXD[3:0] — 发送数据,4-bit 双沿。我曾经在某款 PHY 上踩过坑:TXD 布线等长没做好,导致上升沿和下降沿采样到的数据错位。后来强制约束每根 TXD 与 TX_CLK 的时延差在 ±50 ps 以内才算过关。
- TX_CLK — 发送时钟,由 MAC 或 PHY 提供(取决于工作模式)。频率 125 MHz(千兆)或 25 MHz(百兆)。注意:百兆模式下是单沿采样。
- TX_CTL — 发送控制信号,编码帧首/错误等信息。在 RGMII 里不仅做使能,还带“编码”功能。
- RXD[3:0] — 接收数据,同样双沿。
- RX_CLK — 接收时钟,由 PHY 恢复给 MAC。
- RX_CTL — 接收控制信号。
重点:RGMII 没有独立的数据有效信号,而是把 TX_EN 和 TX_ER 编码进 TX_CTL 里。在上升沿采样 TX_EN,下降沿采样 TX_ER。设计 PCB 时必须保证 TX_CTL 与 TX_CLK 的时序一致。
1.3 电气特性(VOH/VOL/阈值)
RGMII 的电气标准基于 LVCMOS 1.8V 或 3.3V,具体取决于芯片 I/O 电压。多数现代芯片用 1.8V 以降低功耗。关键参数如下:
| 参数 | 最小值 | 典型值 | 最大值 | 单位 |
|---|---|---|---|---|
| VOH(输出高) | VDDIO - 0.4 | — | VDDIO | V |
| VOL(输出低) | 0 | — | 0.4 | V |
| VIH(输入高阈值) | 0.65 × VDDIO | — | VDDIO+0.3 | V |
| VIL(输入低阈值) | −0.3 | — | 0.35 × VDDIO | V |
个人习惯:在原理图阶段就给 RGMII 信号加上串联电阻(22Ω~33Ω),靠近源端放置。这样能抑制过冲,改善信号完整性。我曾在一个项目里没加电阻,结果眼图测试发现过冲高到 2.4V(1.8V 电平),差点把 PHY 烧了。
1.4 典型应用场景
RGMII 几乎统治了交换机、路由器、FPGA 开发板、SoC 与 PHY 之间的互联。具体场景:
- 家用路由器:CPU 内部 MAC 通过 RGMII 连接外部千兆 PHY,成本敏感但性能足够。
- 工业以太网:需要 ESD 隔离,RGMII 信号通常经过磁性变压器或 RJ45 模块,但接口本身还是 RGMII。
- FPGA 高速通信:Xilinx Zynq / Altera SoC 的硬核 MAC 往往引出 RGMII,FPGA 内部做协议栈或硬件加速。
- 背板互联:短距离板对板用 RGMII 可省大量走线,我曾见过一块背板上 8 路 RGMII 跑满千兆无串扰。
1.5 RGMII 接口知识体系
下面这张图把 RGMII 的整体知识结构画出来了,大家可以对照着理解各知识点的关联。
注意:RGMII 的时序窗口非常窄——千兆模式下数据有效窗口只有约 1 ns。我曾经调试过一块 6 层板,因为 FPGA 内部 PLL 相位没配好,导致 RX_CLK 和 RXD 之间差了 500 ps,整个链路丢包率高达 30%。后来在约束文件里加了 -500 ps 的 set_output_delay 才解决。
1.6 小结
RGMII 看似简单——就十几根线,但它的双沿 125 MHz 传输对 PCB 布局、时序约束和信号完整性都提出了不低的要求。记住几个关键点:
- 时钟和数据必须等长,组内偏差尽量 < 50 ps。
- 串阻不能省,1.8V 接口用 22Ω 附近值,具体根据仿真调整。
- 控制信号(TX_CTL / RX_CTL)编码规则:上升沿是 TX_EN,下降沿是 TX_ER,别搞反。
- 百兆模式兼容:时钟 25 MHz 单沿,但信号线复用同一组,注意 PHY 配置。
我自己在设计 RGMII 时,会先把 PHY Data Sheet 里的时序图打印出来,拿荧光笔标出 setup/hold 时间,然后用 FPGA 的 IDELAY / ODELAY 微调相位。这种方法虽然土,但很稳——因为你永远不知道下一颗芯片的 PVT 会偏移多少。