第1节:RGMII接口概述与发展历史归纳总结
1.1 为什么要聊RGMII?
做嵌入式网络开发的朋友,多半跟以太网PHY打过交道。RGMII(Reduced Gigabit Media Independent Interface)算是目前最主流的PHY-MAC互联接口之一。我个人习惯先搞懂接口的来龙去脉,再去调时序,这样踩坑时心里有数。
说白了,RGMII就是GMII的“减配版”——把信号线从24根砍到12根,时钟频率从125MHz提到250MHz(双沿采样),从而在PCB走线少、成本低的场景下跑满千兆。你想想看,十年前做交换机,板子上密密麻麻的差分线,现在一块四层板就能搞定。
1.2 从MII到RGMII:接口的进化史
以太网接口的发展可不是一蹴而就的。咱们简单捋一下脉络:
| 接口 | 信号线数 | 时钟频率 | 数据位宽 | 主要问题 |
|---|---|---|---|---|
| MII | 18 | 25 MHz (100M) / 2.5 MHz (10M) | 4位 | 百兆还行,千兆不够用 |
| GMII | 24 | 125 MHz | 8位 | 信号线太多,PCB走线压力大 |
| RGMII | 12 | 125 MHz (DDR) / 250 MHz (DDR) | 4位 (DDR) | 时序窗口窄,对skew敏感 |
| SGMII | 4 (串行) | 625 MHz (DDR) / 1.25 GHz | 1位串行 | 需要SerDes,成本高 |
你看到了吧?RGMII相当于在GMII基础上做了“减线不减速”的折中。怎么做到的呢?——用双沿采样(DDR)。每个时钟周期内,上升沿和下降沿各采一次数据,这样数据带宽不变,但时钟频率可以降低一半。
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”)。简单说就是让数据晚于时钟沿到达接收端,这样接收端就能用时钟沿采到稳定的数据。
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时序校准的核心要素
1.7 我的经验:入门RGMII的避坑清单
最后分享几个我在实战中总结的要点,希望能帮你少走弯路:
- 先看时钟极性:不同PHY对TX_CLK的极性定义可能不同,有的要求在上升沿输出数据,有的在下降沿。务必对照数据手册。
- 内部延迟不是万能的:有些PHY只支持固定的1.5ns或2ns偏置,无法微调。遇到这种情况,PCB走线等长必须做到±50mil以内。
- 调试时用“回环模式”:大部分PHY支持内部回环(loopback),可以先在寄存器里把TX和RX短接,验证MAC侧RGMII接收逻辑是否正确。
- 别忽略地平面:RGMII是单端信号,参考地平面必须连续。我曾经在一块四层板上为了节省成本把地层挖了一块,结果导致数据线串扰严重,千兆始终无法建链。
- 保存寄存器快照:每次调完一组参数,建议用MDIO工具把寄存器值读出来存档。万一改乱了还可以恢复。