8B10B编码旨在使传输链路保持直流平衡,从而精简了时钟恢复电路(CDR)的设计,使集成电路设计成本降低。该编码方式还规定了一些特殊控制符,可提供误码监测功能。8b/10b 编解码模块一般和串化器/解串器连接,组成SerDes 接口。
【JESD204系列】七、8B10B编码为什么要8B10B编码
简单的说是为了实现直流均衡。在高速串行通信中,8B/10B编码是一种经常用到的编码方式。而高速串行总线中,通常采用交流耦合方式,即在发送端(TX)串接电容,根据电容“隔直流,通交流”的特性,或者理想电容的阻抗公式:Zc=1/2πfc
信号频率越高,电容阻抗越低。当数据位流中出现多个连续的1或0时,可以认为该时间段信号是直流的,电容的损耗变大,导致信号的幅度降低,直流信号被滤除,到最后无法识别是1还是0。而且接收端收到连续的1或0时,没有充分的定时信息,对接收端的解码带来了困难。其原理如下图所示:
8B10B编码
根据JESD204B 协议规定,在数据被传输之前要先经过8B/10B 编码,属于mB/nB 编码中的一种。由于数据序列传输过程中,如果出现较长的连续“0”或者连续“1”序列,将对时钟信息的提取恢复产生不利影响。因此为了时间信息提取较为容易,应该避免较长的连续“0”和“1”,并且尽量提高电平跳变的密度。同时,对于直流分量来说,“1”和“0”随机变化,导致直流分量也做随机变化,这对数字信号的判决和恢复带来了一定的困难。
因此,在JESD204B 协议中使用8B/10B 编码,将输入的8 位数据根据特定的规则,转换成10 位的数据,并通过此种方式实现直流平衡,同时保证足够的电平转换密度。该编码方式主要具有以下特点:
1.足够的电平转换密度,在十位的字符中有3到8次电平转换,确保接收端对时钟信号的恢复。
2.可以使用控制字符对传输过程进行控制,如对齐,标识帧起始和结束等。
3.保证直流平衡。
4.可以对单比特错位进行检错。
具体的编码方式是,将待编码的8bit 数据按照顺序从最高有效位MSB 到最低有效位LSB 依次排列,分别记为HGFEDCBA,并且高三位HGF分为一组,记为y 组,低五位EDCBA 分为一组,记为x 组。分别对y 组进行3B/4B 编码,得到的数据记为jhgf。对x 组进行5B/6B 编码,得到的数据记为iedcba。然后将以上两组数据组合起来进行传输,其中传输从LSB 开始。如下图所示。
其中8 位数据可以根据对应x 组和y 组的数值,记为𝐷𝑥.𝑦或者𝐾𝑥.𝑦,其中D 代表数据,K 代表控制字符。进行对应的3B/4B、5B/6B 编码时,具体的编码映射表如下表所示。
表中的RD 为运行不一致性(Running Disparity),用以表示编码中“1”和“0”的数量差,即RD=数据中0的数量减去1的数量。如前文所说,使用8B/10B 编码的一大原因就是因为这种编码方式可以保持直流平衡,因此要使用RD 这一参数对编码过程进行控制,一般RD 的初始值设为-1。在不同的当前RD值时,编码方式也会对应的有所不同。具体来说,在进行编码时,3B/4B 编码和5B/6B 编码的编码结果位数都是偶数。因此,其中所能包含的“0”和“1”的个数差,只有三种可能出现的结果:“0”和“1”的个数一样多,即差值为“0”;“0”比“1”的个数多两个,即差值为“+2”;“0”比“1”的个数少两个,即差值为“-2”。
从表中可以发现,对于y=7 时,存在Dx.P7、Dx.A7 两种编码方式,这是因为在不同的RD 取值时,对应一些特定的x 值,编码之后可能会出现五个0 或者五个1 相连的情况,而这种特殊情况是用来在串行数据流中定位开始位置的,也就是说只允许规定的特殊字符如/K/、/F/在编码后出现连续五个0 或者五个1,以实现对数据流的定位。因此为了避免发生混淆,普通字符在编码后不能出现这种连续的五个0 或1,此时就要选用Dx.A7 的编码方式。具体来说,当RD=-1 且x=17,18,20 时,以及RD=+1 且x=11,13,14 时,编码后会出现上述情况,因此此时要对y=7 采用Dx.A7 的编码方式,其余情况正常使用Dx.P7 进行编码。总的来说,如果当前RD 值为-1,则使用“+2”对应的编码方式,则编码后的数据RD 值即为+1。同理,当前RD 值为+1 时使用“-2”对应的编码方式,当前RD值为0 时使用“0”对应的编码方式,从而确保编码结果中RD 值只有-1、0、1 三种取值,也就是“0”和“1”的个数相差不超过2个,从而保证直流平衡。编码过程中的RD 取值变化如下图所示:
5B/6B 编码表如下表所示:
如前文所说,8B/10B 编码中包含了多个控制字符,JESD204B 使用其中的五个控制字符对传输过程进行控制,如下表所示:
字符简写 | 字符 | 编码前数值 | RD=-1时编码结果 | RD=+1时编码结果 | 功能说明 |
---|---|---|---|---|---|
/R/ | /K28.0/ | 000_11100 | 001111_0100 | 110000_1011 | 多帧开始 |
/A/ | /K28.3/ | 011_11100 | 001111_0011 | 110000_1100 | 通道对齐 |
/Q/ | /K28.4/ | 100_11100 | 001111_0010 | 110000_1101 | 链路配置数据开始 |
/K/ | /K28.5/ | 101_11100 | 001111_1010 | 110000_0101 | 组同步 |
/F/ | /K28.7/ | 111_11100 | 001111_1000 | 110000_0111 | 帧同步 |