原创 【博客大赛】8B10B编解码及FPGA实现

2013-10-8 17:36 11734 12 11 分类: FPGA/CPLD 文集: ALTERA FPGA

8B10B编解码及FPGA实现

王敏志

概述

         在使用ALTERA的高速串行接口时,GXB模块里硬件实现了8B10B编码,用户只是“傻瓜”式的使用,笔者也一直没有弄清楚。网上搜索了一些学习资料,结合参考文献希望能够对其进行消化。另外,ALTERA现在已经提供8B10B IP,用户可以直接使用,不过有时候为了代码可移植性需要自己写代码实现8B10B编解码,笔者希望在这方面也做些实践。

8B10B编码概念

         基本概念网上可以轻易找到答案,简单的说就是将8bit数据转换成10bit数据,显然这个转换过程有20%的开销,大部分公开资料提出8B10B编码的开销是25%,我同意开销大于20%,因为码流中必然存在一些控制码,但是为何是25%而不是24%或者26%呢?

         为什么要使用8B10B编码呢?是因为8B10B编码的特性之一就是保证直流平衡,即编码后二进制数据流中“0”和“1”的数量基本保持一致,因为我们知道当高速串行流的逻辑1和逻辑0有多个位没有产生变化时(即所谓的长连0和长连1),信号的转换就会因为电压位阶的关系而造成信号错误,直流平衡最大好处就是可以克服这个问题。

         8B10B编码是怎么做到DC平衡的呢?转换的时候,连续的“0”或者“1”数量不超过5位,即每5个连续的“0”或者“1”后必须插入一位“1”或者“0”,从而保证信号DC平衡。这样可以保证串行数据可以在接收端被正确复原,同时利用一些特殊代码(K码)也可以帮助接收端进行复原工作,且可以在早期发现数据位传输错误,抑制错误继续发生。

         通过以上解释,那么一个8bit的二进制位流,变成10bit后,10B01的位数只可能出现下面3种可能情况:

{C}l  5051

{C}l  6041

{C}l  4061

这样就引出一个新的名词“不均等性”,即Disparity。就是1的位数和0的位数的差值,根据上述3种情况,那么就有3Disparity,即0-2+2

8B10B编码工作原理

  delta t.jpg

18B10B编码器逻辑设计原理框图

         如图1所示,8bitHGFEDCBAHMSBALSB)原始数据会被分成两部分,低5bit进行5B6B编码,高3bit则进行3B4B编码,这已成约定俗成的标准,所以8bit数据(0255)也被表示为Dx.y的形式,其中x就是低5bit对应的十进制数值,而y就是高3bit对应的十进制数值。例如8bit数“101 10101”,即十进制数181,这时候按照上述划分原则x=1010121),y=1015),所示这个数被表示为D21.5。这叫Code Notation

Running Disparity

         Running Disparity缩写成RD,有正和负之分,即RD+RD-。有时候也认为RD- = -1RD+ = +1,所以Running Disparity只有两种状态,而-1是其初始状态。根据上述“不均等性”定义,8-Bit码有3Disparity,那么又是如何计算出Running Disparity呢?

         根据参考[1]的描述,如果每个5B6B3B4B码中“1”和“0”的数目不相等,那么就有两种码流可能来进行传输,一种是“1”比“0”多2个,另外一种就是直接取反从而“1”比“0”少2个。到底采取哪一种,编码原则根据当前的Running Disparity信号(也即图1中的RD in)来选择。很明显,当5B6B3B4B码中“1”和“0”的数目相等的时候,由于Disparity没有改变,所以这里似乎没有选择。但是这时候的编码原则如下:

{C}l  如果6-Bit子块为“000111”,那么6-Bit子块结束RD为正

{C}l  如果4-Bit子块为“0011”,那么4-Bit子块结束RD为正

{C}l 如果6-Bit子块为“111000”,那么6-Bit子块结束RD为负

{C}l  如果4-Bit子块为“1100”,那么4-Bit子块结束RD为负

总的计算Running Disparity的原则如图2所示:

 

delta t.jpg

2:计算Running Disparity规则

需要注意的是ALTERA高速接口里8B10B模块的Running Disparity是基于10bit的子块计算出来的。10B被分为2块,一个6bit子块(abcdei)和一个4bit子块(fghj),如图3所示。

 

delta t.jpg

310-Bit Grouping of 6-Bit & 4-Bit Sub-Blocks

         6-Bit子块的起始Running Disparity等于上一个10-Bit码的结尾Running Disparity。而4-Bit子块的Running Disparity等于6-Bit子块结尾的Running Disparity4-Bit子块结尾的Running Disparity等于10-Bit码的Running Disparity。如图4所示。

 

delta t.jpg

4Running Disparity between Sub-Blocks

         ALTERA给出的计算Running Disparity规则如下所示(如果条件不符合,那么子块结尾的Running Disparity与子块开头的一样),与上述参考[1]的内容相符,注意和图2比较。

{C}l  满足下列条件,子块结尾的当前Running Disparity为正

{C}n  子块中“1”比“0”多

{C}n  6-Bit子块为6’b000111

{C}n  4-Bit子块为4’b0011

{C}l  满足下列条件,子块结尾的当前Running Disparity为负

{C}n  子块中“1”比“0”少

{C}n  6-Bit子块为6’b111000

{C}n  4-Bit子块为4’b1100

数据编码表

         参考[1]8B10B数据码表分成两部分,即5B6B码和3B4B码表。

 

delta t.jpg

55B6B数据码表

 

delta t.jpg

63B4B数据码表

D.x.7有两种选择(即初始码D.x.P7或者可选码D.x.A7),编码器根据与5B6B编码组合是否产生5个连续“1”或者“0”来选择对应的码。序列中如果出现5个相同的位,使用逗号码(comma code)来进行同步。当RD=-1的时候,只有x=17x=18x=20时使用D.x.A7。当RD=+1的时候,只有x=11x=13x=14是才使用D.x.A7。当x=23x=27x=29x=30时控制码K.x.7也使用A7这个码型。其他任何K码都不能使用x.A7码型,否则会有可能导致序列中逗号码对不齐(即导致逗号码漏检)。

只有K.28.1K.28.5K.28.7可以作为“comma”码,因为控制码K.x.y的可选编码使得其Disparity0,而且数据bit流中找不到这种编码。

控制码表

 

delta t.jpg

7:控制码

在控制代码中,K.28.1 K.28.5 K.28.7 是逗号序列,逗号序列是用来同步的(即用来8B10B比特流字节对齐),如果K.28.7没有被使用,序列0011111 或者 1100000 是不会出现在任何数据编码中的。

如果K.28.7被用于实际编码,一种比中提到的更复杂的同步码型需要被定义使用。组合成K.28.7的码与其它码容易组合成其它的逗号码,两个相邻码就有可能变成相交码,从而导致对齐错误。在任何情况下多个K.28.7序列不允许被同时使用,它将导致不可测的误对齐逗号序列。

所谓控制码,是比特流中的10B没有对应的8B数据字节,通俗讲就是这些码不属于上述图5和图6组合成的数据中。这些码用于底层控制功能。ALTERAGXB链接建立之前一般都要发IDLE码,链接建立以后对了使得接收端能对齐数据字节边界还要在发数据的同时发送一些控制码,一般都是发送K28.5(即十六进制的BC)。

         另外,下面这句话应该如何理解:

K.28.7 is the only comma symbol that cannot be the result of a single bit error in the data stream.

FPGA中实现8B10B编解码

         ALTERA不但提供8B10BIP,而且还提供Verilog编写的8B10B源代码。图8是一个具体应用,将数据先进行8B10B编码,然后并转传输出。

 

delta t.jpg

8:应用实例

分析及结论

深入了解了什么8B10B编码,解码的过程与编码相逆,通过ALTERA提供源代码可以进一步学习解码的具体过程。

 

参考

[1] Stratix GX Device Handbook

[2] http://en.wikipedia.org/wiki/8B10B

 

 

PARTNER CONTENT

文章评论9条评论)

登录后参与讨论

用户1069018 2015-9-28 16:55

谢谢分享

coyoo 2014-4-3 20:18

1、32x156.25还要加上8b10b编码开销; 2、100M还是125M都没有关系,GXB内部有PLL; 3、外部给的20M是否可行,需要看PLL的限制 4、altgx和alt2gxb是一个东西,只是为了区别以前的GXB

用户1739054 2014-4-3 17:38

我刚开始用这个口,32乘以156.25=5000,不等于6250.还有就是我那个设置的是100mhz,而实际上我外部给的20mhz的频率,也正常收发,是不是正常。还有就是stratix 4怎么没有alt2gxb而是altgx,他们是一个东西吗?我用的是quartus 9.0 。alt2gxb是灰的

coyoo 2014-4-3 17:13

速率和时钟当然有一定的关系。其实你可以只设置时钟,或只设置数据率,工具会自动设置另外一个。前提是设置的参数要符合要求以及与实际情况相符。一般发一个即可;但是为什么不多发几个呢,也不会占用多少带宽。

用户1739054 2014-4-3 15:11

GXB频率问题:您的书中说通道选择为1,位宽为32bit,输入时钟156.25hz,并设置速率为6250 Mbps,设置速率和时钟速率等有什么关系,有计算公式吗?控制字在发送过程中需要连续发送多个吗?

coyoo 2014-4-2 15:21

没错,在例化IP的时候会指定使用什么控制码

用户1739054 2014-4-2 15:04

比如说选了k28.5或者K27.7,我们就需要将其对应的16进制数据首先来逻辑里进行发送或者接收,接受完这些数据之后ip便会配置成功然后进行收发我们的自己的数据。您在书中控制符bc和fb然后再是自己的数据。

coyoo 2014-4-2 14:54

同步码在basic模式下需要自己发

用户1739054 2014-4-2 14:00

GXB接口怎么用,k28.5和k27.7是怎么使用的?那些同步码是ip自动发送还是我们在逻辑里发送。不明白其中的道理。
相关推荐阅读
coyoo 2024-12-25 14:13
ALTERA Cyclone 10器件的使用-8:特定的上电顺序
概述 Intel 要求用户为其10代FPGA器件使用特定的上电和掉电顺序,这就要求用户在进行FPGA硬件设计的时候必须选择恰当的FPGA供电方案,并合理控制完整的供电上电顺序。经过在Cyclone 1...
coyoo 2024-12-22 11:46
AD9218子板在新处理板上表现的问题
概述 新的数据处理板融合了数字和数据处理功能模块,计划采用ADI的4通道串行ADC芯片代替之前的并行ADC。由于初次使用,所以初次设计时预留了AD9218的子板的插槽。 在调试AD9633功能的同时并...
coyoo 2024-12-14 17:15
在Cyclone 10 GX器件上实现高精度TDC探索
概述 Cyclone 10 GX器件的ALM结构与Cyclone V类似,所以在Cyclone 10 GX器件上实现TDC功能理论上是可以完全参考甚至移植自Cyclone V系列的成功案例。但是,现实...
coyoo 2024-12-10 13:28
Cyclone V GX FPGA设计TDC的优化问题
概述 通过前面的研究学习,已经可以在CycloneVGX器件中成功实现完整的TDC(或者说完整的TDL,即延时线),测试结果也比较满足,解决了超大BIN尺寸以及大量0尺寸BIN的问题,但是还是存在一些...
coyoo 2024-12-03 12:20
比较器检测模拟脉冲说明(四)
概述 说明(三)探讨的是比较器一般带有滞回(Hysteresis)功能,为了解决输入信号转换速率不够的问题。前文还提到,即便使能滞回(Hysteresis)功能,还是无法解决SiPM读出测试系统需要解...
coyoo 2024-11-16 13:54
不同ADC采样同一前端模拟信号时转换用时差异分析
概述 同一组前端模拟信号接入由不同型号ADC组成的模数转换电路时,采样后在FPGA中发现采样用时差异较大。本文主要分析这个时间差异形成的原因,并记录该差异产生对系统造成的影响。系统数字化简介 项目前端...
EE直播间
更多
我要评论
9
12
关闭 站长推荐上一条 /3 下一条