8B/10B 编码
解决的问题
8B/10B 编码是 1983 年 IBM 公司提出的传输编码标准,通常用于高速收发器中,常见的 JESD204B、SATA 等接口协议,使用查表就可以实现编码和解码。
在这些高速收发器的接收端需要通过 CDR 技术去恢复时钟与数据的相位关系,在这个过程中需要不断的检测数据边沿和数据中心,从而调整时钟和数据的相位,因此需要保证接收的数据需要不断的变化,从而给CDR提供足够多的待检测数据边沿。
另外高速接口电路一般采用交流耦合方式进行连接,在交流耦合电路中的信号线会接电容(隔直通交),如果传输的数据在一段时间内全是 1 或全是 0,那么这段时间传输的信号可以等效成直流信号,会产生直流偏移,在通过电容时,有可能解码错误。
因此通过 8B/10B 编码,保证编码后的数据在一定时间内 0 的个数与 1 的个数保持相等。
编码规则
8B/10B 编码把 8 位数据分为高3位和低5位,分别进行 3B/4B、5B/6B 编码,结果为10位数据。
通常把编码前的低 5 位数据 EDCBA 的十进制数值记为 x,把编码前的高 3 位数据 HGF 的十进制数值记为 y,原始 8 位数据可以表示为 D.x.y 或 K.x.y。
极性偏差(running disparity,RD)用来记录上一次编码结果中 0 和 1 个数的多少。RD = -1 表示编码结果 1 多于 0,RD = 1 表示编码结果 0 多于 1。
如果编码结果的 1 和 0 个数相等,称为平衡编码,此时 RD 的数值保持不变。如果编码结果 1 和 0 个数不等,称为非平衡编码,此时 RD 的数值翻转,下次编码采用 RD 对应数值的编码作为编码结果。
将上次 8B/10B 编码结果的RD数值用作本次 5B/6B 编码的起始 RD,而 3B/4B 编码的起始 RD 等于 5B/6B 编码结果的 RD,3B/4B 编码结果的 RD 作为本次 8B/10B 编码的 RD,对应的编码状态跳转如下图所示。
注:D.x.7 有两套编码,分别是 D.x.P7 (主要,Primary)和 D.x.A7(备用,Alternate),这是为了避免与前面的 5B/6B 代码组合时出现 5 个连续的 0 或 1
- 当 RD = -1,5B/6B编码 x = 17,18或20时,如果选择 D.x.P7 则会出现 5 个连续的 1,所以需要选择备用编码D.x.A7
- 当 RD = -1,5B/6B编码 x = 11,13或24时,如果选择 D.x.P7 则会出现 5 个连续的 0,使用需要选择备用编码D.x.A7
编码表
D.x.y