第三讲:物理编码子层(PCS)协议

各位同学,今天我们来聊聊PCS子层。说实话,这个子层在光通信芯片里经常被低估。很多人觉得它就是个编解码的“搬运工”,其实不然。我在做100G光模块项目时,就因为PCS层的处理不当,导致整个链路抖动超标,折腾了两周才找到根因。

PCS子层,全称Physical Coding Sublayer。它位于PMD(物理介质相关层)和MAC(介质访问控制层)之间。说白了,它的任务就是把上层来的数据,变成适合在物理介质上传输的格式。嗯,这里要注意,它不只是编解码,还负责对齐、加扰、通道绑定等脏活累活。

3.1 PCS子层核心功能

我习惯把PCS的功能归纳为四个字:编、对、扰、绑。

  • 编码/解码:把MAC层的数据块转换成线路码型。比如64B/66B、8B/10B。
  • 对齐:插入对齐标记(AM),让接收端能找到码块的边界。
  • 加扰/解扰:用伪随机序列打散数据,避免长连0或长连1。你想想看,如果连续传100个0,接收端的时钟恢复电路直接就懵了。
  • 通道绑定:在多通道场景下(比如4×25G),把数据分发到多个通道,再在接收端重新组合。

我在一个40G项目中遇到过一个问题:接收端老是丢包,查了三天发现是PCS层的对齐标记插入周期不对,导致接收端锁相环失锁。后来我改成了每16384个码块插入一次AM,问题就解决了。

关键点:PCS层是MAC和PHY之间的“翻译官”。它不关心数据内容,只关心数据格式。但格式错了,上层应用再牛也白搭。

3.2 64B/66B编码原理

64B/66B编码,是目前10G以上光通信的主流选择。为什么?因为它效率高。

编码规则其实很简单:

  • 每64比特的数据块,加上2比特的同步头(Sync Header),变成66比特的码块。
  • 同步头有两种:01表示数据块,10表示控制块。
  • 注意,0011是非法组合。接收端看到这两个组合,就知道出错了。

数据块的结构:

同步头(2bit) | 数据载荷(64bit)
01 | D0 D1 D2 ... D63

控制块的结构稍微复杂一点,它包含块类型字段(Block Type Field),用来指示控制信息的类型。比如:

  • 0x1E:表示序列有序集
  • 0x2D:表示空闲码块
  • 0x33:表示开始码块
  • 0x66:表示结束码块

为什么会设计控制块?因为光通信链路需要传递一些带外信息,比如链路状态、错误指示、对齐标记等。这些信息不能和数据混在一起,否则接收端无法区分。

我的经验:在实现64B/66B解码器时,同步头的检测一定要做“滑动窗口”匹配。我曾经直接用固定位置检测,结果在链路刚建立时,同步头还没对齐,解码器直接崩溃。后来加了状态机,先做同步头锁定,再做数据解码,稳得很。

3.3 8B/10B编码原理

8B/10B编码是更早的技术,现在主要用于低速链路(比如1G、10G)。它的核心思想是:把8比特数据映射成10比特码字,保证DC平衡。

编码过程分两步:

  1. 5B/6B编码:把高5位(HGFED)映射成6比特码字。
  2. 3B/4B编码:把低3位(CBA)映射成4比特码字。

合起来就是10比特。但这里有个关键:运行不一致性(Running Disparity,RD)。

RD是个计数器,记录当前码字中1和0的差值。编码器会根据当前RD值,选择正极性或负极性的码字。目的是让长周期内1和0的数量尽量相等。

// 伪代码示例:8B/10B编码器核心逻辑
if (RD == 正极性) {
    // 选择1比0少的码字
    output = negative_disparity_table[input];
    RD = 负极性;
} else {
    // 选择0比1少的码字
    output = positive_disparity_table[input];
    RD = 正极性;
}

8B/10B还有一个好处:它内置了逗号序列(Comma)。比如K28.5码字(001111 1010110000 0101),接收端只要检测到这个序列,就能快速找到码字边界。这在链路初始化时特别有用。

避坑指南:我曾经在一个项目中,8B/10B解码器的RD状态机没做初始化。结果链路刚建立时,RD值随机,导致前几个码字全部解码错误。嗯,后来我在复位时强制把RD设为负极性,问题就解决了。记住:RD初始值必须是负极性,这是标准规定的。

3.4 编码效率对比

编码效率,说白了就是有效数据比特占总传输比特的比例。效率越高,浪费的带宽越少。

编码方式 输入比特 输出比特 编码效率 典型应用
8B/10B 8 10 80% 1G/10G以太网、FC、PCIe
64B/66B 64 66 96.97% 10G/25G/100G以太网
256B/257B 256 257 99.61% 400G/800G以太网

从表格可以看出,8B/10B的效率只有80%,意味着每传10比特,只有8比特是有效数据。而64B/66B的效率接近97%,256B/257B更是高达99.6%。

你可能会问:既然64B/66B效率更高,为什么还要用8B/10B?

原因有三:

  • 实现复杂度:8B/10B的查找表很小,逻辑简单,延迟低。64B/66B需要处理块类型、加扰等,逻辑复杂得多。
  • 时钟恢复:8B/10B保证最大游程长度(Run Length)不超过5,时钟恢复更容易。64B/66B需要配合加扰才能保证DC平衡。
  • 历史原因:很多老设备只支持8B/10B,升级成本高。

我个人习惯是:如果链路速率在10G以下,用8B/10B就够了。超过10G,必须上64B/66B。至于256B/257B,那是400G以上才需要考虑的。

总结一下:PCS子层是光通信芯片的“门面”。编码方式的选择,直接影响链路效率、实现复杂度和成本。64B/66B是目前的主流,8B/10B在低速场景仍有生命力。记住:没有最好的编码,只有最合适的编码。

好,这一讲就到这里。下一讲我们会深入PCS层的加扰和通道绑定,那才是真正考验架构设计能力的地方。