zoukankan      html  css  js  c++  java
  • 8B10B编码详解

    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编码是将一组连续的8位数据分解成两组数据,一组3位,一组5位,经过编码后分别成为一组4位的代码和一组6位的代码,从而组成一组10位的数据发送出去。相反,解码是将1组10位的输入数据经过变换得到8位数据位。数据值可以统一的表示为DX.Y或KX.Y,其中D表示为数据代码,K表示为特殊的命令代码,X表示输入的原始数据的低5位EDCBA,Y 表示输入的原始数据的高3位HGF。

     

      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
    2.有6个0和4个1
    3.有4个0和6个1
        这样引出了一个新术语“不均等性(Disparity)”,就是1的位数和0的位数的差值,根据上面3种情况就有对应的3个Disparity 0、-2、+2。

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

    例如一个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是它的初始化状态。下面我们来看一张表来加深理解:

    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序列不允许被同时使用,它将导致不可探测的逗号序列。

    原帖见于:http://blog.sina.com.cn/s/blog_3e28c8a50100bq2b.html

  • 相关阅读:
    Eclipse 远程调试
    大数据处理方法bloom filter
    sicily 1259 Sum of Consecutive Primes
    sicily 1240. Faulty Odometer
    sicily 1152 简单马周游 深度优先搜索及回溯算法
    sicily 1050 深度优先搜索解题
    sicily 1024 邻接矩阵与深度优先搜索解题
    sicily 1156 二叉树的遍历 前序遍历,递归,集合操作
    sicily 1443 队列基本操作
    sicily 1006 team rankings 枚举解题
  • 原文地址:https://www.cnblogs.com/church/p/2614718.html
Copyright © 2011-2022 走看看