目录
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编码相同,但是带宽利用率提高了。
参考文献
嵌入式高速串行总线技术