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位码是0011111010或1100000101,接收端看到这个就知道是帧起始或结束。
4.2 SERDES基本结构:串行化的艺术
SERDES,全称Serializer/Deserializer,说白了就是并串转换。为什么需要它?因为FPGA内部是并行总线(比如32位、64位),但物理链路上只能一根线传数据。所以你得把并行数据转成串行,发出去;接收端再把串行转回并行。
我画了个简单的结构图,你一看就明白:
你看,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时,把TXUSRCLK和TXUSRCLK2搞混了。这两个时钟一个是高速串行时钟,一个是并行数据时钟,相位关系必须正确。否则,数据会一直报错。记住: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