MII时序基础:时钟频率25MHz/2.5MHz,数据建立保持时间,传输延迟概念

做MII接口设计,时钟和时序是绕不开的坎。我记得刚接触MII时,被25MHz和2.5MHz两种频率绕晕过——明明都是MII,为什么时钟差这么多?其实背后对应的是两种速率模式:100Mbps和10Mbps。说白了,时钟就是数据的节拍器,频率定了,通信速率也就定了。

核心要点: MII时钟频率与数据速率直接挂钩——100Mbps → 25MHz,10Mbps → 2.5MHz。每一位数据占用一个时钟周期。

两种时钟模式的差异对比

MII接口有两种工作模式,时钟频率差了一个数量级。我个人习惯先看MAC侧提供的TX_CLK/RX_CLK频率,一量就知道对方在跑哪种速率。下面这个表把关键参数列清楚了:

参数 100Mbps模式 10Mbps模式
时钟频率(TX_CLK / RX_CLK) 25 MHz 2.5 MHz
时钟周期 40 ns 400 ns
数据位宽 4 bit(半字节) 4 bit(半字节)
每位数据有效窗口 40 ns(整周期) 400 ns
典型建立时间要求 10 ns 100 ns(相对宽松)

看了这个表你可能会问:建立时间为什么是10ns和100ns?实际上IEEE 802.3标准对MII接口的时序有明确约束,我拿常见的PHY芯片数据手册对照过,基本都在这个量级。你想想看,2.5MHz时钟周期是400ns,留给数据的建立保持窗口特别大,几乎不可能出错。但25MHz下,40ns的周期要分出建立时间、保持时间和传输延迟,稍微不留神就踩雷。

建立时间与保持时间——MII的眼睛

建立时间和保持时间,我更喜欢叫它“数据的入场券”。什么意思呢?建立时间指的是数据在时钟有效沿来到之前必须提前稳定的最小时间;保持时间是时钟沿过后数据必须继续稳定的最小时间。MII接口的数据信号(TXD[3:0]、RXD[3:0])在TX_CLK/RX_CLK的上升沿被采样,这两个时间窗口决定了数据能不能被正确“看见”。

避坑指南: 我曾经在调试一块FPGA + PHY的板子时,100M模式下偶尔出现CRC错误。示波器一测,发现RXD相对于RX_CLK的保持时间只有1ns,而PHY要求至少5ns。罪魁祸首是PCB走线过长导致信号反射。后来换了等长走线就稳定了。所以设计时要留足余量,别卡着规格书下限。

MII标准中虽然没有像DDR那样给出精确的Tsu/Th数值,但普遍PHY会要求Tsu ≥ 10ns、Th ≥ 10ns(100M模式)。如果你是自己做MAC侧设计,我建议把内部逻辑的时序约束做到Tsu ≥ 15ns、Th ≥ 5ns以上,留点安全垫。

传输延迟的概念——信号在路上花了多久

传输延迟是个组合概念。对MII来说,主要包括:

  • Tco——时钟沿到数据输出的延迟(MAC内部逻辑驱动到引脚)
  • Tpd——PCB走线传播延迟(约6.5ps/mm,FR4材质)
  • Tsetup——接收端需要的建立时间(上文已讲)

我习惯用一个公式来检查时序是否收敛:

Tclk_period > Tco(max) + Tpd(max) + Tsetup(required) + 余量

拿100M模式来说,Tclk_period = 40ns。假设Tco=8ns,Tpd=2ns(约30cm走线),Tsetup=10ns,加起来20ns,余量20ns——看起来很富裕。但千万别忽略PCB上的串扰和电源噪声,它们会吃掉余量。我见过一个案例,走线长了10cm,余量从20ns掉到5ns,在高温下就挂了。

实测技巧: 调试时建议把TX_CLK和对应TXD信号同时引出到测试点,用示波器看时钟上升沿到数据变化的延迟。如果看到的数据变化点离时钟沿太近(比如小于5ns),就要检查PCB走线或IO驱动强度了。

MII时钟与数据时序关系图

下面这张SVG把核心时序概念整合在一起,你可以直观看到时钟、数据、建立保持窗口以及传输延迟之间的关系:

MII时序关系图 MII 100M模式时序关键节点 TX_CLK 周期40ns 上升沿采样 TXD[3:0] 数据有效窗口 建立 ≥10ns 保持 ≥10ns 传输延迟 Tco + Tpd 典型值 8~12ns 时序检查公式 Tclk_period(40ns) > Tco(max) + Tpd(max) + Tsetup(10ns) + 余量(≥5ns) 余量不足 → 增加 PCB等长或调驱动

实践经验:余量才是王道

我做了几年MAC设计,吃亏最多的就是时序余量。MII虽然是并行接口、速率不高,但很多新手会忽略PCB走线等长、时钟抖动这些细节。说白了,规格书上给的建立保持时间只是理论最小值,实际芯片内部还有setup/hold的失配、时钟占空比失真、温度电压波动。

推荐安全余量: 100M模式下,时序余量应 ≥ 5ns;10M模式下余量可以放宽到 ≥ 50ns。如果余量不足,优先考虑缩短数据走线长度、增加时钟到数据输出延迟(在FPGA的IO delay中调整)。

嗯,这里要提一个我自己的习惯:每次MII模块上板前,我都会用时序分析工具(比如Synopsys的PrimeTime或FPGA的Timing Analyzer)跑一遍从TX_CLK到TXD的路径约束。看到余量大于10ns才敢烧进FPGA。因为你在仿真里看到的一切美好,到了实际板子上都会打折扣——电源纹波、串扰、温度漂移……这些都是看不见的贼。

回到传输延迟,还有一个容易搞混的概念:Tprop(即时钟树传播延迟)在MII中不像DDR那么敏感,因为MII是源同步,时钟和数据走同一条路径。但如果你的设计把MAC和PHY放在不同芯片上,且距离超过20cm,就要留意时钟输出(TX_CLK)和数据输出的相对延迟。我见过有人在10cm走线上丢了2ns时序,最后靠加一个延迟链(delay element)才救回来。

注意: 不要在代码里用组合逻辑插入延迟链!我踩过这个坑:用LUT级联做延迟,结果PVT变化下延迟飘了50%。正确做法是用ICG(时钟门控)或PLL的相位调整,或者用IO延迟元件(如FPGA的IODELAY)。

最后总结下本章三个基础概念的核心记忆点:

  • 时钟频率25MHz/2.5MHz —— 对应100M/10M速率,周期40ns/400ns;
  • 建立/保持时间 —— 数据在时钟沿前后的稳定窗口,100M模式典型各需10ns;
  • 传输延迟 —— 从时钟沿到数据生效的路径延迟,包括Tco和Tpd,需保证周期余量。

弄懂这三个点,后续分析不同MII变种(RMII、GMII)的时序差异时就有了基础武器。别急,我们后面会慢慢拆解。