4、光通信协议基础:PCS层与PMA层、8B/10B与64B/66B编码、链路训练机制

光通信协议,说白了就是让数据在光纤里跑得又快又稳的一套规矩。很多刚入行的朋友一上来就盯着SerDes的速率看,觉得只要速率够高就行。嗯,我当年也这么想过,直到有一次项目调试,眼图看着挺好,但链路就是建不起来,折腾了两天才发现是PCS层的对齐机制出了问题。从那以后,我再也不敢小看协议栈的分层设计。

今天咱们就聊聊光通信协议里最核心的三个东西:PCS层与PMA层的分工8B/10B与64B/66B编码、以及链路训练机制。这三块搞明白了,你基本就能看懂市面上90%的光模块协议文档。

4.1 PCS层与PMA层:谁该干什么?

先看一张图,这是我个人习惯用的分层结构示意:

光通信协议栈分层结构 MAC层(媒体访问控制层) RS层(调和子层) PCS层(物理编码子层) 编码/解码 · 对齐 · 加扰/解扰 PMA层(物理介质接入子层) 串行化/解串 · 时钟恢复 · 预加重 PMD层(物理介质相关子层) 各层职责 • 数据封装/解封装 • 速率适配 • 编码/解码 • 对齐标记插入 • 加扰/解扰 • 串行/并行转换 • 时钟数据恢复 • 均衡/预加重 • 光电转换 • 物理接口

这张图我每次做项目都会贴在工位上。你想想看,数据从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 链路训练机制:让两端"握手"

链路训练,说白了就是让发送端和接收端在正式传数据之前,先互相"认识"一下。这个过程包括:

  1. 信号检测:接收端检测是否有信号进来
  2. 时钟恢复:接收端锁定发送端的时钟
  3. 码流同步:找到对齐标记,确定数据边界
  4. 参数协商:交换能力信息,比如支持的速率、FEC模式
  5. 均衡训练:调整发送端的预加重和接收端的均衡器

这里我要特别说一下均衡训练。很多新手以为链路训练就是"对上眼"就行了。其实不是的。在高速链路中,信号经过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编码,那又是另一个有意思的话题了。


专注资料整理