1. RGMII 接口概述与标准规范归纳总结

各位硬件工程师,大家好。咱们今天开始聊聊 RGMII。这个接口,说白了就是 Ethernet 世界里非常经典的一个桥接方案。我刚开始做嵌入式系统的硬件设计时,最先接触的就是这个接口,一用就是好多年,可以说感情很深,但也踩过不少坑。

RGMII,全称 Reduced Gigabit Media Independent Interface,是“简化千兆媒体独立接口”的缩写。你想想看,它名字里的“Reduced”很关键——相比前辈 GMII(Gigabit MII),它把数据线和时钟线从 20 多根减少到了 12 根。这背后是怎么做到的呢?嗯,核心思路就是:在时钟的双沿(上升沿和下降沿)都传输数据。这样一来,同样时间内的数据吞吐量翻倍,但引脚数量却大幅减少。

为什么要关注 RGMII? 今天市面上绝大多数千兆 Ethernet MAC 和 PHY 芯片都支持这个接口。你的 ARM 处理器、FPGA 或者网络交换芯片,基本上都会用到它。调试好 RGMII 意味着解决了高速数字系统中最典型的时序挑战之一。

1.1 从 GMII 到 RGMII:为什么需要“简化”?

我记得有一年做交换机项目,用的是经典的 GMII 接口。为了连接 MAC 和 PHY,我在 PCB 上拉了一大片信号线,光是数据线就是 8 根,再加上时钟、使能、错误信号,密密麻麻一片。那时候板子空间本来就不大,布线的难度非常大。

RGMII 的出现,就是为了解决这类问题。它(在千兆模式下)将 8 位数据总线压缩到 4 位,同时利用时钟的双沿采样,等效数据位宽不变。这样一来,板级布线变得简洁,引脚数量也减少了 40% 以上。

我们来看一下关键的信号列表:

信号名称 方向 (MAC视角) 宽度 功能描述
tx_clk 输出 1 发送参考时钟(125MHz 千兆 / 25MHz 百兆 / 2.5MHz 十兆)
tx_ctl 输出 1 发送控制信号(上升沿: TX_EN, 下降沿: TX_ER)
txd[3:0] 输出 4 发送数据总线(上升沿: 高4位, 下降沿: 低4位)
rx_clk 输入 1 接收参考时钟(由 PHY 恢复时钟提供)
rx_ctl 输入 1 接收控制信号(上升沿: RX_DV, 下降沿: RX_ER)
rxd[3:0] 输入 4 接收数据总线(上升沿: 高4位, 下降沿: 低4位)

注意看表格里的信号方向。发送时钟 tx_clk 是由 MAC 驱动给 PHY 的;而接收时钟 rx_clk 是由 PHY 恢复后送给 MAC 的。这一点在调试时非常重要——时钟的源和时序关系完全不同。

3.2 核心时序:双重数据率(DDR)的工作方式

为什么 RGMII 能在 125MHz 的时钟下跑出 1Gbps 的吞吐量?答案就在于它用上了双重数据率,也就是所说的 DDR(Double Data Rate)。普通的信号只在时钟上升沿采样,而 DDR 在上升沿和下降沿都采样,这样数据速率翻倍。

具体到 RGMII:

  • 时钟频率: 125MHz(千兆模式),周期 8ns。
  • 数据速率: 每根数据线在 8ns 内传输 2 比特,所以单线速率为 250Mbps。
  • 总吞吐量: 4 根数据线 x 250Mbps = 1Gbps。

我个人习惯: 在进行板级调试前,先确认 PHY 的时钟模式是 Normal 还是 Suppressed Clock。有些 PHY 默认输出的是 IDLE 状态下的时钟,或者时钟有特殊相位要求。我曾经吃过这个亏,拿到 PHY 出来的 rx_clk 以为是标准的,结果测出来波形是乱的。

你想象一下这个时序链路:MAC 在 tx_clk 的上升沿送出 txd[3:0] 的高 4 位和 tx_ctl(即 TX_EN),然后在 tx_clk 的下降沿送出 txd[3:0] 的低 4 位和 tx_ctl(即 TX_ER)。PHY 的接收端也要在同样的双沿采样。对齐是关键!

下面的 SVG 框架图清晰展示了这个 DDR 发送与接收的关系:

RGMII 发送与接收 DDR 流程框架 MAC 发送控制器 PHY 接收采样器 tx_clk 125MHz rx_clk PHY恢复 txd[3:0] + tx_ctl 上升沿: 高4位, TX_EN 下降沿: 低4位, TX_ER rxd[3:0] + rx_ctl 上升沿: 高4位, RX_DV 下降沿: 低4位, RX_ER 说明: 时钟与数据总线同步并行运行 PHY 在双沿采样,实现 1Gbps 速率

3.3 时序规范与 Tskew(偏移)的约束

RGMII 的标准由 IEEE 802.3 定义。在时序上,最核心的参数就是 时钟与数据的相对偏移,也就是 Tskew。这个参数决定了信号能否被接收端正确采样。

我个人习惯把标准中关键的时序参数归纳成一张表:

参数 最小值 最大值 单位 说明
Tskew(发送) -0.5 +0.5 ns tx_clk 到 txd/tx_ctl 的边沿倾斜
Tsetup(接收) 1.0 — ns rxd/rx_ctl 在 rx_clk 边沿前稳定时间
Thold(接收) 1.0 — ns rxd/rx_ctl 在 rx_clk 边沿后保持时间
Tcycle 7.5 8.5 ns 125MHz 时钟周期,允许 ±0.5ns 抖动
Tdutydist 45 55 % 时钟占空比,±5% 容许范围

看着挺规整的参数,是不是?但在实际项目中,Tskew 往往是导致通信不稳定的主因。

我曾经踩过的坑: 有一回做 FPGA + PHY 的板子,PCB 布局挺常规的,仿真也过了。但实际一跑千兆模式,偶尔会有 CRC 错误。查了半天,发现是 FPGA 生成的 tx_clk 到 PHY 的时钟走线比数据线短了 1.2 英寸。你以为 1.2 英寸没什么?在 FR4 板材上,这导致的传输延迟差大约 0.2ns,加上芯片内部的 Skew,直接超出了 ±0.5ns 的限值。后来我调整了走线等长,把时钟与数据的长度匹配控制在 ±20mil 以内,问题就消失了。

3.3 对内信号等长与 PCB 注意事项

说到 PCB 布线,RGMII 对等长的要求确实比普通并行接口更严格。我个人推荐的工程经验是:

  • 组内等长: 每个方向(发送组:tx_clk + tx_ctl + txd[3:0];接收组:rx_clk + rx_ctl + rxd[3:0])内的信号长度差控制在 ±50 mil 以内。
  • 组间误差: 发送组和接收组之间的长度不用强求一致,因为它们是两个独立的时钟域。
  • 阻抗控制: 单端 50Ω,差分线(如果有)100Ω。高速信号,阻抗匹配很重要。
  • 避免过孔: 尽量在同一层走完,少打过孔。一个过孔会增加约 20ps 的延迟,还会引入不连续性。
  • 参考平面: 时钟和高速数据线下方要有完整的 GND 平面,不要跨分割。

一个小技巧: 在 PCB Layout 完成后,我会用仿真工具(比如 HyperLynx 或 Sigrity)跑一下关键信号的时序眼图。看看眼图的张开高度和宽度是否满足 Tsetup/Thold。如果眼图闭合明显,我通常会在 PHY 侧或者 MAC 侧的 RGMII 引脚处预留串行电阻,用来微调信号边沿速率。

1.4 标准规范的变体:内部延迟 vs 外部延迟

RGMII 标准有一个重要的变体,就是所谓的 ID(Internal Delay) 模式。很多新一代 PHY 和 MAC 都支持这个功能。

早期标准的 RGMII 要求在 PCB 上对时钟进行走线延迟(比如在数据线周围绕大弯),来满足 PHY 的建立时间。这种方式称为外部延迟。但布线空间紧张时,很难做到。

ID 模式出了个简便办法:在芯片内部增加一个可编程的延迟单元,通常有 0ns、1.5ns、2.0ns 等档位。你可以在寄存器里配置从 MAC 输出的 tx_clk 相对于 txd 的相位差,或者在 PHY 侧配置 rx_clk 的相位。

我建议在项目初期就了解清楚你的 PHY 和 MAC 是否支持 ID 模式。如果支持,布局会轻松很多。

举个例子,我曾经在项目中用了一款国产 PHY,默认就是 ID 模式,加上 MAC 也有内部延迟配置。我只需要在驱动里设置延迟值,不需要在板上折腾等长,效果也很好。

1.5 小结与调试指南

RGMII 的调试,最怕的就是没掌握正确的时序约束。我总结了三点调试第一步:

  1. 看波形: 用示波器(最好有 500MHz 以上带宽)抓取发送时钟和对应数据线的边沿。
  2. 测 Tskew: 确保 tx_clk 边沿位于数据有效窗口的中间。如果不在,尝试调整 ID 延迟值。
  3. 对状态: 检查 PHY 的链路状态寄存器,确认是否建立了千兆全双工链路。如果只连上百兆,可能是时钟频率或者边沿采样的模式不对。

好了,这是第一章,主要把 RGMII 的来龙去脉和基本规范理清了。后面我们会深入具体的时序调试案例。