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 要用这个时钟来捕捉数据,如果时钟本身不稳定,后面所有逻辑都白搭。
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 都不知道对方什么时候开始发、什么时候结束。
2.4 其他辅助信号
- COL:碰撞检测。半双工模式下,当两个节点同时发数据时,COL 被拉高。
- CRS:载波侦听。信道上有数据在传输时,CRS 有效。
在全双工模式下,这两个信号可以直接接地。我见过有些工程师忘了拉低 CRS,导致 MAC 一直在做载波侦听,影响性能。嗯,这里要注意。
2.5 信号分组与数据路径
来张图把整体关系理清楚。下面这张 SVG 展示了 MII 接口的信号分组和主要数据流向:
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 为高,但数据还是上一拍的值。结果就是整包数据都错位了。
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 才会轻松。说白了,核心思想都是一样的——时钟对齐、数据采样、使能控制。万变不离其宗。