3. SGMII物理层架构:PHY芯片、MAC接口、SerDes模块
说到SGMII的物理层,我做了十几年硬件工程师,有个很深的体会——很多人觉得物理层就是“连根线完事”,结果项目调不通,连问题出在哪个模块都搞不清楚。说白了,SGMII物理层就是三个核心模块的配合:MAC接口负责发数据、PHY芯片负责把数据推出去、SerDes则搞定串行化传输。你想想看,这三个家伙要是没配合好,时钟恢复、链路建立这些都是空谈。
3.1 从全局看SGMII物理层
我个人习惯把SGMII物理层拆成三块看:
- MAC接口:通常走GMII/RGMII或者内部总线,跟处理器的MAC层对接
- PHY芯片:负责编码、链路协商、时钟恢复
- SerDes模块:负责并串转换、高速差分信号收发
这三者之间的关系,我画过无数遍。下面这张图,算是我自己总结的“SGMII物理层三件套”:
为什么分这三个模块?因为每个模块都有自己的时钟域和状态机,调的时候要分开测,合起来测,反复验证。嗯,这里要注意,很多新手一上来就板级联调,结果都不知道是MAC端没配好还是PHY端锁不住。
3.2 MAC接口:多宽的数据总线?
MAC接口是什么?就是你的处理器或者FPGA里MAC层跟PHY芯片之间的那座桥。SGMII信号到了PHY这头,必须先走MAC接口才能进到逻辑处理。
| MAC接口类型 | 数据位宽 | 时钟频率(MHz) | 信号线数 | 典型场景 |
|---|---|---|---|---|
| GMII | 8位 | 125 | 24根 | 传统板级设计 |
| RGMII | 4位 | 125 (DDR) | 12根 | 减少PCB引脚数 |
| 并行总线 | 8/16位 | 可变 | 10-20根 | 内部FPGA/ASIC |
我之前做过一个项目,MAC端用RGMII接PHY,结果板子layout走了十几厘米,信号质量很差,数据老是采错。后来我一查,RGMII对时钟和数据之间的skew要求很严格,必须加delay。这是我踩过的坑——RGMII虽然引脚少,但对PCB走线要求很高。
3.3 PHY芯片:不只是一个收发器
很多人觉得PHY芯片就是“接收差分信号,输出并行数据”,其实它的内部远比你想的要复杂。我拆过好几款主流的千兆PHY,内部至少包含这些模块:
- PCS(物理编码子层):负责8B/10B编码、链路码字对齐
- PMA(物理介质接入子层):管理SerDes的模拟电路、时钟恢复
- Auto-Negotiation(自动协商):跟对端PHY协调速率、双工模式
- MDIO管理接口:供CPU读取状态、配置寄存器
我记得有一次调板子,PHY死活连不上,读寄存器一直显示“链路断开”。折腾了半天,发现是MDIO的时序没跑对——PHY在初始化期间不接受配置。这就是典型的“底层接口问题”。
核心要点:PHY的初始化顺序非常重要。上电后,先让PHY复位,等待内部PLL锁定(通常需要1-10ms),然后再配置链路协商参数。跳过这步直接读状态,会读到垃圾数据。
3.4 SerDes模块:串行化的心脏
SerDes是SGMII能跑在1.25Gbps的关键。说白了,就是把8位并行数据打包成串行差分信号发出去。为什么非要用SerDes?因为并行信号在高速下串扰严重,SerDes用差分线抗干扰能力强得多。
SerDes内部的两个子模块:
- 发送端:并行数据进来,经过Serializer(并串转换),加上时钟信息(一般通过数据编码隐含时钟),最后通过差分驱动器推出去
- 接收端:差分信号进来,先过CDR(时钟与数据恢复)把时钟抓出来,然后经过Deserializer还原成并行数据
⚠️ 避坑指南:我曾经遇到过SerDes接收端无法锁定的情况。检查后发现是发送端的数据持续发送“全0”或者“全1”码型导致的——CDR需要数据有足够多的跳变才能恢复时钟。一定要让PCS层保证数据有足够的频率成分,包括插入Idle码字。
你想想看,SerDes的CDR本质上就是一个锁相环,它要从数据边沿里“挤”出时钟来。如果数据长时间没有跳变,CDR就会漂出去。这就是为什么SGMII需要强制插入同步码字,每隔12个字节就有一个K码来保证跳变密度。
3.5 三者的交互时序
这三个模块不是独立工作的,它们必须按照严格的时序配合:
| 步骤 | MAC接口 | PHY芯片 | SerDes模块 |
|---|---|---|---|
| 1. 上电复位 | 复位MAC逻辑 | 上电复位,内部PLL起振 | VCO开始自由振荡 |
| 2. 配置 | 通过MDIO配置PHY | 接收配置,启动Auto-Neg | 等待锁相参考时钟 |
| 3. 链路协商 | 发送Config码字 | 交换能力信息 | 差分信号建立 |
| 4. 时钟恢复 | 接收同步码字 | CDR锁定接收数据 | PLL锁定,输出同步时钟 |
| 5. 数据通信 | GMII数据收发正常 | 链路状态为Up | 串行与并行双向转换 |
这5步是我调试SGMII链路的必查流程。每一步都有对应的寄存器状态可以读,比如PHY的“Link Status”位、CDR的“Lock”标志等。
说实话,刚开始做SGMII设计时,我总以为只要接好线就能通,后来发现链路建立的顺序要严格遵守。特别是CDR锁定前,不要急着发业务数据,先发同步Idle码字让它锁定,不然会丢包丢到你怀疑人生。