[FPGA20]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码) ,可以帮助接收端进行还原的工作,并且可以在早期发现数据位的传输错误,抑制错误继续发生。

直流平衡(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种情况:
  1. 有5个0和5个1
  2. 有6个0和4个1
  3. 有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编码的实现思路

  • 进行编解码设计时通大体下面几种方法。
  1. 第一种是用查找表直接将8位信号映射成10位信号,该方法用存储器存储所有可能出现的码组,再将输入码组转换为存储地址,找出对应的编解码。 方法逻辑简单,开发时间很短,但是编解码电路的工作速度受到FPGA内部存储器读取时间的限制,同时不可避免地增加了芯片的面积和功耗。
  2. 第二种是通过逻辑运算直接完成编解码功能对,该方法的优点是可以明显减小内部使用面积,难点在于逻辑关系复杂。如果采用卡诺图直接化简则会产生大扇入逻辑表达式,大大限制电路的最高工作速度,同时对逻辑电路的驱动也将加大电路功耗。
  3. 第三种是,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:李锐博恩