案例介绍

8b/10b编码

作者[Author]:Hongjiang Yu 验证[Verified]:FPGA 浏览次数 [Views]:1360
字体大小 [Fonts]: 14px 16px 18px

概要[Abstract]

    8b/10b编码是一种可以保证DC平衡的编码机制,即通过这种编码机制,8位的数据变成了10位,但是数据流中的“0”和“1”基本保持平衡。8b/10b编码是目前许多高速串行总线中的编码机制,如USB3.01934bSerial ATAPCI ExpressInfini-bandFibre ChannelRapidIO等总线或者网络。

    本设计中,将8b/10b转换分为两步实现,第一步将低五位变成六位,第二步将高三位变为四位,即5b/6b转换和3b/4b转换。为表述方便,将八位数据HGFEDCBA记为D.x.y,其中x代表低五位EDCBA对应的十进制数,y代表高三位HGF对应的十进制数。在转换过程中,利用极性偏差(running disparity,RD[注:RD只能为-1+1]来控制数据流的DC平衡,给定初始的RD=-1(也可以为+1),在5b/6b转换之后根据6b数据的不均等性(disparity[注:不均等性即“1”和“0”的个数差值]来决定输出的RD,输出的RD值进一步决定3b/4b的译码方式,而4b数据的不均等性又决定输出的RD值,然后输出的RD又作为下一个8b/10b转换的初始RD值,RD值和数据转换的关系如下图所示:

                  1.png

 

对于RD的值,按下表的规则来确定:

                  rd.jpg

可以很简单的理解该表:当6b或者4b的数据中“0”和“1”个数相等时,RD保持不变,当“0”和“1”个数不相等时,RD变值。

 

5b/6b的编码规则如下:

                  5b6b.jpg

3b4b编码的规则如下:

                                   3b4b.jpg

其中8b数据HGFEDCBA的低五位经过5b/6b编码将EDCBA编码成abcdei,高三位HGF经过3b/4b编码成fghj,最终形成10b数据abcdeifghj.

数据编码时分为一般代码和控制代码,一般代码的前缀为“D”,控制代码的前缀为“K”,对于8b的低五位为28的数据,利用K.28.y进行编码,当x=23,27,29,30y=7时,也利用K.x.7进行编码,其他均按一般代码的编码规则编码,即控制码组如下:

                                                   control.jpg 

除此之外,在一般代码的编码规则中,只有D.x.7的编码情况比较特殊,分为D.x.A7D.x.P7D.x.A7用在当x=17,18,20RD=-1或者当x=11,13,14RD=+1时,其他的D.x.7全按照D.x.P7方式进行编码。

这些不一样的编码方式都是为了尽量保证编码中的“0”和“1”的平衡。

    

    在我的设计中,利用两个不一样的时钟信号触发编码过程,两个时钟信号如下:

           clk.png 

 

利用两个时钟编码原因是:在一个8b数据转换中,5b/6b转换和3b/4b转换及输出的RDRD1)赋值给输入的RD(RD2)[注:这是为了给下一个8b/10b转换赋初始RD]需要在不同的时刻完成(为了避免数据的竞争而出现错误)。

两个时钟clkclk1均是周期为4ns的时钟信号,只不过clk1clk延迟了1ns,在clk的上升沿时,完成5b/6b的转换,在clk1的上升沿时,完成3b/4b的转换,在clk的下降沿时,完成输出的RD1对输入的RD2的赋值以及输出10b数据。

在本设计中,一共分为五个小模块:atoal(8b数据的低五位)atoah(8b数据的高三位)fivesixtransform(5b/6b转换)threefourtransform(3b/4b转换)以及blbhtob(输出10b

数据),在设计中,为了表示简单,将RD设置成一位的数据,其值有“0”和“1”,故用“0”表示RD=-1,用“1”表示RD=+1

需要注意的是,每一个8b数据的输入要在clk为低电平时完成,否者就会造成数据丢失。

在验证过程中,输入值依次取a=11110001,11101011,00011100,11111101,00000000;

    预期结果分析如下:

10001RD=-1)——100011RD=-1),111RD=-1)——0111RD=+1) 输出:1000110111

01011RD=+1)——110100RD=+1),111RD=+1)——1000RD=-1)输出:1101001000

11100RD=-1)——001111RD=+1),000RD=+1)——0100RD=-1)输出:0011110100

11101RD=-1)——101110RD=+1),111RD=+1)——1000RD=-1)输出:1011101000

00000RD=-1)——100111RD=+1),000RD=+1)——0100RD=-1)输出:1001110100

    运行结果如下:

运行结果.png

输出结果依次为:2371000110111)、3481101001000)、F40011110100)、2E81011101000)、2741001110100

    运行结果与预期分析结果一致,且6b4b数据以及RD也与分析结果一致。

 


 
Copyright © Robei | | 鲁ICP备14018662号 |