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码) ,可以帮助接收端进行还原的工作,并且可以在早期发现数据位的传输错误,抑制错误继续发生。
直流平衡(DC Balance)
-
由于我们的串行链路中会有交流耦合电容,我们知道理想电容的阻抗公式是Zc=1/2πf*C,因此信号频率越高,阻抗越低,反之频率越低,阻抗越高。因此当码型是高频的时候,基本上可以不损耗的传输过去,但是当码型为连续“0”或者“1”的情况时,电容的损耗就很大,导致幅度不断降低,带来的严重后果是无法识别到底是“1”还是“0”。因此编码就是为了尽量把低频的码型优化成较高频的码型,从而保证低损耗的传输过去。
-
8B/10B编码是目前高速串行通信中经常用到的一种编码方式。直观的理解就是把8bit数据编码成10bit来传输,为什么要引入这种机制呢?其根本目的是“直流平衡(DC Balance)”。当高速串行流的逻辑1或逻辑0有多个位没有产生变化时,信号的转换就会因为电压位阶的关系而造成信号错误,直流平衡的最大好处便是可以克服以上问题。
不均等性(Disparity)
- 将8bit编码成10bit后,10B中0和1的位数只可能出现3种情况:
- 有5个0和5个1
- 有6个0和4个1
- 有4个0和6个1
- 这样引出了一个新术语“不均等性(Disparity)”,就是1的位数和0的位数的差值,根据上面3种情况就有对应的3个Disparity 0、-2、+2。
极性偏差
- 所谓极性偏差,即当当前数据编码完成后的数据码型数据是“1”多还是“0”多。如果是“1”多,则极性偏差RD为-1;如果是“0”多,则极性偏差RD为+1。而RD的正负代表着同一个码型的两种编码方式。
- 编码的目标就是为了缓解长“0”或长“1”的影响,因此在编码后如果“1”多的话,我们下一次的编码就要把这种码型做一个修正,因此从-RD码型变成+RD码型。如果是“0”和“1”一样多,极性则不用变。
应用领域
- 8b/10b编码是目前许多高速串行总线采用的编码机制,如 USB3.0、1394b、Serial ATA、PCI Express、Infini-band、Fiber Channel、RapidIO等总线或网络等。
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)。
- 下面会给出二者的编码表,根据输入数据与编码极性RD,我们就可以知道编码后的码型。
编码表
5B/6B 编码表
输入缩写 | EDCBA | RD=-1 | RD=+1 | 输入缩写 | EDCBA | RD=-1 | RD=+1 |
---|---|---|---|---|---|---|---|
input | EDCBA | abcdei | abcdei | input | EDCBA | abcdei | abcdei |
D0 | 00000 | 100111 | 011000 | D16 | 10000 | 011011 | 100100 |
D1 | 00001 | 011101 | 100010 | D17 | 10001 | 100011 | 100011 |
D2 | 00010 | 101101 | 010010 | D18 | 10010 | 010011 | 010011 |
D3 | 00011 | 110001 | 110001 | D19 | 10011 | 110010 | 110010 |
D4 | 00100 | 110101 | 001010 | D20 | 10100 | 001011 | 001011 |
D5 | 00101 | 101001 | 101001 | D21 | 10101 | 101010 | 101010 |
D6 | 00110 | 011001 | 011001 | D22 | 10110 | 011010 | 011010 |
D7 | 00111 | 111000 | 000111 | D23 | 10111 | 111010 | 000101 |
D8 | 01000 | 111001 | 000110 | D24 | 11000 | 110011 | 001100 |
D9 | 01001 | 100101 | 100101 | D25 | 11001 | 100110 | 100110 |
D10 | 01010 | 010101 | 010101 | D26 | 11010 | 010110 | 010110 |
D11 | 01011 | 110100 | 110100 | D27 | 11011 | 110110 | 001001 |
D12 | 01100 | 001101 | 001101 | D28 | 11100 | 001110 | 001110 |
D13 | 01101 | 101100 | 101100 | D29 | 11101 | 101110 | 010001 |
D14 | 01110 | 011100 | 011100 | D30 | 11110 | 011110 | 100001 |
D15 | 01111 | 010111 | 101000 | D31 | 11111 | 101011 | 010100 |
3B/4B 编码表
输入缩写 | HGF | RD=-1 | RD=+1 |
---|---|---|---|
input | HGF | fghj | fghj |
D.x.0 | 000 | 1011 | 0100 |
D.x.1 | 001 | 1001 | 1001 |
D.x.2 | 010 | 0101 | 0101 |
D.x.3 | 011 | 1100 | 0011 |
D.x.4 | 100 | 1101 | 0010 |
D.x.5 | 101 | 1010 | 1010 |
D.x.6 | 110 | 0110 | 0110 |
D.x.P7 | 111 | 1110 | 0001 |
D.x.A7 | 111 | 0111 | 1000 |
控制字符编码表
- 在8B/10B编码中,还会用到12个特殊的K字符,K字符及其组合方式通常用于表示数据帧的SOF(起始位)/EOF(结束位)/IDLE(空闲位)等特殊信息。
输入缩写 | HGF EDCBA | RD=-1 | RD=+1 |
---|---|---|---|
input | HGF EDCBA | abcdei fghj | abcdei |
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编码的实现思路
- 进行编解码设计时通大体下面几种方法。
- 第一种是用查找表直接将8位信号映射成10位信号,该方法用存储器存储所有可能出现的码组,再将输入码组转换为存储地址,找出对应的编解码。 方法逻辑简单,开发时间很短,但是编解码电路的工作速度受到FPGA内部存储器读取时间的限制,同时不可避免地增加了芯片的面积和功耗。
- 第二种是通过逻辑运算直接完成编解码功能对,该方法的优点是可以明显减小内部使用面积,难点在于逻辑关系复杂。如果采用卡诺图直接化简则会产生大扇入逻辑表达式,大大限制电路的最高工作速度,同时对逻辑电路的驱动也将加大电路功耗。
- 第三种是,8B/10B编码模块化实现,较好地反映了8B/10B编码的特点,实现流程清楚。 实现步骤: ①判断是特殊字符还是数据;②若是特殊字符,根据RD极性直接取值; ③若是数据,把一节8位字节拆成3bit和5bit,然后在RD控制器的控制下以并列的方式编/译码。 RD控制器的原则是: 系统设定的RD默认初始值为RD-, RD的初值作为选择信号用以决定5B/6B编码模块中6B码的选取, 同时由所选取的6B码计算出新的RD值作用于3B/4B编码模块。 4B编码所得到的RD值又作为下一组编码的RD输入值, 由此完成了全部的8B/10B编码。
8B/10B编码的利用率
- 由于采用8B/10B编码带来了2个位宽的开销,所以导致带宽利用率只有原来的80%,如SRIO协议3.125Gbps带宽,其有效的带宽利用率只有3.125*0.8 = 2.5Gbps,所以串行总线在提高带宽的同时,带宽利用率也必须提高,因此诞生了64B/66B、128B/130B等编码方式,原理和8B/10B编码相同,但是带宽利用率提高了。
参考:
高速串行总线系列(1)8B/10B编码技术-Author:李锐博恩