目录
1.8B/10B介绍
8B/10B编码的目的是防止串行的数据出现长时间的连0连1,因为这会使得信号直流电压不稳定,换句话说就是 直流平衡keep DC-balance;另一个目的是提供给接收端‘清晰的边界’,时钟恢复:接收端能在串行数据流中确定某个10B的起始边界;而且接收端还能判断数据是否出错,能检错不能纠错。
值得一提的是,除了检错外,还有上述前2个功能的是扰码:scramble,扰码没有冗余比特出现,基本原理是使用线性反馈移位寄存器LFSR实现,这里不做详细介绍哈。
8B/10B编码广泛应用于串行数据总线, 例如SATA,PCIE,USB,JESD204接口中,后来升级成冗余更小的64/66B,128/132B,128/130B,升级后的版本也或应用于上述总线的新版本中。
2.原理
简单来说就是5B映射成6B,3B映射成4B,分为数据码和控制码的映射,在映射的过程中进行查表。
8b/10b编码输出比特数目总共是10个比特,但只有“+2”“+0”“-2”三种组合。其中“+2”是指4个比特0,与6个比特1;“+0”是指5个比特“0”,与5个比特“1”;“-2”是指6个比特“0”,与4个比特“1”,利用这种“不均等性— Disparity”的特性而具有强大的直流平衡(DC Balance)功能,可使得发送的“0”、“1”数量保持一致,连续的“1”或“0”基本上不超过5位。[1]
数据值可以统一的表示为DX.Y或KX.Y,其中D表示为数据代码,K表示为特殊的命令代码,X表示输入的原始数据的低5位EDCBA,Y 表示输入的原始数据的高3位HGF。[2]
1)running disparity
running disparity简称RD,表示当前的0与1的不均等性,进行数据映射时要根据 input 的 RD去映射,使映射后的数据具有parity,并且还要计算映射后的RD,以作为下一次映射的input RD。
因此在代码实现时,一次8Bto10B的过程中要计算两次RD:5Bto6B后,3Bto4B后。计算方式如表1[1]。
2)映射
数据码和控制码的都是互不相同的,即映射后的10B要么是数据码,要么是控制码。
对于8bit数据,它在表中的位序为HGFEDCBA,即H为最高位,A为最低位,EDCBA经过5B/6B编码为abcdei,HGF经过3B/4B编码为fghj。传送10bit编码的顺序为abcdeifghj。[3]
表2-4为映射查找表。下面解释一下,
“+”代表也用于K.x.7的映射,但从表4可以看出来其fhg的映射是D.x.A7,而数据码的映射是Dx.P7,因此不会与数据码相同。
“++”表示只用于控制码的映射,保证了与数据码的不同性。
“+”:B数据码Dx.7的映射一般都用Dx.P7,只有下列情况才用D.x.A7,为的是防止出现5个连0或连1:
- when RD = −1: for x = 17, 18 and 20 and
- when RD = +1: for x = 11, 13 and 14.
‡ Only K.28.1, K.28.5, and K.28.7 generate comma symbols, that contain a bit sequence of five 0s or 1s.
The symbol has the format 110000 01xx or 001111 10xx.[1]
“+”K.28.1, K.28.5, and K.28.7 are "comma symbols",会出现5个连0或连1,就是用这个comma symbols来从串行的比特流中同步/定位一个10B的开始位。K.28.7 不用的话 ,正常情况下00111110 or 11000001 是不会出现在比特流中的。
注意到K.23.7,K.27.7,K.29.7,K.30.7用的是D.x.A7,与防止连0或连1的x并不