以太网 MAC-PHY 接口:MII/RMII/GMII 时序与时钟方向
更新时间:2026-09-19。前置:理解 跨时钟域 FIFO。MAC 负责组帧/CSMA,PHY 负责物理层线路编码,二者之间用「介质无关接口(xMII)」解耦——换不同 PHY 不用改 MAC。
本文要回答的问题
- MII/RMII/GMII/RGMII 引脚和速率怎么对应 10/100/1000M?
- 时钟谁提供、什么频率,方向为什么容易接错?
- RGMII 双沿采样和那关键的 2ns(90°)延迟是什么?
- MDIO 怎么配置 PHY、RX 通路怎么做跨时钟域?
一、接口家族对比
| 接口 | 位宽 | 速率 | 时钟 | 引脚(数据/控制) | 备注 |
|---|---|---|---|---|---|
| MII | 4 bit | 10/100M | TX 2.5/25M、RX 由 PHY 给 | ~16 | 经典、引脚多 |
| RMII | 2 bit | 10/100M | 统一 50MHz(常外部供) | ~8 | 省线,时钟同源 |
| GMII | 8 bit | 10/100/1000M | 125MHz(千兆) | ~24 | 与 MII 兼容扩展 |
| RGMII | 4 bit 双沿 | 10/100/1000M | 125M DDR(千兆) | ~12 | 主流板级接口 |
| SGMII | 串行 LVDS | 千兆 | SerDes 恢复时钟 | 4 差分 | 走背板/长距 |
RGMII 用 4 根数据线在时钟双沿传 8 bit:千兆下 125MHz × DDR × 4bit = 1000Mbps。RMII 用 2 bit @50MHz(50M×2=100M,10M 时每 10 个时钟采一次有效)。
二、时钟方向(最易出错)
- MII 发送:TX_CLK 在 100M 时其实由 PHY 提供(标准 MII 收发时钟都来自 PHY);很多 SoC 的 MAC 也可由内部/PLL 供参考。RMII 则要求 MAC 与 PHY 共用外部 50MHz 参考时钟(REF_CLK 可由某一侧驱动但必须同源)。
- 接收方向:RX_CLK 永远由 PHY 从线路恢复/产生,MAC 用它采样 RXD/RX_DV,是典型源同步。
- RGMII:GTX_CLK(千兆发送)由 MAC 驱动给 PHY;RX_CLK 由 PHY 驱动给 MAC。
三、RGMII 的 2ns 延迟
双沿(DDR)接口里,数据在时钟边沿同时翻转,若直接用该边沿采样会落在跳变区。标准做法让时钟相对数据延迟约 2ns(千兆下 90°相移),使采样窗口居中:
- 可在 PHY 内部用寄存器加延迟(TX/RX internal delay),或
- 在 PCB 等长绕线上做时钟延迟。
两端不能都加(会过冲到 4ns 反而采到边界)也不能都不加,必须按硬件设计在设备树/PHY 寄存器里对齐。
控制信号 DDR 编码:RGMII 把 RX_DV 与 RX_ER 合并到 RX_CTL 双沿(上升沿 DV、下降沿 DV XOR ER),TX 同理。
四、MDIO 管理接口
MDC(时钟,≤2.5MHz 常见)+ MDIO(半双工数据线),MAC 借此读写 PHY 寄存器(Clause 22:地址 0–31,如寄存器 1=状态、4=自协商广告、0=控制)。枚举链路、读 link/speed/duplex、配自协商都走它(配置方法见 MDIO 管理)。
五、MAC 侧数据通路
线路 ─PHY─► RXD/RX_DV @RX_CLK(PHY) ─► [异步FIFO] ─► 收帧/MAC系统时钟
MAC系统时钟 ─► [异步FIFO] ─► TXD/TX_EN @GTX/TX_CLK ─► PHYRX 时钟与 MAC 系统时钟异步,必须经 异步 FIFO(Gray 指针) 缓冲再写描述符/DMA,不能直接进系统域。
六、常见的坑
- RGMII 2ns 延迟双端都开/都不开:最常见的「link up 但收不到包/CRC 错误」,核对 PHY 寄存器与设备树 delay mode。
- 时钟方向接反:把该 PHY 供的 RX_CLK 接到 MAC 输出,或 REF_CLK 不同源导致 RMII 漂移。
- RMII 50MHz 精度/同源:MAC、PHY 用两个不同 50MHz,ppm 偏差累积出 FIFO 溢出/CRC。
- 电压不匹配:RGMII 有 3.3V/2.5V/1.8V 变体,PHY 与 MAC 不一致直接损坏或不收。
- 控制信号 DDR 编码未处理:RGMII RX_CTL 要按「上升 DV、下降 DV^ER」解码,当成普通 RX_DV 会漏错误帧。
- 跨时钟域直连:RXD 不过 FIFO 直接进系统逻辑,亚稳态。
- 10/100/1000 时钟档切换未处理:RGMII 不同速率时钟 2.5/25/125M,复位/重配时序错会卡死。
- MDIO 子句/地址错:Clause 45(万兆/部分新 PHY)用 Clause22 时序访问失败;PHY 地址由拉线决定。
- PCB 等长/参考面:千兆 DDR 对数据线-时钟偏斜敏感,绕线不匹配采样偏。
- 复位/上电时序:PHY 复位释放与 REF_CLK 稳定先后错,自协商不起。
- 自协商与强制速率不匹配:一端自协商一端强制 100F,会协商成半双工产生晚冲突。
相关与延伸
总结
xMII 是 MAC 与 PHY 的解耦层:MII 4bit、RMII 2bit@同源50MHz、GMII 8bit、RGMII 4bit 双沿@125MHz 覆盖 10/100/1000M;接收时钟 RX_CLK 恒由 PHY 源同步给 MAC,RGMII 发送 GTX_CLK 由 MAC 给 PHY,且 DDR 双沿要求时钟相对数据有约 2ns(90°)相移——这个延迟只能在 PHY 内或 PCB 单边加一次,配合 RX_CTL 的 DV/ER 双沿编码和 RX→系统域异步 FIFO;时钟方向、2ns 延迟重复/缺失和电压档不匹配是三大根因。