第1节:RGMII接口概述与发展历史归纳总结

1.1 为什么要聊RGMII?

做嵌入式网络开发的朋友,多半跟以太网PHY打过交道。RGMII(Reduced Gigabit Media Independent Interface)算是目前最主流的PHY-MAC互联接口之一。我个人习惯先搞懂接口的来龙去脉,再去调时序,这样踩坑时心里有数。

说白了,RGMII就是GMII的“减配版”——把信号线从24根砍到12根,时钟频率从125MHz提到250MHz(双沿采样),从而在PCB走线少、成本低的场景下跑满千兆。你想想看,十年前做交换机,板子上密密麻麻的差分线,现在一块四层板就能搞定。

我记得第一次接触RGMII是在一个工业相机的项目里,MAC端是FPGA,PHY用的是Marvell的88E1111。当时光看数据手册就被一堆时序参数搞晕了,后来才明白,RGMII的精髓就在那个“时钟偏置”上。

1.2 从MII到RGMII:接口的进化史

以太网接口的发展可不是一蹴而就的。咱们简单捋一下脉络:

接口信号线数时钟频率数据位宽主要问题
MII1825 MHz (100M) / 2.5 MHz (10M)4位百兆还行,千兆不够用
GMII24125 MHz8位信号线太多,PCB走线压力大
RGMII12125 MHz (DDR) / 250 MHz (DDR)4位 (DDR)时序窗口窄,对skew敏感
SGMII4 (串行)625 MHz (DDR) / 1.25 GHz1位串行需要SerDes,成本高

你看到了吧?RGMII相当于在GMII基础上做了“减线不减速”的折中。怎么做到的呢?——用双沿采样(DDR)。每个时钟周期内,上升沿和下降沿各采一次数据,这样数据带宽不变,但时钟频率可以降低一半。

关键认知:RGMII的千兆速率下,TX_CLK是125MHz,但数据在上下沿各发出4位,合起来就是8位/时钟周期,等效于250M数据速率。所以PCB上只需要走一个时钟对和四根数据线,比GMII清爽多了。

1.3 RGMII接口信号详解

别看只有12根线,每一根都有讲究。我把常用的信号列出来:

  • TX_CLK:发送时钟,由PHY或MAC提供(取决于配置),频率125 MHz(千兆)或25 MHz(百兆)。
  • TXD[3:0]:发送数据,DDR模式,上升沿和下降沿各送4位。
  • TX_CTL:发送控制信号,上升沿表示TX_EN,下降沿表示TX_ER。
  • RX_CLK:接收时钟,由PHY恢复并向MAC输出。
  • RXD[3:0]:接收数据,DDR模式。
  • RX_CTL:接收控制信号,类似TX_CTL。

嗯,这里要注意:RGMII v2.0之后允许TX_CLK由MAC提供(称为“源同步”模式),但多数老PHY还是走内部PLL。我在项目中遇到过因为时钟源选错导致时序违例,后来改成MAC提供时钟才稳下来。

1.4 核心时序挑战:时钟偏置(Clock Skew)

为什么RGMII时序校准这么难?因为DDR模式对时钟与数据之间的相对关系极其苛刻。GMII里数据在时钟沿跳变前后都有半个周期(4ns)的稳定区,而RGMII里数据就在时钟沿上翻转,留给采样的窗口只有1ns左右。

为了缓解这个问题,标准规定:发送端的数据相对于时钟需要有一个1.5ns~2.0ns的延迟(称为“内部延迟”或“pad skew”)。简单说就是让数据晚于时钟沿到达接收端,这样接收端就能用时钟沿采到稳定的数据。

我曾经有一个板子,PHY和MAC之间走线差了几十mil,结果死活连不上千兆。用示波器一抓,发现数据与时钟之间只差了0.5ns,完全不符合RGMII的时序要求。后来在PHY寄存器里打开了“TX内部延迟”选项,加了1.5ns偏置,问题立刻解决。这件事让我记住了:RGMII的时序校准核心就是“调偏置”。

1.5 典型应用与寄存器配置思路

RGMII几乎包揽了所有中低速以太网场景:

  • 家用路由器/网关(Realtek、Broadcom方案)
  • 工业以太网(FPGA + PHY组合)
  • 车载以太网(部分1000BASE-T1仍用RGMII)
  • 交换机背板互联

PHY内部一般通过MDIO/MDC访问寄存器来调整时序。常见的寄存器包括:

寄存器地址功能典型值
0x00 (BMCR)基本控制,复位/速度/双工0x1000(复位)
0x1A (PHYSTS)链路状态、速度指示只读
0x1C (RGMIICTL)RGMII内部延迟使能/调整bit[3] TX延迟,bit[2] RX延迟
0x1D (RGMIISTAT)RGMII状态与校准值校验后读取

当然不同厂商的PHY寄存器映射差异巨大。后面章节我会详细拆解常见PHY(比如Marvell、TI、Realtek)的具体配置流程。

1.6 知识框架图:RGMII时序校准的核心要素

RGMII时序校准核心要素 接口信号 TX_CLK / RX_CLK TXD[3:0] / RXD[3:0] TX_CTL / RX_CTL 时序参数 时钟偏置 (1.5-2ns) Tsetup / Thold DDR 双沿采样 寄存器配置 内部延迟使能 TX/RX Skew调整 驱动强度设置 常见问题与校准方法 眼图闭合 → 调整内部延迟 链路协商失败 → 检查时钟源与偏置 误码率高 → 增加TX驱动电流 本课程将贯穿这三要素:信号规范 → 时序计算 → 寄存器实操

1.7 我的经验:入门RGMII的避坑清单

最后分享几个我在实战中总结的要点,希望能帮你少走弯路:

  1. 先看时钟极性:不同PHY对TX_CLK的极性定义可能不同,有的要求在上升沿输出数据,有的在下降沿。务必对照数据手册。
  2. 内部延迟不是万能的:有些PHY只支持固定的1.5ns或2ns偏置,无法微调。遇到这种情况,PCB走线等长必须做到±50mil以内。
  3. 调试时用“回环模式”:大部分PHY支持内部回环(loopback),可以先在寄存器里把TX和RX短接,验证MAC侧RGMII接收逻辑是否正确。
  4. 别忽略地平面:RGMII是单端信号,参考地平面必须连续。我曾经在一块四层板上为了节省成本把地层挖了一块,结果导致数据线串扰严重,千兆始终无法建链。
  5. 保存寄存器快照:每次调完一组参数,建议用MDIO工具把寄存器值读出来存档。万一改乱了还可以恢复。