4、光通信协议基础:PCS层与PMA层、8B/10B与64B/66B编码、链路训练机制
光通信协议,说白了就是让数据在光纤里跑得又快又稳的一套规矩。很多刚入行的朋友一上来就盯着SerDes的速率看,觉得只要速率够高就行。嗯,我当年也这么想过,直到有一次项目调试,眼图看着挺好,但链路就是建不起来,折腾了两天才发现是PCS层的对齐机制出了问题。从那以后,我再也不敢小看协议栈的分层设计。
今天咱们就聊聊光通信协议里最核心的三个东西:PCS层与PMA层的分工、8B/10B与64B/66B编码、以及链路训练机制。这三块搞明白了,你基本就能看懂市面上90%的光模块协议文档。
4.1 PCS层与PMA层:谁该干什么?
先看一张图,这是我个人习惯用的分层结构示意:
这张图我每次做项目都会贴在工位上。你想想看,数据从MAC层下来,经过RS层做速率适配,然后进入PCS层。PCS层干的是编码、对齐、加扰这些"脑力活"。再往下到PMA层,就是串行化、时钟恢复这些"体力活"。最后PMD层负责光电转换,把电信号变成光信号打出去。
核心要点:PCS层处理的是并行数据,PMA层处理的是串行数据。这个分界线一定要记住。我在调试时经常看到有人把PCS和PMA的寄存器搞混,就是因为没理解这个并行/串行的分界。
4.2 8B/10B编码:经典但不过时
8B/10B编码,说白了就是把8位数据变成10位数据。为什么要多花25%的带宽做这件事?
原因有三个:
- 直流平衡:保证信号中0和1的数量大致相等,避免直流分量漂移
- 时钟恢复:保证有足够的跳变沿,让接收端能提取时钟
- 特殊字符:用K码表示控制信息,比如帧起始、帧结束
我记得第一次用8B/10B编码做项目时,遇到一个奇怪的问题:链路偶尔会丢包,但又不是一直丢。查了三天,最后发现是编码器在连续发送K码时,极性没有正确翻转,导致接收端CDR失锁。嗯,从那以后我养成了一个习惯——一定要检查编码器的运行极性(Running Disparity)。
4.3 64B/66B编码:更高效率的选择
8B/10B编码的代价是25%的带宽浪费。对于10Gbps以上的链路,这个开销太大了。所以IEEE 802.3ae引入了64B/66B编码。
64B/66B的原理很简单:
- 每64位数据前面加2位同步头
- 同步头"01"表示数据块,"10"表示控制块
- 开销只有3.125%,比8B/10B的25%低得多
| 特性 | 8B/10B | 64B/66B |
|---|---|---|
| 编码效率 | 80% | 96.875% |
| 直流平衡 | 通过极性控制保证 | 通过加扰保证 |
| 时钟恢复 | 保证最小跳变密度 | 需要加扰保证跳变 |
| 典型应用 | 1G/2G/4G FC, 1G/10G Ethernet | 10G/25G/40G/100G Ethernet |
| 实现复杂度 | 较低 | 较高(需要加扰器) |
我的经验:如果你做的是10G以下的设计,用8B/10B编码会更简单,调试工具也多。到了25G以上,必须用64B/66B,否则带宽浪费太严重。我曾经在一个100G项目中,因为用了8B/10B编码,导致实际有效带宽只有80G,被客户投诉了。
4.4 链路训练机制:让两端"握手"
链路训练,说白了就是让发送端和接收端在正式传数据之前,先互相"认识"一下。这个过程包括:
- 信号检测:接收端检测是否有信号进来
- 时钟恢复:接收端锁定发送端的时钟
- 码流同步:找到对齐标记,确定数据边界
- 参数协商:交换能力信息,比如支持的速率、FEC模式
- 均衡训练:调整发送端的预加重和接收端的均衡器
这里我要特别说一下均衡训练。很多新手以为链路训练就是"对上眼"就行了。其实不是的。在高速链路中,信号经过PCB走线和连接器后,会有严重的码间干扰(ISI)。链路训练的一个重要任务就是通过发送训练序列,让接收端找到最优的均衡参数。
避坑指南:我曾经在一个项目中,链路训练总是失败。查了所有寄存器,波形也看了,就是找不到原因。最后发现是PCB上的一对差分线长度差了5mm,导致信号延迟不匹配。所以,如果链路训练反复失败,先检查你的PCB走线等长,别一上来就调寄存器。
4.5 实战中的编码选择建议
说了这么多,到底该用哪种编码?我个人的建议是:
- 1Gbps以下:用8B/10B,简单可靠,调试工具多
- 1Gbps ~ 10Gbps:看具体协议。如果是光纤通道,用8B/10B;如果是以太网,10G Base-R用64B/66B
- 25Gbps以上:必须用64B/66B,或者更高效的编码(比如RS-FEC的编码方式)
另外,如果你用的是FPGA,要注意:Xilinx的GTH/GTY收发器内部已经集成了PCS和PMA的硬核。你只需要配置好寄存器,不用自己写编码器。但如果你用的是Altera的器件,有些系列的PCS是需要用软逻辑实现的,资源消耗会大一些。
好了,关于PCS层、PMA层、编码和链路训练,今天就聊到这里。这些内容看起来是协议层面的东西,但实际上和你的硬件设计、PCB布局、甚至FPGA选型都密切相关。下次咱们再深入聊聊FEC和RS编码,那又是另一个有意思的话题了。