物理层基础:SerDes 技术原理、信号速率、8b/10b 编码机制

各位工程师好,本章我们深入到物理层的地基——SerDes。SGMII 和 QSGMII 本质上都是基于 SerDes 的串行接口,搞不清 SerDes,后面的速率适配、时序分析、链路抖动全都会糊。

SerDes 技术原理

SerDes 是“Serializer/Deserializer”的缩写,说白了就是把并行的多位数据串成一路高速差分信号发送出去,收端再还原回来。我刚开始学 SerDes 时,总觉得没必要了解那么深,直到调试一块 FPGA 板卡时发现眼图完全闭合,才意识到是 SerDes 的 Pre-emphasis 没有配好……嗯,从那以后我见到 SerDes 都格外小心。

一个典型的 SerDes 通道包含以下几个核心模块:

  • PLL(锁相环):产生稳定的高速时钟,把并行数据的时钟倍频到串行速率。
  • Serializer(并串转换器):把 N 位并行数据以时钟为节拍,逐位移出成为 1 位串行数据流。
  • Driver(发送驱动器):将单端串行信号转换为差分信号(通常为 CML 或 LVDS 电平)输出。
  • Channel(通道):PCB 走线、连接器、线缆。真正让你头疼的物理介质。
  • Receiver(接收器):把衰减后的差分信号重新放大,恢复为数字电平。
  • CDR(时钟数据恢复):从串行数据流中提取时钟,再用这个时钟去采样数据。这是 SerDes 最核心的模拟电路之一。
  • Deserializer(串并转换器):将串行数据流按位拼接回 N 位并行数据。

我的一点体会: 调试 SerDes 链路时,优先观察 CDR 是否锁定。很多链路无法建立,其实不是数据错了,而是 CDR 没找到时钟边沿。

记住:SerDes 的发送端负责“串化+驱动”,接收端负责“均衡+恢复”。两侧必须对称设置预加重/均衡参数才能获得最佳信号质量。

信号速率与有效吞吐率

SGMII 和 QSGMII 的物理层速率非常明确,但我经常看到有人把线速率和数据速率搞混。你想想看,线速率是 SerDes 串行链路上真实的差分信号翻转速率,而数据速率是扣除编码开销后的净荷速率。

以下是几个关键数值:

协议 线速率(Gbps/lane) 编码方式 编码效率 净荷数据速率(Gbps/lane) 备注
SGMII 1.25 8b/10b 80% 1.0 单个 SerDes 通道
QSGMII 5.0 8b/10b 80% 4.0(总共) 4个MAC复用,每端口1Gps

举个例子,SGMII 的线速率是 1.25Gbps,但因为每 10bit 中只有 8bit 是有效数据(8b/10b 编码固定开销 20%),所以一个端口能传的实际数据不超过 1Gbps。我得提醒你一句:交换机背板规划和线缆选型时,请务必以线速率为基准,而不是净荷速率。

避坑指南: 我曾经见过一块板卡,设计时按净荷速率 1Gbps 去算 PCB 走线损耗,结果 1.25Gbps 的串行信号在长走线上衰减严重,眼图根本打不开。记住,SerDes 通道的插损和回损是按线速率去评估的,不是净荷速率。

QSGMII 的线速率是 5.0Gbps。为什么是 5?4 个 SGMII 的 1.25Gbps 加起来是 5.0Gbps。它把 4 个 MAC 的数据通过时分复用(TDM)打成一包,在同一个高速串行链路上传输。接收端再按时间片拆开。我个人觉得,QSGMII 的精髓就在这个 TDM 复用上。

为了让你更直观地理解,我画了一张 QSGMII 复用与解复用的结构图:

QSGMII 复用与解复用结构 MAC_0 @1G MAC_1 @1G MAC_2 @1G MAC_3 @1G TDM 复用器 (4合1,5G速率) SerDes 5Gbps TDM 解复用器 (1拆4) MAC_0 MAC_1 MAC_2 MAC_3 说明:QSGMII 通过 TDM 将4个MAC的1Gbps数据流合并为一路5Gbps流。 对端 SerDes 接收后由 TDM 解复用器按时间片还原给各自的MAC。

8b/10b 编码机制

8b/10b 编码是串行通信中的“老功臣”了。它的核心作用我总结为三条:

  1. 直流平衡——保证发送的 0 和 1 数量尽可能平均,避免直流分量积累,否则 Transformer 耦合会出问题。
  2. 游程长度控制——任何连续的 0 或 1 不超过 5 位,这能保证 CDR 不会因长时间无跳变而丢失时钟锁定。
  3. 时钟恢复保障——编码后的数据流中跳变足够多,接收端能稳定提取时钟。

编码规则说穿了很简单:将 8 位数据(256 种组合)映射成 10 位码字。这 10 位码字中,有很多是“好”的码字(Disparity 为 0,或者正负极性交替)。发送端根据当前 Running Disparity(RD)动态选择正极性或负极性的码字。

我个人习惯把 8b/10b 编码表放在手边——不是因为要背表,而是调试时你看到的码流是 10 位,必须知道哪些是有效数据(D码),哪些是控制符(K码)。K码在 SGMII/QSGMII 中用于划帧和对齐。

从速率角度做一个换算:SGMII 的 MAC 侧数据位宽通常是 8 位,时钟频率 125MHz。SerDes 侧的线速率 = 125MHz × 10bit = 1.25Gbps。你看,编码开销直接从时钟频率上体现出来了。

参数 SGMII QSGMII(单lane)
MAC侧并行时钟 125 MHz 125 MHz(四倍复用)
MAC侧数据位宽 8 bit 8 bit × 4
8b/10b编码后 10 bit 10 bit
串行线速率 1.25 Gbps 5.0 Gbps
有效带宽(净荷) 1.0 Gbps 4.0 Gbps

关于 8b/10b 的码型选择,我提一个实际案例。项目中跑流片一致性测试时,PRBS 测试能通过,但业务数据就会误码。后来分析发现,是 8b/10b 编码生成的特定码型(如长连 0 或连 1 后的高跳变密度)触发了接收端均衡器的非线性响应。解决方案是调整 CTLE 的增益曲线。所以我建议你:SerDes 链路调试时不要只刷 PRBS,务必用包含 K 码和 D 码的业务流做长期拷机。

提示: 如果你用的 FPGA/交换芯片支持读取 SerDes 的 CDR 锁定状态和错误计数器,建议在启动阶段就轮询这两个寄存器。我有一段调试经历里,看到 CDR 锁定但 Bit Error Rate 很高,结果是 8b/10b 失步造成的——连续收到无效码字导致的块同步丢失。

最后总结一句:8b/10b 不是 SGMII/QSGMII 专属,XFI、SFP+、XAUI 也同样用。一旦你吃透了这条编码机制,再去看那些 64b/66b、128b/130b 的高效编码,你会觉得“噢,原来 8b/10b 是更古老但更稳妥的选择”。