目录

8B/10B编码

5B/6B 编码表

3B/4B 编码表

控制字符编码表

8B/10B编码的利用率

参考文献


 


8B/10B编码

为什么要使用8B/10B编码?
8b/10b编码的特性之一是保证DC 平衡,采用8b/10b编码方式,可使得发送的“0”、“1”数量保持基本一致,连续的“1”或“0”不超过5位,即每5个连续的“1”或“0”后必须插入一位“0”或“1”,从而保证信号DC平衡,它就是说,在链路超时时不致发生DC失调。通过8b/10b编码,可以保证传输的数据串在接收端能够被正确复原,除此之外,利用一些特殊的代码( 在PCI-Express总线中为K码) ,可以帮助接收端进行还原的工作,并且可以在早期发现数据位的传输错误,抑制错误继续发生。

8b/10b编码是目前许多高速串行总线采用的编码机制,如 USB3.0、1394b、Serial ATA、PCI Express、Infini-band、Fiber Channel、RapidIO等总线或网络等。

8B/10B编码是目前高速串行通信中经常用到的一种编码方式。直观的理解就是把8bit数据编码成10bit来传输,为什么要引入这种机制呢?其根本目的是“直流平衡(DC Balance)”。当高速串行流的逻辑1或逻辑0有多个位没有产生变化时,信号的转换就会因为电压位阶的关系而造成信号错误,直流平衡的最大好处便是可以克服以上问题。
将8bit编码成10bit后,10B中0和1的位数只可能出现3种情况:
1.有5个0和5个1
2.有6个0和4个1
3.有4个0和6个1
这样引出了一个新术语“不均等性(Disparity)”,就是1的位数和0的位数的差值,根据上面3种情况就有对应的3个Disparity 0、-2、+2。

8B/10B编码的原理:

8bit原始数据会分成两部分,其低5位进行5B/6B编码,高3位则进行3B/4B编码,这两种映射关系在当时已经成为了一个标准化的表格。人们喜欢把8bit数据表示成Dxx.y的形式,其中x=5LSB,y=3MSB。

其中D表示待编码的字符为正常数据,还存在Kxx.y的形式,这里的K表示控制字符。

例如一个8bit数据101 10101,x=10101(十进制为21) y=101(十进制为5),现在我们就把这8bit数据写成D21.5,明白了吧!

对于8bit数据,它在表中的位序为HGFEDCBA,即H为最高位,A为最低位,EDCBA经过5B/6B编码为abcdei,HGF经过3B/4B编码为fghj。传送10bit编码的顺序为abcdeifghi。

8B/10B编码由低5位进行5B/6B编码,高3位则进行3B/4B编码实现,二者都是通过LUT的方式实现。在LUT中,除了原始的8位输入数据,编码后10位输出数据,还有一个编码极性RD(Running Disparity),下面会给出二者的编码表:

5B/6B 编码表

input RD = −1 RD = +1   input RD = −1 RD = +1
  EDCBA abcdei   EDCBA abcdei
D0 00000 100111 011000 D16 10000 011011 100100
D1 00001 011101 100010 D17 10001 100011
D2 00010 101101 010010 D18 10010 010011
D3 00011 110001 D19 10011 110010
D4 00100 110101 001010 D20 10100 001011
D5 00101 101001 D21 10101 101010
D6 00110 011001 D22 10110 011010
D7 00111 111000 000111 D23 10111 111010 000101
D8 01000 111001 000110 D24 11000 110011 001100
D9 01001 100101 D25 11001 100110
D10 01010 010101 D26 11010 010110
D11 01011 110100 D27 11011 110110 001001
D12 01100 001101 D28 11100 001110
D13 01101 101100 D29 11101 101110 010001
D14 01110 011100 D30 11110 011110 100001
D15 01111 010111 101000 D31 11111 101011 010100

3B/4B 编码表

input RD = −1 RD = +1
  HGF fghj
D.x.0 000 1011 0100
D.x.1 001 1001
D.x.2 010 0101
D.x.3 011 1100 0011
D.x.4 100 1101 0010
D.x.5 101 1010
D.x.6 110 0110
D.x.P7 111 1110 0001
D.x.A7 111 0111 1000

控制字符编码表

在8B/10B编码中,还会用到12个特殊的K字符,K字符及其组合方式通常用于表示数据帧的SOF(起始位)/EOF(结束位)/IDLE(空闲位)等特殊信息。

input RD = −1 RD = +1
  HGF EDCBA abcdei fghj abcdei fghj
K.28.0 000 11100 001111 0100 110000 1011
K.28.1 001 11100 001111 1001 110000 0110
K.28.2  010 11100 001111 0101 110000 1010
K.28.3  011 11100 001111 0011 110000 1100
K.28.4  100 11100 001111 0010 110000 1101
K.28.5 101 11100 001111 1010 110000 0101
K.28.6  110 11100 001111 0110 110000 1001
K.28.7 111 11100 001111 1000 110000 0111
K.23.7  111 10111 111010 1000 000101 0111
K.27.7  111 11011 110110 1000 001001 0111
K.29.7  111 11101 101110 1000 010001 0111
K.30.7  111 11110 011110 1000 100001 0111

8B/10B编码的利用率

由于采用8B/10B编码带来了2个位宽的开销,所以导致带宽利用率只有原来的80%,如SRIO协议3.125Gbps带宽,其有效的带宽利用率只有3.125*0.8 = 2.5Gbps,所以串行总线在提高带宽的同时,带宽利用率也必须提高,因此诞生了64B/66B、128B/130B等编码方式,原理和8B/10B编码相同,但是带宽利用率提高了。

参考文献

嵌入式高速串行总线技术

参考链接1

参考链接2

参考链接3

参考链接4