8bit/10bit线路编码简介

8bit/10bit线路编码简介

线路编码:

       线路/信道:

特指在数据(信息)传输中,信号传输的物理通道。本质上信道不局限于有线/无线,也不局限于具体的载体材质,可以是铜线、光信号、甚至是无介质空间中的电磁场。在本文中,主要针对有线通讯和光通讯应用的场景来具体讨论和展开。

  1. 信号交叠

每一种信道都有自己的特性,这些特性限制了最高的传输频率,更高频率的传输,会导致前后两个信息之间难以分辨,产生信号的交叠。

  1. 时钟信息

在数字电路系统中,需要传输的最高频率的信息就时钟信息。时钟频率要低于信道允许传输的最高频率。

  1. 信道干扰

任何信道都会受到所处环境的干扰。持续存在的干扰可以等同于基底噪声。突发的干扰则会引起信道的短暂不可靠,甚至造成传输错误。

              总体来说,就是信道要保证传输的数据易于被接收端接收(采样)、分辨、恢复。

线路/信道编码:

       线路/信道编码就是将原始需要传输的信息,经过一定的变换,使其更适合其所要使用的传输信道。通常要考虑如下因素:

  1. 带宽利用率要高

没有哪种信道编码可以100%利用信道的传输资源,但是要尽量减少信道编码的开销。

  1. 时钟信息传输要可靠

为了便于接收端的时钟恢复电路,必须充分传递时钟信息(控制连续的0和连续的1的个数)。

  1. 数据分割和对齐的方法

字节的划分、信道间的数据对齐等

  1. 具有一定的抗干扰能力

误码检测、误码纠错等

  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编码表

  1. 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.2411000             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.0700111             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的码字。 这样做,主要是因为码字000111111000的前后边界都是30/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个基本原则:

  1. RD为“-”时,表示前面的码流中0比较多,因此RD-的码字中,1要比0多。同理,当RD为“+”时,码字中的0要比1多。
  2. 使用的码字中,尽量避免的连续的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.17D.18D.20D.11D.13D.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值

编码过程:

  1. 初始RD=-1
  2. 输入一个要编码的原始8bit码字,和一个控制码 z (z用来表示是D码码,还是K码)
  3. 将码字拆分成高3bit(HGF) 和 低5bit(EDCBA)。
  4. 依据控制z bit,决定使用D码表,还是K码表
  5. 根据当前RD、和5bit码,编码(查表)得到6bit 码字(abcdei)。
  6. 根据编码后码字(abcdei),计算当前的disparity值(-2/0/+2)。
  7. 根据当前RD和disparity值,得出新的RD值。
  8. 依据新的RD,和3bit(HGF),以及选择后的码表(D码或K码),编码(查表)得到4bit码字(fghj)
  9. 根据编码后的码字(fghj),计算当前的disparity值(-2/0/+2)。
  10. 根据当前RD和disparity值,得出本次编码的RD值。
  11. 将编码后的jhgfiedcba,从最低bit逐bit发送,发送顺序:

a,b,c,d,e,I,f,g,h,j

  1. RD= 上一次编码后的RD值,
  2. 重复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

从上表可以理解到:

  1. 仅有K28.5中包含5个连续的0/1,因此用作comma(逗号码),作为串行序列的bit位检测标识,区分symbol。K28.5可以定期或者不定期地插入到码流中的任何部分,作用类似于帧同步信号,接收方收到后,需要从码流中将其去掉。
  2. K28.0(skip):在多个lane时,用以填充空闲的lane,以达到各个lane之间的字节对齐。

  • 8
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值