Menu Close

8b/10b编码基础知识详解

8b/10b 编码是当前用的最为广泛的线路编码(line code)编码方式,主要是解决直流平衡和时钟恢复。是一种优良的线性编码,有效解决了复杂度,直流平衡,时钟恢复与传输效率的平衡。

10 bits数据总共有1024种组合,因此10-bit编码中有大量的冗余,这就给了我们挑选空间,将不适合在网络线路上传输的编码丢弃(如10‘b00_0000_0000和10’b11_1111_1111等),留下比较好的编码(含有丰富边沿信息或直流相对平衡的编码),做到边沿信息丰富,直流在一定的时间内做到相对平衡,连续码源组合不会出现严重偏置现象。例如,原始数据如果有连续出现多个0的时候,采用源码通信线路出现直流不平衡,同时也丢失时钟信息。采用10b编码后为10’b10_0111_1011, 虽然该编码提供了足够的时钟信息,直流在本编码上有偏置(1的数量多于0的数量),考虑到通信的随机性(其它编码可能会0的数量多于1的数量),一般认为可能对通信线路的直流平衡影响不大,但对于长0来说,考虑到相邻编码的偏置一直保持,实际上这种偏置会随着时间累积。因此为了解决此类问题,8b/10b编码引入”运行非一致性”方法,做到在相对短时间(两个10-bit间隔)做到相对直流平衡,可见8b/10b不仅仅提供一个好的编码,在相对短时间内统计上也比4b/5b有更好直流特性。如图1所示,

%title插图%num

图1

要实现DC(direct current) 平衡,直观的想法是从1024个码中挑选出512种作为数据编码使用。在数据传输的编码中,将256个8bits数据映射到512种的组合中即可。其实8b/10b 编码做的更多。8b/10b编码将编码分割为两个部分,第一部分为5b/6b编码,第二部分为3b/4b编码,合在一起为8b到10b编码(发送部分),或10b/8b解码(接收部分)。目前在1G光纤以太网中以及广播电视数据传输中得到广泛应用。在其它非标通信中应用也极其广泛。

1. 5b/6b 编码

5b/6b编码将8 bits数据分成两个部分3b+5b. 5b为EDCBA为低5位。其中A为最低位。变换成6位abcdei.

表1

%title插图%num

表1中,RD为+1或-1决定数据的选择。-1选择左边一栏,+1选择右边一栏。同时会有K值的选择。有关RD和K值后续的内容会讲解。

 

2. 3b/4b编码

3b/4b 编码,将8 bits数据第二个部分3b。3b为HGF为高3位。其中H为高位,变换成fghj。

表2

%title插图%num

数据的编码范围为D.x.0-D.x.7,其中x为5b/6b中的编码,RD为+1或-1决定数据的选择。-1选择左边一栏,+1选择右边一栏。同时会有K值的选择。有关RD和K值后续的内容会讲解。5b/6b与3b/4b拼接组成8b/10b。

†至于 D.x.7,可以用基本的D.x.P7(P表示primary)或D.x.A7(A 为Alternate)主要目的是为了在与5b/6b组合时避免产生连续的5个1或5个0.

注意:部分K值却有不同的要求,K.28.1, K.28.5,  K.28.7 一般用做逗号(comma)使用,因此要求码字中有连续的5个1或5个0。

 

D.x.A7 只在下列情况下使用:

  • 当 RD = −1: 对于 x = 17,18 或 20 或当 RD = +1: for x = 11, 13 and 14, 选择D.x.A7 其它的数据编码选 D.x.P7。

 

3. 8b/10b K值编码

K值的编码与数据编码非常类似。K值总共12个编码,这些编码在数据传输过程中作为控制信息使用。1024个编码中的各种有用的组合少于512,其余的冗余编码在数据发送编码中不会使用。在接收中如果出现非编码表中的内容,则会只是通信过程中出现误码。RD为+1或-1决定数据的选择。-1选择左边一栏,+1选择右边一栏。

在实际使用中K.28.5,K.28.1,K.28.7定义为逗号序列,作为帧的分界,K.28.5多用于帧起始,k.28.1多用于帧结束。k.28.7用的相对较少。复杂协议中往往还配合具体的数值一起组成帧起始和结束。具体参照CPRI协议。K值的5b/6b编码部分如表3所示。

表3

%title插图%num

部分K值却是有意安排为5个1或5个0,便于在8b/10b编码时提供关键字(同步字)搜索。

当 x = 23,x = 27,x = 29,and x = 30,3b/4b 对于K.x.7 选 D.x.A7.其它选择D.x.P7.

‡  K.28.1, K.28.5,  K.28.7 一般用做逗号(comma)使用,因此要求码字中有连续的5个1或5个0,如图4加黑的部分。

 

4. RD 非一致性运行

运行非一致性(Run disparity), 是用来消除在通信线路中0,1的不平衡性。观察8b/10b的编码我们会发现,尽管采用了10 bits的编码,依然无法满足在一个字节的发送中保持0,1的个数相等。

  • RD编码运行原理与步骤。

(1) 维持一个变量RD,RD的初始值可以设为+1或-1,运行后,

(2)利用RD选择数据或K值,

      • 如果RD为 -1,则选择表中RD为-1对应的值(D或K),
      • 如果RD为+1,则选择表中RD为+1对应的值(D或K),

(3) RD值调整

      • 如果选择的10b中的数据0,1个数相等,则维持原RD的值不变
      • 如果RD为 -1,RD的值加2(RD=RD+2),结果RD=+1;
      • 如果RD为+1,RD的值减2(RD=RD-2),结果RD=-1 ;

(4)重复步骤(2)、步骤(3),在持续的数据传输中能维持直流动态平衡。

表4

%title插图%num

5. 8b/10b与4 b/5b 异同点比较

  • 相同点
    • 都是用在物理层(PHY)的编码变换,
    • 都能做到相对的直流平衡,
    • 除了正常的数据编码外,都能提供控制字符,作为信道的控制。如在网络通信中还可以实现物理层的数据包的开始,结束以及其它物理层的控制和状态信息的交换。
    • 具有相同的开销(20%),因此采用8b/10b,系统的效率降低20%
  • 不同点
    • 8b/10b由于编码空间增大,优良码字多于4b /5b,
    • 8b/10b在数据编码中避免了连续5个0或1,4b/5b不能避免该特性
    • 8b/10b利用连续5个0或1的码字作为K值用作逗号,一般用来控制帧起始或结束,4b/5b有类似的特性(如J,K等)但不如8b/10b优良。

6. 8b/10b编码例解

  • 输入 Bits: HGFEDCBA
  • 数据分割: HGF EDCBA
  • 换位: EDCBA HGF

例:求解Data = 8’b0011_1111的10b编码

Data = 8’b0011_1111

= 8’b001_11111

=> 8’b 11111 001P

= 31_1

E 8B = D31.1

RD = -1: 10b abcdei fghj = 101011 1001 新RD = +1

RD = +1 10b abcdei fghj = 010100 1001 新RD = -1

表5

%title插图%num

 

在下面的章节中提供了8b/10b的编码逻辑实现,以便于讲解,解码部分源代码没有在文章中提供但是在单独的文件中提供。 也可以用查找表的方式实现。

查找表的方式非常简单,维护一个5b/6b和3b/4b表就可以,但RD需要程序进行计算。

注:line code , 一般称为线路编码,线路码,传输码等,也是信道编码的一种。

练习题:利用FPGA ROM和COE文件设计8b/10b 与10b/8b编解码。用状态机实现ROM的读取及RD运算。注意D.x.P7于D.x.A7的区分使用。

 

Posted in FPGA, FPGA 教材教案, IC, 教材与教案, 文章

发表回复

相关链接