4. PCS/PMA层与SERDES:8B/10B编码原理、SERDES基本结构、GTX Transceiver配置向导、线速率与参考时钟计算

各位同学,咱们今天聊聊千兆以太网里最硬核的部分——PCS/PMA层和SERDES。说实话,我刚入行那会儿,看到这些缩写就头大。什么8B/10B、GTX、线速率,感觉像天书。但后来我发现,这些东西说白了就是解决一个核心问题:怎么让数据在物理链路上可靠地跑起来

嗯,咱们一步步拆解。

4.1 8B/10B编码原理:为什么非要多此一举?

你可能会问:数据本来就是0和1,直接发不就行了?为什么要搞个8B/10B编码,白白浪费20%的带宽?

我刚开始也这么想。直到我在一个项目里,直接用NRZ(不归零码)传数据,结果接收端老是同步失败。后来才发现,连续一串0或一串1的时候,时钟恢复电路根本没法锁定相位。说白了,没有足够的跳变沿,时钟就“飘”了

8B/10B编码就是为了解决这个问题。它把8位数据映射成10位码字,保证:

  • DC平衡:码字中0和1的数量尽量相等,避免直流分量累积
  • 足够多的跳变:保证时钟恢复电路能稳定工作
  • 特殊码字:比如K28.5(逗号字符),用于帧对齐

我记得第一次在示波器上看8B/10B编码后的波形,那种规律性的跳变,确实比原始数据“干净”多了。

核心要点:8B/10B不是浪费带宽,而是用20%的冗余换取传输的可靠性。在千兆以太网里,这是必须的。

编码表我就不全列了,但有个关键点:控制字符(K码)和数据字符(D码)是分开的。比如K28.5,它的10位码是00111110101100000101,接收端看到这个就知道是帧起始或结束。

4.2 SERDES基本结构:串行化的艺术

SERDES,全称Serializer/Deserializer,说白了就是并串转换。为什么需要它?因为FPGA内部是并行总线(比如32位、64位),但物理链路上只能一根线传数据。所以你得把并行数据转成串行,发出去;接收端再把串行转回并行。

我画了个简单的结构图,你一看就明白:

FPGA内部 并行数据总线 (32位/64位) SERDES TX 并→串 8B/10B编码 串行数据 SERDES RX 串→并 8B/10B解码 外部PHY GTX通道 差分对 (TX+/TX-)

你看,FPGA内部并行数据先经过SERDES TX,完成并串转换和8B/10B编码,然后通过差分对发出去。接收端反过来,先恢复时钟,再解码,最后串转并。

个人经验:我在调试SERDES时,最常犯的错误是时钟域同步。并行侧和串行侧是不同时钟域,一定要用异步FIFO或握手信号处理。否则,数据错位是家常便饭。

4.3 GTX Transceiver配置向导:别被选项吓到

Xilinx的GTX Transceiver,说白了就是集成了SERDES的高速收发器。第一次打开Vivado的GTX配置向导,我差点被几十个选项劝退。但后来我发现,90%的选项保持默认就行,真正需要你关心的就几个:

配置项 说明 我的建议
线速率(Line Rate) 串行链路上的数据传输速率 千兆以太网通常选1.25Gbps
参考时钟频率 GTX内部PLL的输入时钟 常见125MHz、156.25MHz
编码方式 8B/10B或64B/66B 千兆以太网选8B/10B
数据位宽 并行侧的数据宽度 通常16位或32位
TX/RX缓冲 是否使用内部缓冲 建议开启,方便时钟域处理

配置向导里有个“自动计算”功能,你输入线速率和参考时钟,它会自动算出PLL参数。嗯,这个功能很贴心,但我不建议完全依赖它。我曾经遇到过一次,自动计算出来的参数导致PLL失锁,最后手动调整才搞定。

避坑指南:我曾经在配置GTX时,把TXUSRCLKTXUSRCLK2搞混了。这两个时钟一个是高速串行时钟,一个是并行数据时钟,相位关系必须正确。否则,数据会一直报错。记住:TXUSRCLK = 线速率 / 数据位宽,而TXUSRCLK2通常是TXUSRCLK的2分频或4分频。

4.4 线速率与参考时钟计算:算清楚再动手

线速率和参考时钟的关系,说白了就是PLL的乘法因子。公式很简单:

线速率 = 参考时钟频率 × N / M

其中N和M是PLL的倍频和分频系数。举个例子:

  • 千兆以太网线速率:1.25Gbps(注意,这是8B/10B编码后的速率,实际有效数据是1Gbps)
  • 参考时钟:125MHz
  • 那么:1.25Gbps = 125MHz × 10 / 1

你看,N=10,M=1,PLL就是10倍频。但如果你用156.25MHz的参考时钟呢?

1.25Gbps = 156.25MHz × 8 / 1

N=8,M=1,8倍频。所以,参考时钟选125MHz还是156.25MHz,取决于你板子上有什么晶振。我个人习惯用125MHz,因为千兆以太网PHY芯片大多也用这个频率,可以共用。

重要提醒:线速率是串行侧的速率,不是并行侧。并行侧时钟 = 线速率 / 数据位宽 / 编码效率。比如16位宽、8B/10B编码:

并行时钟 = 1.25Gbps / 16 / 0.8 = 97.65625MHz ≈ 100MHz

嗯,这个100MHz就是你的用户逻辑时钟。

最后,我再说个实战中的小技巧:用IBERT(集成误码率测试)来验证GTX配置是否正确。IBERT是Vivado自带的一个工具,可以生成伪随机码,通过GTX收发,然后统计误码率。我第一次调通GTX时,就是用IBERT确认无误码后,才敢接上层协议。

好了,这一章的内容就到这里。PCS/PMA层和SERDES是千兆以太网的物理基础,理解透了,后面的MAC层和上层协议才能跑得稳。记住:时钟算清楚,配置别手抖,调试用IBERT


公众号:蓝海资料掘金营,微信deep3321