大家好,欢迎来到IT知识分享网。
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 |
000110 |
D.16 |
10000 |
001001 |
|||
D.01 |
00001 |
010001 |
D.17 |
10001 |
||||
D.02 |
00010 |
010010 |
D.18 |
10010 |
||||
D.03 |
00011 |
D.19 |
10011 |
010011 |
||||
D.04 |
00100 |
010100 |
D.20 |
10100 |
||||
D.05 |
00101 |
D.21 |
10101 |
010101 |
||||
D.06 |
00110 |
D.22 |
10110 |
010110 |
||||
D.07 |
00111 |
000111 |
D.23 |
10111 |
010111 |
|||
D.08 |
01000 |
011000 |
D.24 |
11000 |
001100 |
|||
D.09 |
01001 |
D.25 |
11001 |
011001 |
||||
D.10 |
01010 |
D.26 |
11010 |
011010 |
||||
D.11 |
01011 |
001011 |
D.27 |
11011 |
011011 |
|||
D.12 |
01100 |
D.28 |
11100 |
011100 |
||||
D.13 |
01101 |
001101 |
D.29 |
11101 |
011101 |
|||
D.14 |
01110 |
001110 |
D.30 |
11110 |
011110 |
|||
D.15 |
01111 |
000101 |
D.31 |
11111 |
001010 |
|||
K.28 |
11100 |
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-/+ ()
D.05(00101) RD-/+ ()
D.06(00110) RD-/+ ()
D.09(01001) RD-/+ ()
D.10(01010) RD-/+ ()
D.12(01100) RD-/+ ()
D.17(10001) RD-/+ ()
D.18(10010) RD-/+ ()
D.20(10100) RD-/+ ()
D.24(11000) RD- () RD+ (001100)
从上面可以看到,5bit码字中当0比1多一个时,直接在前面添加1,编程6bit码字。这时的6bit码字0和1个数相等。
但是D.24比较特殊,按照上述规则,D.24编码后应该是,但是由于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+ ()
从上面可以看到,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’b,这个码字刚好占用了D.24对应的码字,因此才导致了D.24使用了两个1/0差为2的码字。 这样做,主要是因为码字000111和的前后边界都是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 |
010001 |
D.23 |
10111 |
010111 |
|||
D.02 |
00010 |
010010 |
D.27 |
11011 |
011011 |
|||
D.04 |
00100 |
010100 |
D.29 |
11101 |
011101 |
|||
D.08 |
01000 |
011000 |
D.30 |
11110 |
011110 |
|||
D.16 |
10000 |
001001 |
D.15 |
01111 |
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’b。
- 特殊编码:
Input |
RD=-1 |
RD=+1 |
Input |
RD=-1 |
RD=+1 |
|||
data |
EDCBA |
iedcba |
data |
EDCBA |
iedcba |
|||
D.16 |
10000 |
001001 |
D.15 |
01111 |
000101 |
|||
D.00 |
00000 |
000110 |
D.31 |
11111 |
001010 |
|||
D.24 |
11000 |
001100 |
K.28 |
11100 |
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。
由此还剩下两个编码: 和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 |
1011 |
K28.1 |
001 11100 |
001111 1001 |
0110 |
K28.2 |
010 11100 |
001111 0101 |
1010 |
K28.3 |
011 11100 |
001111 0011 |
1100 |
K28.4 |
100 11100 |
001111 0010 |
1101 |
K28.5 |
101 11100 |
001111 1010 |
0101 |
K28.6 |
110 11100 |
001111 0110 |
1001 |
K28.7 |
111 11100 |
001111 1000 |
0111 |
K23.7 |
111 10111 |
1000 |
000101 0111 |
K27.7 |
111 11011 |
1000 |
001001 0111 |
K29.7 |
111 11101 |
1000 |
010001 0111 |
K30.7 |
111 11110 |
011110 1000 |
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 0101 |
COM |
comma |
Used for Lane and Link Initialization and management |
K27.7 1000 001001 0111 |
STP |
Start TLP |
Marks the start of a Transaction Layer Packet |
K28.2 001111 0101 1010 |
SDP |
Start DLLP |
Marks the start of a Data Link Layer Packet |
K29.7 1000 010001 0111 |
END |
end |
Marks the end of TLP or DLLP |
K30.7 011110 1000 0111 |
EDB |
End bad |
Marks the end of nullified TLP |
K23.7 1000 000101 0111 |
PAD |
Pad |
Used in Framing and Link Width and Lane ordering negotiations |
K28.0 001111 0100 1011 |
SKP |
skip |
Used for compensating for different bit rates for two communicating ports |
K28.1 001111 1001 0110 |
FTS |
Fast training sequence |
Used within an ordered set to exit from L0s to L0 |
K28.3 001111 0011 1100 |
IDL |
Idle |
Used in the Electrical idle ordered set |
K28.4 001111 0010 1101 |
reserved |
||
K28.6 001111 0110 1001 |
reserved |
||
K28.7 001111 1000 0111 |
reserved |
从上表可以理解到:
- 仅有K28.5中包含5个连续的0/1,因此用作comma(逗号码),作为串行序列的bit位检测标识,区分symbol。K28.5可以定期或者不定期地插入到码流中的任何部分,作用类似于帧同步信号,接收方收到后,需要从码流中将其去掉。
- K28.0(skip):在多个lane时,用以填充空闲的lane,以达到各个lane之间的字节对齐。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/147808.html