2. MII 信号定义与功能详解

MII的英文全称是 Media Independent Interface。说白了,就是 MAC 和 PHY 之间的标准接口。为什么叫“介质无关”?因为不管 PHY 那边接的是双绞线还是光纤,MAC 这边的接口逻辑都是一样的。

今天我们把 MII 所有信号逐个掰开来看。每个信号我都会结合项目中遇到的实际问题来讲。你会发现,很多时序问题,源头就是对某个信号的理解不够深。

2.1 时钟信号:一切时序的基石

MII 有两根独立的时钟线:TX_CLK 和 RX_CLK。

别小看这两根线。我曾经在调试一块千兆 PHY 时,发现 RX_CLK 波形很漂亮,但数据就是抓不对。折腾了一个下午才发现,PHY 的时钟输出有负载电容匹配问题,导致边沿抖动超标。所以,时钟信号再基础,也要认真对待。

信号名 方向 频率 谁驱动
TX_CLK PHY → MAC 25 MHz / 2.5 MHz PHY 提供
RX_CLK PHY → MAC 25 MHz / 2.5 MHz PHY 提供

这里有两点要注意:

  • 频率由速率决定:100 Mbps 时用 25 MHz,10 Mbps 时用 2.5 MHz。
  • 时钟由 PHY 产生:MAC 是“吃”时钟的一方。你想想看,MAC 要用这个时钟来捕捉数据,如果时钟本身不稳定,后面所有逻辑都白搭。
我个人习惯在设计 PCB 时,把 TX_CLK 和 RX_CLK 的走线控制在 ±5 毫米的等长误差内。尤其是四层板以上,时钟走线必须和内层地平面做阻抗匹配。

2.2 数据信号:TXD 和 RXD

MII 的数据总线宽度是 4 bit。TXD[3:0] 是发送数据,RXD[3:0] 是接收数据。方向从 MAC 角度来看:

  • MAC 往 PHY 发送数据 → TXD
  • PHY 往 MAC 汇报接收到的数据 → RXD

一个字节怎么传?分两次,每次 4 bit。先传低 4 位,再传高 4 位。这也是 MII 被称为“半字节接口”的原因。

我建议初学者画时序图时,先把字节拆成两个 nibble,不然容易搞混。在 FPGA 里,通常用一个 4 位寄存器缓存数据,然后在每个时钟沿拼接出完整的 8 位数据。

2.3 控制信号:TX_EN 和 RX_DV

这两个信号决定了数据是不是“有效”。

  • TX_EN:发送使能。MAC 告诉 PHY:“我现在要发数据了,你准备好。”
  • RX_DV:接收数据有效。PHY 告诉 MAC:“这是我收到的有效数据,快取走。”

为什么需要它们?因为总线在空闲时不能乱传数据。如果没有使能信号,MAC 和 PHY 都不知道对方什么时候开始发、什么时候结束。

关键点:TX_EN 必须与 TX_CLK 的上升沿对齐,并且在数据持续期间保持有效。RX_DV 也一样,跟着 RX_CLK 的节拍来。

2.4 其他辅助信号

  • COL:碰撞检测。半双工模式下,当两个节点同时发数据时,COL 被拉高。
  • CRS:载波侦听。信道上有数据在传输时,CRS 有效。

在全双工模式下,这两个信号可以直接接地。我见过有些工程师忘了拉低 CRS,导致 MAC 一直在做载波侦听,影响性能。嗯,这里要注意。

2.5 信号分组与数据路径

来张图把整体关系理清楚。下面这张 SVG 展示了 MII 接口的信号分组和主要数据流向:

MII 接口信号分组与数据路径 MAC 侧 (FPGA或处理器) PHY 侧 (以太网收发器) 发送:TXD[3:0], TX_EN 接收:RXD[3:0], RX_DV 时钟:TX_CLK, RX_CLK 辅助:CRS, COL MII 接口共 8 路数据/控制信号 + 2 路时钟 + 2 路辅助信号,共 12~14 根信号线

2.6 信号间的同步关系

MII 是一个 源同步 接口。所有的数据和控制信号,都必须与对应的时钟边沿对齐。具体来说:

发送时钟域 接收时钟域 同步要求
TXD, TX_EN TX_CLK 上升沿采样,建立/保持时间满足
RXD, RX_DV RX_CLK 上升沿采样,建立/保持时间满足
CRS, COL 异步 需跨时钟域同步处理

为什么要强调这个?因为很多 FPGA 工程师在 MII 接口上出问题,都是因为忽略了“时钟与数据的对齐关系”。

举个实际例子:我以前遇到一个 case,TXD 数据在 FPGA 内部已经打好拍,但送到 Pin 脚时,因为组合逻辑延迟太大,导致 TX_EN 和 TXD 之间的 skew 超标。PHY 那边采样到 EN 为高,但数据还是上一拍的值。结果就是整包数据都错位了。

避坑指南(实战经验): 我曾经在 Xilinx 的 FPGA 上用 IOB 寄存器直接输出 TXD 和 TX_EN,这样能最小化输出延迟。不要用内部逻辑驱动!因为从内部逻辑到 IO 脚的路由延迟不可控。

2.7 信号功能对比

为了让你快速查找,我整理了一张信号功能速查表:

信号 接口位宽 方向 功能简述 备注
TX_CLK 1 PHY→MAC 发送参考时钟 25/2.5 MHz
TXD 4 MAC→PHY 发送数据 与 TX_CLK 同步
TX_EN 1 MAC→PHY 发送使能 高有效,期间数据有效
RX_CLK 1 PHY→MAC 接收参考时钟 25/2.5 MHz
RXD 4 PHY→MAC 接收数据 与 RX_CLK 同步
RX_DV 1 PHY→MAC 接收数据有效 高有效,期间数据有效
CRS 1 PHY→MAC 载波侦听 半双工模式使用
COL 1 PHY→MAC 碰撞检测 半双工模式使用

最后说一句心里话:MII 虽然是老接口,但搞懂了它,后面学 RMII、GMII、RGMII 才会轻松。说白了,核心思想都是一样的——时钟对齐、数据采样、使能控制。万变不离其宗。