3 RGMII 电气特性与时序要求详解

说实话,搞硬件的人一看芯片手册,最头疼的就是时序图。一堆参数,什么 tskew、td、thd,看得人眼花。但你要想把 KSZ9031 跑稳,这部分必须啃下来。我今天就拆开了揉碎了,跟你聊聊 RGMII 的电气和时序。

3.1 RGMII 到底是什么?

咱们先说说背景。RGMII,全称 Reduced Gigabit Media Independent Interface。说白了,就是简化版的 GMII。为什么要有它?为了省引脚。

GMII 用了 24 根线来传数据,板子上走起来很麻烦。RGMII 把它压缩到了 12 根。怎么做到的?靠时钟双沿采样。一个时钟的上升沿和下降沿都传数据,这样频率没变,数据量翻倍。

我刚开始做这个接口时,有个误区——以为 RGMII 跟普通的并行接口一样好走。吃了亏才明白,它对时序的要求比想象中严苛得多。尤其是在百兆模式下,有些细节不注意,数据就错位了。

核心要点:RGMII 在时钟的上升沿和下降沿各传输 4 位数据。所以数据线只需要 4 根(RXD[3:0] 和 TXD[3:0]),加上控制信号,总共 12 根信号线。

3.2 电气特性——电压与信号质量

电气特性是基础。先看电压标准。KSZ9031 的 RGMII 接口用的是 3.3V CMOS 电平。但你要注意,它兼容 2.5V 和 1.8V。我建议你直接按 3.3V 来设计,省心。

参数 符号 最小值 典型值 最大值 单位
输入高电平 VIH 2.0 — 3.6 V
输入低电平 VIL — — 0.8 V
输出高电平 VOH 2.4 — — V
输出低电平 VOL — — 0.4 V

这里有个我踩过的坑。曾经有个项目,KSZ9031 跟 FPGA 直连,FPGA 那边的 IO Bank 电压设成了 1.8V。结果通信时好时坏。为什么?因为 KSZ9031 输出的 3.3V 电平,FPGA 的 1.8V 引脚根本吃不消。

我还遇到过信号反射的问题。RGMII 的频率是 125MHz(千兆模式下),信号跳变很陡。如果 PCB 走线阻抗不匹配,反射就会导致信号上出现过冲或下冲。严重时直接采错数据。

我的建议:

  • PCB 走线阻抗控制在 50Ω ± 10%
  • TX 和 RX 信号各自等长,长度差控制在 50mil 以内
  • 时钟线单独包地,避免被其他信号串扰

3.3 时序要求——时钟与数据的关系

时序这部分,是 RGMII 最容易出问题的地方。来看数据手册上怎么要求的。

对于 TX 路径(MAC 发数据给 PHY):

  • 时钟 TXC 的频率:125MHz(千兆)或 25MHz(百兆)或 2.5MHz(十兆)
  • 数据 TXD[3:0] 和 TX_CTL 必须在时钟边沿前后保持稳定
  • 建立时间(tsu):最小 1.0ns
  • 保持时间(thd):最小 1.0ns

对于 RX 路径(PHY 发数据给 MAC):

  • 时钟 RXC 由 PHY 提供
  • 数据 RXD[3:0] 和 RX_CTL 相对时钟边沿的延迟:1.5ns 到 2.5ns
  • 这个延迟是 KSZ9031 内部通过 DLL 产生的,目的就是让数据对齐到时钟边沿

你想想看,125MHz 的时钟周期是 8ns。要求在 8ns 内完成数据的建立和保持,还得算上 PCB 走线延迟。留给你的裕量其实很有限。

我记得有一次调试,板子千兆模式死活不通,百兆没问题。用示波器一抓,发现 TXC 到 TXD 的走线长度差了 300mil。时序裕量被吃掉了,千兆就挂。把走线调等长后,问题解决。

需要注意:KSZ9031 的 RX 时钟 RXC 是直接由接收时钟恢复出来的。它跟发送时钟 TXC 是异步的。所以 MAC 侧需要用 FIFO 来跨时钟域处理。我见过有人直接把 RXC 当 TXC 用,结果跑一会儿就丢包。

3.4 片内延迟——TXC 延迟特性

KSZ9031 有个很贴心的功能:片内 TXC 延迟。什么意思?就是芯片内部可以给 TXC 加一个可编程的延迟,范围是 0ns 到 2.0ns。

为什么要加这个?你想,RGMII 标准要求数据在时钟边沿采样。但实际 PCB 上,时钟和数据到达 PHY 的时间可能有偏差。有了这个延迟,你就能微调,让时钟正好采到数据的中心位置。

寄存器位 延迟量 默认值 说明
RGMII Clock Skew (0x0C) 0.0 ~ 2.0ns 1.0ns 步进约 75ps

我自己调试时,通常会先用默认值 1.0ns 跑一下。如果通信不稳定,再通过 MDIO 写寄存器来微调。一点一点加,直到眼图打开到最佳状态。

// 读取当前延迟值
val = ksz9031_read_reg(0x0C);
printf("Current TXC delay: %d steps\n", val & 0x1F);

// 设置为 1.2ns(假设步进 75ps,1.2ns / 0.075ns = 16)
ksz9031_write_reg(0x0C, 0x10);

调延迟的经验:

  • 先用示波器看 TXC 和 TXD 的相位关系
  • 调整延迟,让 TXC 的边沿对齐到 TXD 数据窗口的中心
  • 如果眼图闭合,适当减少或增加延迟
  • 不要超过 2.0ns,不然会打到下一个数据窗口

3.5 时序模型——整个数据流向

说了这么多,我画个流程图帮你理解整个时序模型。这张图是本章的核心结构。

RGMII 时序模型与数据流向 MAC 发送端 TX_CLK, TXD, TX_CTL KSZ9031 发送端 内部DLL调整 数据+时钟 (3.3V CMOS, 125MHz) PCB 走线延迟:等长控制 ±50mil KSZ9031 接收端 时钟恢复 MAC 接收端 FIFO跨时钟域 RXC, RXD, RX_CTL (数据延迟1.5~2.5ns) 通过寄存器 0x0C 微调 TXC 延迟 (0~2.0ns)

这张图里,你能看到整个数据流向:

  1. MAC 把数据和时钟一起发给 KSZ9031(TX 方向)
  2. 数据经过 PCB 走线,进入 PHY 内部
  3. PHY 内部 DLL 调整时钟相位,让采样点对准数据眼图中心
  4. RX 方向反过来,PHY 恢复出时钟和数据,带着 1.5~2.5ns 的延迟返回 MAC

实际调试时,我通常会先确认 TX 方向是否正常。因为 MAC 是主动发送方,时钟和数据都是它给的。如果 TX 方向都过不了,那问题肯定出在 PCB 布线或者电平匹配上。

RX 方向的问题更难排查,因为时钟是 PHY 给的。我遇到过 PHY 恢复出来的时钟抖动很大,导致 MAC 侧的 FIFO 频繁溢出。最后发现是电源纹波太大,影响了 PHY 的时钟恢复 PLL。

3.6 总结——如何保证 RGMII 的稳定

嗯,我把今天讲的内容浓缩成几点,你记一下:

  • 电压:3.3V CMOS,注意 PHY 和 MAC 电平匹配
  • 阻抗:走线 50Ω,减少反射
  • 等长:TX 和 RX 各自等长,差不超过 50mil
  • 延迟:利用 KSZ9031 的片内延迟微调,默认 1.0ns
  • 测试:示波器抓眼图,确认时钟边沿在数据窗口中间
  • 电源:纹波控制在 50mV 以内,不然时钟抖动会增大

这条路上我踩过的坑不少,每个都花了好几天才走出来。希望这些经验能帮你少走弯路。