3、QSGMII物理层架构:PMA子层、PCS子层与8B/10B编解码

做QSGMII链路,你不把物理层架构吃透,后面的误码率优化根本无从下手。我个人习惯把QSGMII的物理层拆成三块来看:PMA、PCS,以及中间的8B/10B编解码。这三层各司其职,但又互相影响。咱们一个个说。

3.1 QSGMII物理层整体架构

QSGMII虽然是4个端口共用1条SerDes通道,但它的物理层结构本质上和单端口SGMII是相通的。你想想看,数据从MAC层出来,先经过PCS子层做8B/10B编码,再交给PMA子层做并串转换,最后送到线路上。

反过来,接收方向也是这个路径的逆过程。我做过一个项目,当时误码率居高不下,排查到最后,发现是PCS层的对齐状态机挂了——这就是基本功不扎实的代价。

QSGMII物理层核心分层:
  • PCS子层:负责8B/10B编解码、链路同步、逗号字符对齐、状态机管理
  • PMA子层:负责串并转换、时钟恢复、发送预加重/接收均衡、电气特性
QSGMII物理层架构分层示意图 QSGMII物理层架构:PCS与PMA分层 MAC层(4个GMII端口) PCS子层(物理编码子层) 8B/10B编码器 / 解码器 同步状态机、逗号字符检测、链路初始化 PMA子层(物理介质接入子层) 并串转换 / 串并转换、CDR、预加重 驱动端输出、接收均衡 SerDes高速串行通道 接收方向(PMA→PCS→MAC) 误码敏感区域 • 8B/10B编码错误 • 逗号字符丢失 • CDR抖动失锁 • 串扰导致位翻转 • 预加重不足 • 通道回损过大

3.2 PMA子层功能详解

PMA子层,说白了就是处理“电信号”的地方。它不关心代码对不对,只关心电压、电流、阻抗这些物理量。

PMA子层的核心功能如下:

  • 并串转换 (Serializer):把10位并行数据变成1位串行流,速度上去了,误码风险也跟着上去了。
  • 时钟数据恢复 (CDR):从串行数据流里把时钟重新抽出来。CDR的环路带宽设置是关键,设太宽了抖动大,设太窄了锁定慢。
  • 发送预加重/去加重:补偿通道高频损耗。我记得有一块板子,PCB走线长了15cm,不加预加重完全没法跑。
  • 接收均衡:CTLE(连续时间线性均衡)和DFE(判决反馈均衡),用来怼通道的ISI。
经验之谈: PMA的配置寄存器,特别是预加重和均衡的档位,调试阶段一定要预留软件可调接口。我之前吃过一次亏,硬件焊死了档位,板子回来频率跑不上去,只能飞线——惨。

3.3 PCS子层核心功能

PCS子层处理的是“代码逻辑”。数据在PCS里走一圈,会被编码、对齐、加上控制字符。

PCS的几个关键模块:

模块名称功能说明
8B/10B编码器将8位数据变换为10位码字,保证直流平衡和足够跳变
逗号字符检测在比特流中寻找“K28.5”等特定逗号序列,用于字节对齐
同步状态机管理链路的同步状态:丢失同步→尝试同步→锁定同步
速率适配通过插入/删除空闲字符(/I/),匹配MAC和链路层的速率差异
特别注意: PCS层的同步状态机一旦因为误码频繁重置,链路就会反复进入“同步丢失→重新训练”的死循环。这时候从MAC层看,就是端口不断up/down。我曾经遇到过整框数据因PCS失锁导致全部丢失的情况,排查了三天才定位到问题出在CDR输出时钟的抖动过大,影响了PCS的逗号捕获窗口。

3.4 8B/10B编码原理与误码机制

8B/10B编码,说实话是这个架构的“灵魂”。为什么需要8B/10B?原因其实很简单:

  1. 保证直流平衡:编码后0和1的数量经过长期统计是平衡的,这样不会因为直流偏移导致接收端判决错误。
  2. 保证足够跳变:连续相同的bit不能太多,否则CDR收不到跳变沿,会丢掉锁相。8B/10B规定连续0或1不超过5个——这就是“游程长度限制”。
  3. 提供控制字符:比如K28.5(逗号字符),用于字节同步和链路管理。

8B/10B编码表分成了两部分:

  • 5B/6B编码:高5位变成6位,确保最多3个连续相同bit。
  • 3B/4B编码:低3位变成4位,机制类似。

编码时会跟踪一个叫“运行不一致(Running Disparity, RD)”的状态,目标是让RD始终在+1和-1之间摆动。

误码对8B/10B编码的影响

当物理层出现单个bit翻转时,10位码字会变成非法的码组。接收端的解码器会检查两样东西:

  • 编码合法性:查表看这个10位码字是否存在。如果不存在,就是一个“代码违例”。
  • 运行不一致检查:即使码字是合法的,但如果当前的RD值和预期不符,也报错——“运行不一致错误”。

这两个检查是PCS层实现误码检测的基础。我在调试一个5G交换机时发现,8B/10B的代码违例计数器和RD错误计数器,能非常灵敏地反映链路的“亚健康状态”,比PRBS测试还要直观。

8B/10B编码的误码检测能力:

8B/10B编码不是纠错码,它是检错码。它能在解码阶段检测到单bit和部分多bit错误。如果误码率高到一定程度,PCS层会触发重同步过程。

另外,逗号字符K28.5(二进制是001111 1010或110000 0101)是唯一不依赖字节边界就能唯一识别的字符。接收端不断在比特流中寻找这个模式,一旦找到,就认为找到了字节边界。如果一个bit翻转恰好把某个非逗号字符变成了假的逗号呢?嗯,这就是“伪同步”——概率很低,但我在FPGA调试中踩过这个坑,挂上逻辑分析仪一看,字节边界歪了5个bit,后续数据全错。

总结一下,QSGMII的PCS和PMA是分工清晰的:

子层核心职责与误码的直接关系
PCS8B/10B编解码、逗号对齐、同步状态提供误码计数和同步恢复机制
PMA串行化、时钟恢复、通道补偿实际产生误码的物理环节

要改善QSGMII链路的误码率,说白了就是在PMA层面减少物理层损伤,同时在PCS层面提高同步的鲁棒性。我建议你,在拿到一块新板子时,先读PCS层的寄存器,看看代码违例和RD错误计数是不是在稳定增长——如果有,别急着调别的,先检查PMA的CDR和均衡设置。