8bit/10bit线路编码简介
线路编码:
线路/信道:
特指在数据(信息)传输中,信号传输的物理通道。本质上信道不局限于有线/无线,也不局限于具体的载体材质,可以是铜线、光信号、甚至是无介质空间中的电磁场。在本文中,主要针对有线通讯和光通讯应用的场景来具体讨论和展开。
- 信号交叠
每一种信道都有自己的特性,这些特性限制了最高的传输频率,更高频率的传输,会导致前后两个信息之间难以分辨,产生信号的交叠。
- 时钟信息
在数字电路系统中,需要传输的最高频率的信息就时钟信息。时钟频率要低于信道允许传输的最高频率。
- 信道干扰
任何信道都会受到所处环境的干扰。持续存在的干扰可以等同于基底噪声。突发的干扰则会引起信道的短暂不可靠,甚至造成传输错误。
总体来说,就是信道要保证传输的数据易于被接收端接收(采样)、分辨、恢复。
线路/信道编码:
线路/信道编码就是将原始需要传输的信息,经过一定的变换,使其更适合其所要使用的传输信道。通常要考虑如下因素:
- 带宽利用率要高
没有哪种信道编码可以100%利用信道的传输资源,但是要尽量减少信道编码的开销。
- 时钟信息传输要可靠
为了便于接收端的时钟恢复电路,必须充分传递时钟信息(控制连续的0和连续的1的个数)。
- 数据分割和对齐的方法
字节的划分、信道间的数据对齐等
- 具有一定的抗干扰能力
误码检测、误码纠错等
- 适应远距离传输
直流平衡等
8b-10b编码简介:
8b/10bB编码是1983年由IBM公司的Al Widmer和PeterFranaszek所提出的数据传输编码标准,目前已经被广泛应用到高速串行总线,如IEEE1394b、SATA、PCI-Express、Infini-band、FiberChannel、XAUI、RapidIO、USB 3.0等。
- 8b/10b编码,实际上是3b/4b 和 5b/6b两个编码的组合。
- 输入的8bit原始数据,被拆分成高3bit(记作y),和低5bit(记作x)两部分
- 拆分后的两部分,分别做3b/4b 和 5b/6b编码。生成10bit数据(4bit + 6bit)
- 最后生成的10bit数,按照LSB的顺序,从最低位逐bit发送。
3b/4b 和 5b/6b编码表
- 5b/6b code
Input | RD=-1 | RD=+1 | Input | RD=-1 | RD=+1 | |||
data | EDCBA | iedcba | data | EDCBA | iedcba | |||
D.00 | 00000 | 111001 | 000110 | D.16 | 10000 | 110110 | 001001 | |
D.01 | 00001 | 101110 | 010001 | D.17 | 10001 | 110001 | ||
D.02 | 00010 | 101101 | 010010 | D.18 | 10010 | 110010 | ||
D.03 | 00011 | 100011 | D.19 | 10011 | 010011 | |||
D.04 | 00100 | 101011 | 010100 | D.20 | 10100 | 110100 | ||
D.05 | 00101 | 100101 | D.21 | 10101 | 010101 | |||
D.06 | 00110 | 100110 | D.22 | 10110 | 010110 | |||
D.07 | 00111 | 000111 | 111000 | D.23 | 10111 | 010111 | 101000 | |
D.08 | 01000 | 100111 | 011000 | D.24 | 11000 | 110011 | 001100 | |
D.09 | 01001 | 101001 | D.25 | 11001 | 011001 | |||
D.10 | 01010 | 101010 | D.26 | 11010 | 011010 | |||
D.11 | 01011 | 001011 | D.27 | 11011 | 011011 | 100100 | ||
D.12 | 01100 | 101100 | D.28 | 11100 | 011100 | |||
D.13 | 01101 | 001101 | D.29 | 11101 | 011101 | 100010 | ||
D.14 | 01110 | 001110 | D.30 | 11110 | 011110 | 100001 | ||
D.15 | 01111 | 111010 | 000101 | D.31 | 11111 | 110101 | 001010 | |
K.28 | 11100 | 111100 | 000011 |
理论上分析:
- 5bit码共有32个码字,6bit码共有64个码字。因此5b/6b编码中,6bit码字只需要用一半。
- 为了去除连0和连1,自然会想到用64个码字中0/1比较平衡的码字。
- 6bit码字中,0和1个数相等(3个0和3个1)的码字共有C63=20个
0和1的个数相差2的有:2*C62=30个
0和1的个数相差4的有:2*C61=12个
0和1的个数相差6(全0或全1)的有:2*C60=2个
- 理论上,我们选择上述的前两种(0和1个数差小于等于2)码字就够了。
编码方式:
- 5bit码字中0和1的个数相差为1、3、5(0和1的个数不可能相等)
- 0比1多一个的码字有10个:
D.03(00011) RD-/+ (100011)
D.05(00101) RD-/+ (100101)
D.06(00110) RD-/+ (100110)
D.09(01001) RD-/+ (101001)
D.10(01010) RD-/+ (101010)
D.12(01100) RD-/+ (101100)
D.17(10001) RD-/+ (110001)
D.18(10010) RD-/+ (110010)
D.20(10100) RD-/+ (110100)
D.24(11000) RD- (110011) RD+ (001100)
从上面可以看到,5bit码字中当0比1多一个时,直接在前面添加1,编程6bit码字。这时的6bit码字0和1个数相等。
但是D.24比较特殊,按照上述规则,D.24编码后应该是111000,但是由于D.07,占用了相应的码字,因此D.24采用了其特殊的映射编码方式。
- 1比0多一个的码字也有10个(其实就是0/1翻转一下,码字翻转也等同于用31去减一下):
D.28(11100) RD-/+ (011100)
D.26(11010) RD-/+ (011010)
D.25(11001) RD-/+ (011001)
D.22(10110) RD-/+ (010110)
D.21(10101) RD-/+ (010101)
D.19(10011) RD-/+ (010011)
D.14(01110) RD-/+ (001110)
D.13(01101) RD-/+ (001101)
D.11(01011) RD-/+ (001011)
D.07(00111) RD- (000111) RD+ (111000)
从上面可以看到,5bit码字中当0比1多一个时,直接在前面添加1,编程6bit码字。这是的6bit码字0和1个数相等。
由于D.07占用了2个1/0个数相等的6bit码字,因此D.24使用了其他的码字。到此,20个0/1平衡的6bit码字全部用完了。
但是D.07比较特殊,在5’b00111前加一个0编程6’b000111后,此码字仅作为RD-,同时还编码了RD+ 6’b111000,这个码字刚好占用了D.24对应的码字,因此才导致了D.24使用了两个1/0差为2的码字。 这样做,主要是因为码字000111和111000的前后边界都是3连0/1,这很容易和前后的其他码字形成多个连续的0/1,因此编码时就必须考虑其他码字情况来做适当的选择,以避免过多的连0/1。
- 1和0个数相差3的码表
Input | RD=-1 | RD=+1 | Input | RD=-1 | RD=+1 | |||
data | EDCBA | iedcba | data | EDCBA | iedcba | |||
D.01 | 00001 | 101110 | 010001 | D.23 | 10111 | 010111 | 101000 | |
D.02 | 00010 | 101101 | 010010 | D.27 | 11011 | 011011 | 100100 | |
D.04 | 00100 | 101011 | 010100 | D.29 | 11101 | 011101 | 100010 | |
D.08 | 01000 | 100111 | 011000 | D.30 | 11110 | 011110 | 100001 | |
D.16 | 10000 | 110110 | 001001 | D.15 | 01111 | 111010 | 000101 |
D.23、D.27、D.29、D.30对应的5bit码字中1的个数比0多,因此其RD-编码即为在其前面加1bit0。而RD+则是RD-按bit取反。
D.01、D.02、D.04、D.08对应的5bit码字中0的个数比1多,因此其RD+是在第二bit处插入1bit1(最前面加1bit1对应的码字被D.23、D.27、D.29、D.30的RD-占用了)
D.16和D.15,比较特殊,为了减少连续的0/1,采用了特殊的编码方法。
但是D.30的中间存在4个连续的0/1:6’b011110和6’b100001。
- 特殊编码:
Input | RD=-1 | RD=+1 | Input | RD=-1 | RD=+1 | |||
data | EDCBA | iedcba | data | EDCBA | iedcba | |||
D.16 | 10000 | 110110 | 001001 | D.15 | 01111 | 111010 | 000101 | |
D.00 | 00000 | 111001 | 000110 | D.31 | 11111 | 110101 | 001010 | |
D.24 | 11000 | 110011 | 001100 | K.28 | 11100 | 111100 | 000011 |
编码的2个基本原则:
- RD为“-”时,表示前面的码流中0比较多,因此RD-的码字中,1要比0多。同理,当RD为“+”时,码字中的0要比1多。
- 使用的码字中,尽量避免的连续的0或1的编码,尤其在码字的边界处。
K.28 作为控制码,其边界有连续的0和1,因此在和前后其他码字构成连续的码流时,需要考虑避免过长的连续0/1的情况。
由此我们也考虑到D.07采用的编码,虽然0和1的个数是均等的,但是由于其连续的0和连续的1都在码字的边界,因此在构成连续的码流时也容易和前后的其他码字组成比较长的连0/1。
由此还剩下两个编码: 110000和001111。
3bit/4bit code
Input | RD=-1 | RD=+1 | Input | RD=-1 | RD=+1 | |||
data | HGF | jhgf | data | HGF | jhgf | |||
D.x.0 | 000 | 1101 | 0010 | K.x.0 | 000 | 1101 | 0010 | |
D.x.1 | 001 | 1001 | K.x.1 | 001 | 0110 | 1001 | ||
D.x.2 | 010 | 1010 | K.x.2 | 010 | 0101 | 1010 | ||
D.x.3 | 011 | 0011 | 1100 | K.x.3 | 011 | 0011 | 1100 | |
D.x.4 | 100 | 1011 | 0100 | K.x.4 | 100 | 1011 | 0100 | |
D.x.5 | 101 | 0101 | K.x.5 | 101 | 1010 | 0101 | ||
D.x.6 | 110 | 0110 | K.x.6 | 110 | 1001 | 0110 | ||
D.x.P7 | 111 | 0111 | 1000 | |||||
D.x.A7 | 111 | 1110 | 0001 | K.x.7 | 111 | 1110 | 0001 |
3bit/4bit码表看起来比较直观:
- D.x.1、D.x.2、D.x.5、D.x.6都是简单地在最前面插入相应的1/0,凑成1和0平衡的4bit编码。
- D.x.3和5bit/6bit编码中的D.07类似,占用了两个平衡的码字,因此D.x.4和D.24类似,只能有非平衡的码字了。
- D.x.0采用了特殊的编码后,剩下四个连0/1的分给了D.x.7
- 为了防止码流中D.x.7和前后的码连接出太多的0/1,给D.x.7分配了2组码字,并且规定如下:
1)3bit/4bit码排在5bit/6bit码之后(D.x.y中的x表示5bit/6bit编码的结果)。在和5bit/6bit编码组合时,D.x.P7和D.x.A7必须选一个,但是要避免5个以上的连0或连1。
2)结合5bit/6bit编码,以下情况选择A7,其他情况全都使用P7:
当RD为“-”是,有3个码字选择A7,即:
D.17.A7、D.18.A7、D.20.A7
当RD为“+”是,有3个码字选择A7,即:
D.11.A7、D.13.A7、D.14.A7
此处更能清晰的理解编码的思想,和RD的含义:在有RD+和RD-的编码中,利用不同RD采用不同的编码,都可以有效的避免过多的连续0/1情况。但是对于D.17、D.18、D.20、D.11、D.13、D.14这样的编码并没有区分RD+和RD-,这在和4bit/5bit编码时,就容易产生多个连续的0/1。尤其当比较平衡的码字都分配完后,K.x.7的编码方式就必须考虑这一点了。
- K码的码字共有16个(4bti所有码字也是16个),而为了避免出现某些连0/1的码字,在K码的16个码字中,是有重复码字的,因此在使用K码时,情况会比较复杂。
使用K码时,要避免和其他码字混淆,因此并不是所有的组合都会被使用到。
K code:
K码作为特殊的控制编码,专门用来表示数据以外的控制指令。可以根据需要镶嵌在数据码流中的任何位置
基于K码的应用和复杂性,在原始的8bit/10bit编码中,只定义了12个特殊的控制码。他们可以和其他码字一起组成各种“原语”。
input | RD= -1 | RD= +1 | |
HGF EDCBA | abcdei fghj | abcdei fghj | |
K28.0 | 000 11100 | 001111 0100 | 110000 1011 |
K28.1 | 001 11100 | 001111 1001 | 110000 0110 |
K28.2 | 010 11100 | 001111 0101 | 110000 1010 |
K28.3 | 011 11100 | 001111 0011 | 110000 1100 |
K28.4 | 100 11100 | 001111 0010 | 110000 1101 |
K28.5 | 101 11100 | 001111 1010 | 110000 0101 |
K28.6 | 110 11100 | 001111 0110 | 110000 1001 |
K28.7 | 111 11100 | 001111 1000 | 110000 0111 |
K23.7 | 111 10111 | 111010 1000 | 000101 0111 |
K27.7 | 111 11011 | 110110 1000 | 001001 0111 |
K29.7 | 111 11101 | 101110 1000 | 010001 0111 |
K30.7 | 111 11110 | 011110 1000 | 100001 0111 |
注意这个码表的排列顺序。
- K28.1、K28.5、K28.7中出现了5个连续的0/1,这在8bit/10bit编码中是绝无仅有的。因此这连续出现的5个0/1,被定义为 逗号码(commas),或者逗号序列,通常用来做序列的bit校准。
8bit/10bit编码规则
RD(running disparity):
RD用来表示0和1的相对多少。如果RD=(+1),表示之前的编码中1的个数比0多;如果RD=(-1),表示之前的编码中0的个数比1多。
Previous RD | Disparity of 6 or 4 bit code | Next RD |
-1 | -2(0比1多2个) | 此情况禁止发生 |
-1 | 0 | -1 |
-1 | 2 | +1 |
+1 | -2 | -1 |
+1 | 0 | +1 |
+1 | 2 | 此情况禁止 |
- 每一个编码过程有2个输入,和两个输出:
输入: 要编的源码 码字
上一次编码后得出的RD值
输出: 编码后的码字
本次编码后的RD值
编码过程:
- 初始RD=-1
- 输入一个要编码的原始8bit码字,和一个控制码 z (z用来表示是D码码,还是K码)
- 将码字拆分成高3bit(HGF) 和 低5bit(EDCBA)。
- 依据控制z bit,决定使用D码表,还是K码表
- 根据当前RD、和5bit码,编码(查表)得到6bit 码字(abcdei)。
- 根据编码后码字(abcdei),计算当前的disparity值(-2/0/+2)。
- 根据当前RD和disparity值,得出新的RD值。
- 依据新的RD,和3bit(HGF),以及选择后的码表(D码或K码),编码(查表)得到4bit码字(fghj)
- 根据编码后的码字(fghj),计算当前的disparity值(-2/0/+2)。
- 根据当前RD和disparity值,得出本次编码的RD值。
- 将编码后的jhgfiedcba,从最低bit逐bit发送,发送顺序:
a,b,c,d,e,I,f,g,h,j
- RD= 上一次编码后的RD值,
- 重复2)~12)步骤。
K码的应用:
在PCIE协议中,使用如下的K码:
Encoding | symbol | function | description |
K28.5 001111 1010 110000 0101 | COM | comma | Used for Lane and Link Initialization and management |
K27.7 110110 1000 001001 0111 | STP | Start TLP | Marks the start of a Transaction Layer Packet |
K28.2 001111 0101 110000 1010 | SDP | Start DLLP | Marks the start of a Data Link Layer Packet |
K29.7 101110 1000 010001 0111 | END | end | Marks the end of TLP or DLLP |
K30.7 011110 1000 100001 0111 | EDB | End bad | Marks the end of nullified TLP |
K23.7 111010 1000 000101 0111 | PAD | Pad | Used in Framing and Link Width and Lane ordering negotiations |
K28.0 001111 0100 110000 1011 | SKP | skip | Used for compensating for different bit rates for two communicating ports |
K28.1 001111 1001 110000 0110 | FTS | Fast training sequence | Used within an ordered set to exit from L0s to L0 |
K28.3 001111 0011 110000 1100 | IDL | Idle | Used in the Electrical idle ordered set |
K28.4 001111 0010 110000 1101 | reserved | ||
K28.6 001111 0110 110000 1001 | reserved | ||
K28.7 001111 1000 110000 0111 | reserved |
从上表可以理解到:
- 仅有K28.5中包含5个连续的0/1,因此用作comma(逗号码),作为串行序列的bit位检测标识,区分symbol。K28.5可以定期或者不定期地插入到码流中的任何部分,作用类似于帧同步信号,接收方收到后,需要从码流中将其去掉。
- K28.0(skip):在多个lane时,用以填充空闲的lane,以达到各个lane之间的字节对齐。