总线技术|接口技术
400万+工程师在用
400万+工程师在用

xiaowind

12年用户 39经验值
私信 关注

[讨论]有兴趣的来讨论:光线传输的8B/10B encoding

2008-7-18 09:27

<font face="宋体" color="#000000">不知道大家对这个有没有兴趣,可以来讨论一下<br/>我暂时对这个还不了解,先看看哈</font>
[此贴子已经被admin于2008-7-18 13:08:55编辑过]

回帖(5)

电子发烧友网工程师

2008-7-18 13:10:28
<p><span class="highLight" id="ctl00_MasterContentPlaceHolder_AbstractLabel" title="8B/10B直流平衡编码是一种高性能的串行数据编码,也是光纤通道的一个重要组成部分.BB/10B编码由5B/6B编码和3B/4B编码2部分组成,本文以Disparity和RD(Run Disparity)属性为主线实现模块划分和算法优化.编码模块实际上是一个以Disparity为主线的查找表实现.解码模块分为有效性检测、特殊码解码、有效数据码解码以及RD计算和验证4个部分,并且采用流水线的方式实现.整个设计方案均以VHDL实现,并在QUARTUS-114.0和Modelsim上进行综合和验证,结果表明该设计方法能够充分满足光纤通道的高速数据传输性能.">8B/10B直流平衡编码是一种高性能的串行数据编码,也是光纤通道的一个重要组成部分.BB/10B编码由5B/6B编码和3B/4B编码2部分组成,本文以Disparity和RD(Run Disparity)属性为主线实现模块划分和算法优化.编码模块实际上是一个以Disparity为主线的查找表实现.解码模块分为有效性检测、特殊码解码、有效数据码解码以及RD计算和验证4个部分,并且采用流水线的方式实现.整个设计方案均以VHDL实现,并在QUARTUS-114.0和Modelsim上进行综合和验证,结果表明该设计方法能够充分满足光纤通道的高速数据传输性能.</span> <br/></p>
<p>1 引言 <br/>8B/10B平衡直流编码是光纤通道的一个重要组成部分,也是目前许多高速串行总线(如Serial ATA、PCI Express)采用的编码方式。8B/10B 编码方式是由IBM 公司的A.X.Widmer 和P.A.Franaszek 在上世纪80年代初期提出的,这一卓越的编码方式现在则成为主流传输标准选用的编码技术,也为高速局域网以及计算机链接传输带来了新的飞跃。本文以8B/10B编码方式的Disparity、Run Disparity为核心,进行分析和讨论整个编解码模块的设计方案。最后以仿真结果为依据进一步证实该编解码方案的可行性和正确性。 <br/>2 8B/10B编码 <br/>8B/10B编码作为一种高性能的串行数据编码方式,其基本精神就是将8位码字经过映射机制(Mapping Rule)转化为10位的码字,但是平衡了位流中0与1的数量。8B/10B编码有三个重要概念,Run Length、Disparity和Run Disparity。未编码的数据由一个字节的数据和一个符号位组成,字节数据用ABCDEFGH(H为MSB)表示,符号位用Z表示。每个数据都有一个即定的名字Zxx.y,其中Z 为D 或K,xx 为EDCBA 的十进制值,y 为HGF 的十进制值。符号位Z的 D和K两种取值分别表示有效数据和特殊码,有效数据有256种而特殊码只有12种。 <br/>Run Length就是数据流当中0或1的最大连续个数,如0100111101当中的Run Length为4。在8B/10B编码当中规定有效传输码的Run Length最大值不能超过5,其中有效数据字(valid data character)的Run Length最大值不能超过4。 <br/>Disparity是指数据流中“1”的个数和“0”的个数差。8B/10B编码当中所有10位有效传输码的Disparity只有三中情况,既为-2、0和+2,并且若用jhgfiedcba表示有效传输码(j为MSB),高4位和低6位也都分别满足Disparity只有-2、0和+2三种取值的属性。 <br/>Run Disparity(RD)是一种编码参数,有正负两种取值,在编码过程中“1”表示“正”而“0”表示“负”。RD在整个编码方式中起桥梁作用、承接着5B/6B编码和3B/4B编码。这里必须要指出的是Disparity和Run Disparity是两个完全不同的概念。RD计算的具体规则如下: <br/>1 若是系统上电或是复位则RD为负,即RD的系统默认值是负的 <br/>2 前一个3B/4B编码所生成的RD作为下一个5B/6B编码的控制位,反之亦然。但是一个字节编码生成的RD是3B/4B编码后所生成RD决定的。如图1所示。 <br/><br/>图 1 RD <br/>图中高6位和低4位数据间隐含着一个RD值,它用于紧跟着的3B/4B编码,同样3B/4B生成的RD将用于下个数据字节的编码。 <br/>3 RD计算细则: <br/>① 如果编码后的任意一个子模块的Disparity大于零则RD(编码后)为正;若为6位模块当其为000111时RD也为正,若为4位模块当其为0011时RD亦为正。 <br/>② 如果编码后的任意一个子模块的Disparity小于零则RD(编码后)为负;若为6位模块当其为111000时RD也为负,若为4位模块当其为1100时RD亦为负。 <br/>③ 否则,任意Disparity为零的子模块所生成的RD和其前面紧挨着的模块之RD相同。 <br/>3 编码方案 <br/>8B/10B编码分为有效数据字节编码和特殊码编码两部分,而有效数据字节编码又可以分为5B/6B编码和3B/4B编码。 <br/>⑴ 有效数据编码 <br/>数据编码分为5B/6B编码和3B/4B编码两部分,然后将两部分生成的结果合成10位传输码。编码表1和2分别表示5B/6B编码和3B/4B编码。 <br/>⒈ 5B/6B编码 <br/>8B/10B编码本身的直流平衡特性决定了其编解码的规律性。对于表2中的数据编码我们可以利用EDCBA的Disparity属性进行归类,比如i与RD(编码前)、EDCBA与edcba有某种对应关系,当然有部分数据编码我们必须采用查找表的方式进行实现。根据Disparity属性进行编码的另一个好处就是能够将RD计算和数据编码结合起来实现。具体实现时,首先假设当前的RD属性为“负”,即以RD为负所对应的编码结果为基准,若实际的RD为“正”,那么我们再进行修正(位取反),修正过程中也依据Disparity的值进行,如图2所示。 <br/><br/>图 2 5B/6B编码流程图 <br/>表 1 5B/6B编码表 <br/><br/>表 2 3B/4B编码表 <br/><br/>⒉ 3B/4B编码 <br/>在表4中看到,3B/4B编码数据量较少,我们可以直接利用查找表进行编码。另外由于扇入较少,也可以用卡诺图进行化简求得jhgf各自的表达式。但实际文章中还是采用了查找表方式进行编码。整个编码结构框图如图3所示。 <br/><br/>图3 有效数据字节编码框图 <br/>⑵ 特殊码编码 <br/>特殊码只有十二种是有效的,所以编码时直接利用查找表实现,但编码时必须添加一个错误码检测环节。另外需要指出的是为了在数据传输时保持位流平衡,错误码也当作有效数据编码规则进行编码。 <br/>⑶ 8B/10B编码表 <br/>图 4 编码列表 <br/><br/>4 解码方案 <br/>8B/10B解码的难点是在1024个数据当中区分有效数据字(valid data character)、特殊字(special character)和错误字(invalid character)。在1024个数据当中,24个为特殊字,440个为有效数据字,而其他560个均为错码。因此解码模块可以分成四个主要子模块,即为特殊字解码子模块、错误字检测子模块、有效数据字解码子模块和RD及RD_err计算子模块,用于完成译码、错误检测和Run Disparity计算等功能。 <br/>⑴ 错误检测 <br/>虽然光纤通道本身的误码率极低,但是在解码模块中错误的检测环节却是非常重要,它直接影响着解码模块的性能。当然解码电路这部分我们可以参考A.X.Widmer和P.A.Franaszek论文中的错误检测方案,但是这里我们介绍另外一种错误检测方案,但是这两种方案的本质都是相同的,就是利用其平衡直流及Disparity特性。我们根据8B/1O码本身的特点可以将560种无效码进行归类。我们把10位数据分成高四位(jhgf)和低六位(iedcba)两部分,而Disparity_4和Disparity_6分别代表它们的1和0的个数之差。Disparity_10表示10位数据1和0的个数之差。错误码字归类如下: <br/>⒈ a=b=c=d <br/>⒉ |Disparity_6|&gt;2或|Disparity_4|&gt;2或|Disparity_10|&gt;2 <br/>⒊ Disparity_6=-2时jhgf=“1110”或“1100” <br/>⒋ Disparity_6=+2时jhgf=“0001”或“0011” <br/>⒌ Disparity_6=0时 <br/>①i≠e 而jhgf=“0001”或“1110” <br/>②i=e且iedcba≠“000111”或“111000”:i=e=‘1’,jhgf=“0001”或“0111”;i=e=‘0’,jhgf=“1000”或“1110”。 <br/>③iedcba=“111000”,而disp_4&gt;0或jhgf=“0001”或“0011”;iedcba=“000111”而disp_4&lt;0或jhgf=“1110”或“1100”。 <br/>⒍ 此外还有未满足上述条件的,当iedcba=“111100”或“000011”剩下的4种错码。 <br/>这里需要指出的是上面的归类中把正确的一些10位特殊字也认为是错误码,但由于有效特殊字解码是独立的,因此最后可以根据特殊字标示位Z来确定最后结果,所以错误码检测分析不会有任何影响。从上面的分析可以看到,整个主线是Disparity的计算,而且这种分类查找实现起来也是非常方便、有效。具体实现时可进一步优化归类上述错误码字。 <br/>⑵ RD及RD_err计算 <br/>RD的计算和编码时候的规则相同。而对于RD_err计算是在假定该码字本身是有效码的前提下进行的,RD_err判断的主要依据是其是否与当前的RD相匹配。 <br/>⑶ 有效数据字及有效特殊字解码 <br/>有效数据字解码的实现跟编码模块相似,只是4位数据(高四位)解码可以直接利用卡诺图化简求出表达式。总之数据编解码当中是以disparity为主线,进行归类并且完成编解码。考虑到有效特殊字只有24种情况,因此我们在解码过程中直接利用LUT进行检测,并且把这部分放在解码模块的前端去处理。 <br/>图7给出了解码模块的基本结构框图。这里我们把有效特殊码解码和错误检测等一起并行处理并且放在前端,后端是有效数据字解码子模块。当然对于各个处理子模块的搭建需要根据实际系统的要求而定,如果速度要求是第一位的,我们就把关键路径做适当的调整,如三个子模块同时并发处理。下面是测试时使用的一种编码流程模式,实际上方案速度也是非常可观的。 <br/><br/>图 4 解码模块框图 <br/>⑷ 8B/10B解码表 <br/>表中最主要的信息是错误码的RD运算规则和当发生码字冲突(code violation)时对 RD_err如何进行计算。这里需要说明的时当发生码字冲突时其码本身可能没有发生错误,若发生错误也是突变为有效码字,因为我们假设码字冲突时解码依然正确。另外需要补充的是在该表中disp_10为0的有效数据字其解码后生成的RD(即表中的rdispout)需作个别修改:iedcba=“111000”或jhgf=“1100”,RD取“正”; iedcba=“000111”或jhgf=“0011”,RD取“负”。 <br/>表 5 解码列表 <br/><br/>5 仿真结果 <br/>整个编解码模块初步的功能时序仿真是在QuartusII 4.0上完成的,选择的是MAX II系列器件。因为第一阶段工作只是在FPGA上验证其功能和时序的正确性并达到一定的速度,只在最后ASIC设计时还要进一步综合、优化,为此我们这里没有给出具体路径的时序分析或是相关约束。但是我们的仿真结果验证了该方案的可行性和正确性。下面是我们在QuartusII 4.0上所得的仿真波形。仿真波形延迟一个时钟周期。 <br/><br/>图 5 编码模块波形仿真 <br/><br/>图 6 解码模块波形仿真 <br/>6 结论 <br/>本文以Disparity为主线介绍了一种8B/10B的编码方案,仿真结果很好的验证了该方案的可行性和正确性。它充分满足了光纤通道的高速数据传输性能。 </p>

xiaowind

2008-7-19 13:53:44
<p>嗯,说的太好了!<br/>其实说白了,8B/10B encoding就是一种编码方案,就是用来平衡高速传输的bit flow中1和0的数量。</p>

xiaowind

2008-7-19 13:54:54
要是上面的图和波形仿真能看到就好了..

xiaowind_me

2008-7-29 14:47:53
<font style="BACKGROUND-COLOR: #ffffff" face="Verdana">EDCBA&nbsp;&nbsp;----&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rd+&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; rd-<br/>00000&nbsp;&nbsp;&nbsp;----&nbsp;&nbsp;011000 &nbsp; 100111<br/>这个结果是怎么产生的呢?<br/>请指点!谢谢!<br/></font>

xiaowind_me

2008-7-29 15:02:51
<p>比如说:D11.7(EDh)该怎么编码呢?</p>
[此贴子已经被作者于2008-7-29 15:07:01编辑过]

更多回帖

打开APP