#PCIE# 8b/10b 编码

 

前言

8B/10B,也叫做8字节/10字节或8B10B。8B/10B方式最初由IBM公司于1983年发明并应用于ESCON(200M互连系统),由Al Widmer和Peter Franaszek在IBM的刊物“研究与开发”发表。

一、基本知识

8b/10b编码的特性之一是保证DC 平衡。

采用8b/10b编码方式,可使得发送的“0”、“1”数量保持基本一致,连续的“1”或“0”不超过5位,即每5个连续的“1”或“0”后必须插入一位“0”或“1”,从而保证信号DC平衡,它就是说,在链路超时时不致发生DC失调。通过8b/10b编码,可以保证传输的数据串在接收端能够被正确复原,除此之外,利用一些特殊的代码( 在PCI-Express总线中为K码) ,可以帮助接收端进行还原的工作,并且可以在早期发现数据位的传输错误,抑制错误继续发生。

8b/10b编码是目前许多高速串行总线采用的编码机制,如 USB3.0、1394b、Serial ATA、PCI Express、Infini-band、Fiber Channel、RapidIO等总线或网络等。

8B/10B编码是目前高速串行通信中经常用到的一种编码方式。直观的理解就是把8bit数据编码成10bit来传输,为什么要引入这种机制呢?其根本目的是“直流平衡(DC Balance)”。当高速串行流的逻辑1或逻辑0有多个位没有产生变化时,信号的转换就会因为电压位阶的关系而造成信号错误,直流平衡的最大好处便是可以克服以上问题。
将8bit编码成10bit后,10B中0和1的位数只可能出现3种情况:
1.有5个0和5个1  ;  // Disparity  = 0 ; (不均等性)
2.有6个0和4个1 ; //  Disparity  = +2 ;(计算规则:0的个数减去1的个数。而RD(极性偏差或者运行不一致) ,如果1的个数比0多,那么是RD = +1;如果0的个数比1多,那么是RD= -1。此外,这里,6个0 并不是说会出现0000001111或者1111110000 这样的序列, 因为这样的序列已经被剔除出去。但是可以出现1010001001这样的,6个0和4个1的序列。连续5个0(0000011111、0000010111等)和5个1(1111100000)的序列,只有在控制码中存在
3.有4个0和6个1  ;  // Disparity  = -2 ;
这样引出了一个新术语“不均等性(Disparity)”,就是1的位数和0的位数的差值,根据上面3种情况就有对应的3个Disparity 0、-2、+2。

二、工作原理

1.原理讲解

8bit原始数据会分成两部分,其低5位会进行5B/6B编码,高3位则进行3B/4B编码,这两种映射关系在当时已经成为了一个标准化的表格。人们喜欢把8bit数据表示成Dx.y的形式,其x=5LSB(least significant bit最低有效位),y=3MSB(most significant bit最高有效位)。

8b/10b编码是将一组连续的8位数据分解成两组数据,一组3位,一组5位,经过编码后分别成为一组4位的代码和一组6位的代码,从而组成一组10位的数据发送出去。相反,解码是将1组10位的输入数据经过变换得到8位数据位。

数据值可以统一的表示为DX.Y或KX.Y:

其中D表示为数据代码,

K表示为特殊的命令代码,

X表示输入的原始数据的低5位EDCBA,

Y 表示输入的原始数据的高3位HGF。

例如一个8bit数据101 10101,x=10101(21) y=101(5),现在我们就把这8bit数据写成D21.5,明白了吧!
Dx.y形式在进行5B/6B和3B/4B编码中表示更直观,下面我们来看看两张编码表:
对于8bit数据,它在表中的位序为HGFEDCBA,即H为最高位,A为最低位,EDCBA经过5B/6B编码为abcdei,HGF经过3B/4B编码为fghj。传送10bit编码的顺序为abcdeifghj。

8B/10B编码 <wbr>详解zz

† 3B/4B使用K.x.7

8B/10B编码 <wbr>详解zz
† 对于D.x.7,当和5B/6B组合时D.x.P7和D.x.A7编码必须选择一个来避免连续的5个0或1。遇上连续5个0或1的情况下使用“逗号码”来进行校准。D.x.A7用在x=17 x=18 x=20当RD=-1时,x=11 x=13 x=14 当RD=+1时。当x=23 x=27 x=29 x=30时,使用K.x.7进行编码。其他情况下x.A7码不能被使用,他将会导致和其他“逗号序列”产生冲突。
‡ 候补编码K.x.y允许K.28.1 K.28.5 K.28.7作为“逗号码”来保证数据流中的唯一性。

   你们也许注意到了表中有个RD标志,它是Running Disparity的缩写,它的目的就是保持8B/10B编码中的直流平衡。它跟上面提到的Disparity其实是一样的意思,+1用来表示1比0多,-1用来表示0比1多,-1是它的初始化状态。下面我们来看一张表来加深理解:

RD的全称为RunningDisparity,简称为RD,由于数据流不断从发送端向接收端传输,前面已发送数据的不一致性累积产生的状态称为“运行不一致”,RD会出现“+1”和“-1”两种状态,“+1”表示正极性,即位“1”比位“0”多;“-1”表示负极性,即位“0”比位“1”多,当前RD计算方式为:

RD = Number(1) – Number(0) + Number(past)

RD的初始值为“-1”,下一状态RD的值依赖于当前的RD值以及当前6B或者4B码的极性,根据当前RD的值,决定5b/6b,3b/4b的映射方式。

8B/10B编码 <wbr>详解zz

上面我们提到的“逗号码”和“逗号序列”,其实都是当初在规划8B/10B编码机制的时候,所谓的控制代码(Control Characters)的其中之一。8B/10B标准中使用了12个特殊的控制代码,他们能在数据中被发送,还可以组合成各种“原语”。

8B/10B编码 <wbr>详解zz

† 在控制代码中,K.28.1 K.28.5 K.28.7 是逗号序列,逗号序列是用来校准用的,如果K.28.7没有被使用,序列0011111 或者 1100000 是不会出现在任何编码中的。
‡ 在实际编码中如果K.28.7可以被使用,一种更复杂的校准规范需要†被使用,它们能组合成各种“原语”,在任何情况下多个K.28.7序列不允许被同时使用,它将导致不可探测的逗号序列。

 

当CurrentRD==-1时,表示之前传输的数据中“0”的个数多于“1”的个数.

经过8b/10b编码后,连续的“1”和“0”的个数基本上不会超过5bit只有在使用K码时,才会出现连续的5个0或1


总结

 

  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Aurora 8b/10b是一种序列化器/解序列化器(SerDes)的数据传输编码方式,用于高速串行数据通信。它广泛应用于各种通信标准和协议中,如PCI Express(PCIe)、Gigabit Ethernet(GbE)等。下面我将详细介绍一下Aurora 8b/10b的工作原理。 Aurora 8b/10b是一种差分编码方式,将每8个输入比特(bits)映射为一个10比特的输出码字。这里的8b表示每个代码组由8个输入比特组成,10b表示每个输出码字由10个比特组成。 Aurora 8b/10b编码过程如下:首先,对于输入的每个8比特数据,会通过特定的编码表将其转换为对应的10比特输出码字。编码表的作用是保证输出的码字具有特定的性质,比如保持DC平衡、时钟恢复等。然后,将编码后的输出码字通过差分解调器进行差分编码,增强了其抗干扰性能。 解码过程正好相反。首先,通过差分解调器还原出编码前的差分信号,然后,根据编码表将差分信号还原为相应的8比特数据。 Aurora 8b/10b的主要优点是具有较好的抗噪性、抗失配性和时钟恢复特性。其中,抗噪性指的是它能够有效地抵抗噪声干扰,提高数据传输的可靠性;抗失配性指的是它能够自适应地调整串行数据的时钟相位,以适应信道失配等问题;时钟恢复特性指的是它能够从接收端的数据中提取出正确的时钟信号,实现数据的正确解析。 总结来说,Aurora 8b/10b是一种高速串行数据传输编码方式,通过特定的编码和解码工作方式,能够有效地提高数据传输的可靠性和抗干扰能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

那么菜

你的鼓励和批评是我最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值