8B/10B编码是目前高速串行通信中经常用到的一种编码方式,其目的就是通过将一个字节宽度的数据经过映射机制转化为10位宽度的字符,来平衡位流中0与1的个数,也就是达到平衡直流的作用。由于直接将8bit数据编码成10bit来传输在实现上将占用芯片的大片物理面积,并且严重影响了数据的传输速率,所以目前大都采用将一串8位二进制数分为低5位和高3位,然后对低5位进行5B/6B编码,高3位进行3B/4B编码,最后再将6位和4位合在一起的编码方式。这样做不进减少了芯片占用面积,而且简化了编码,提高了数据的传输速率。
通常用字符HGFEDCBA来表示编码前的8位二进制数,则低5位就是EDCBA,高3位就是HGF。5B/6B编码后6位二进制数的表示方式为abcdei,而3B/4B编码后4位二进制数的表示方式为fghj,最后合成的10位二进制数为abcdeifghj。人们喜欢把8bit数据表示成Dx.y的形式,而控制代码用Kx.y的形式,其x=5LSB(least significant bit最低有效位),y=3MSB(most significant bit最高有效位)。它们之间的对应关系如图1所示。
MSB
LSB
8B/10B编码中有两个重要的概念,不均等性(disparity)和极性偏差(running disparity,RD)。前者表示‘1’和‘0’个数的差值,其有如下规律:
(1)若ABCDE 的Disparity 值为- 1, 那么在‘ RD- ’项中生成的abcde与ABCDE 有一一对应的关系, 并且i=‘1’, 此时除ABCDE= ‘00011’外abcde i是唯一的; 3B/4B 5B/6B
(2)若ABCDE 的Disparity 值为+ 1, 那么在‘RD-’项中生成的abcde与ABCDE有一一对应的关系, 并且i=‘0’, 此时除ABCDE = f g h j ‘11100a ’外 b abcdei c 是唯一的 d e ; i (3)若ABCDE 的Disparity 值为+ 3, 那么在‘RD-’项中生成的abcde与ABCDE有一一对应的关系, 并且i=‘0’, 此时abcdeiLSB 是互为反码的两个值; –’项中的值可直接用查表法实现。 后者的取值分为以下三种: 并串转换后进行串行传输,a先传输 (1)当码字中‘1’比‘0’多, 或者4B 码为1100,或者6B 码为111000时, 该码字被定义为正
a b c d e i MSB f g h j H G F E D C B A (4)若ABCDE的Disparity为其他值, 此时abcde i具有互为反码的两个值, 对这些特殊的‘RD
极性码,这个时候RD取正; 极性码, 这个时候RD取负;
图1 编码对应关系
(2)当码字中‘1’比‘0’少, 或者4B 码为0011,或者6B 码为000111时, 该码字被定义为负(3)除了上述两种情况其他码字定义为中性码, RD取其前一码字的RD游程值。为了直观了解这个规则, RD取值图如下:
如表1(略), 计算RD 计算RD为正
3B/4B和 5B/6B是通过映射机制进行编码的,这种映射机制已经标准化成相应的映射表,计算RD
3B/4B和 5B/6B编码还需要通过映射控制模块(Disparity Control)的控制才能最终完成编RD- RD+ 为中性 为中性 码。通过表1我们可以看出,5位映射到6位可能存在两种编码,这两种编码是互为反码的。在5B/6B编码中,先预设RD为负,然后与实际的RD值进行比较,如果实际值为负,则输出RD
计算RD为负
–栏中的编码,否则,将RD–栏中的编码取反后输出,即输出RD+栏中的编码。5B/6B编码的
实际流程如图3。3B/4B编码由于数据量少,可以把映射数据直接存储,然后通过查表实现。
输入ABCDE 图2 RD值计算方式
有了3B/4B和5B/6B编码,那么就可以实现8B/10B编码,其实际流程如图4所示。 RD 运算时基于每个子模块的D isparity 属性的, 所以必须首先对输入字符DX 的高三位FGH 和低五位ABCDE 分别进行D isparity 计算。通过分析总结出低五位和高三位编码前后的计算Disparity RD 值变化情况, 其中rdout表示新生成的RD 值而rdin表示当前的RD值:
N 3B/4B编码 RD5B/6B编码实际为–? 计算Disparity 数据输入(8bit) 5B/6B编码(RD–) 初始RD– 按位取反 Y 是否修正? 输出abcdei, RD 计计N 按位取反 算算Y ( 1) ABCDE的Dispar ity计算为+ 1时, 若ABC??DE =‘00 111’且控制字符K 无效, 则rdout= not rdin, 否则rdout= rd in;
( 2) ABCDE 的Disparity 计算为- 1 时, 若ABCDE =‘00 011’则rdout= no t rdin, 否则rdou t= rd in;
( 3) ABCDE 的Disparity 计算为其他值时, rdout= not rdin;
( 4) FGH 的值为‘000’、‘001’或‘111’是rdout= no t rdin, 否则rdout= rd in。
5B/6B编码中,计算实际RD值的方法也是如此。
计算最终RD值的方法是,如果3B/4B编码后的RD和5B/6B编码后的RD的极性相同,那么最终要输出的RD和初始输入的RD一致,否则相反。具体如表2所示。
初始输入的RD RD- RD- RD- RD- RD+ RD+ RD+ RD+
3B/4B编码后的RD RD- RD- RD+ RD+ RD- RD- RD+ RD+ 表2
5B/6B编码后的RD RD- RD+ RD- RD+ RD- RD+ RD- RD+ 最终要输出的RD RD- RD+ RD+ RD- RD+ RD- RD- RD+ 8B/10B标准中使用了12个特殊的控制代码,它们采用查表的方式进行编码。
因篇幅问题不能全部显示,请点此查看更多更全内容