-
8b/10b编码
8b/10b编码解码是高速串行通信,如PCIe、SATA(串行ATA),以及Fiber Channel中常用的编解码方式。在发送端,编码电路将串行输入的8比特一组的数据转变成为10比特一组的数据并输出;在接收端,解码器将10比特一组的输入数据转变成8比特一组的输出数据。编码和解码均采用一样的算法,整个过程就是8b/10b编码/解码过程。
这种编码方式中的0-1、1-0跳变丰富,0和1分布均匀,不会出现长连0和长连1的情况。例如,8b/10b比特流中连续出现的0或1的最大数量是5.这有助于为数据提供直流平衡,可以为接收端时钟恢复提供足够的比特翻转(1-0、0-1)。在1983年,这种编码方式首次由IBM公司的两位工程师发明,之后申请了发明专利。
- 8b/10b编码方式
进行8b/10b编码时,输入的每8比特数据转换成10比特数据,这10 比特数据成为一个编码符号或编码字符,如图所示。编码时,将8比特数据分成两个子组,即低5位子组和高3位子组。低5位编码后为一个6比特值,高3位编码后为一个4比特值,此后将二者拼接,可以得到一个10比特字符。对于8比特输入,会有256种组合可能,然而对于10比特,就会有1024种组合,除了有过多连0和连1的编码组合被丢弃不用外,还要选择部分10比特字符作为控制字符或者K字符。这些特殊的控制字符具有不同的用途,例如,作为包的开始标识,作为包的结束标识,以及特殊COMMA符号。还有一些编码字符既不属于控制字符也不属于和256种8比特输入数据对应的编码字符,它们都是非法字符,正常编码时不会出现在编码比特字符流中。在数据传输出错时,可能会出现非法字符。
-
多字节8b/10b
在一些应用中,每个时钟周期需要对多字节进行编码。如图便是对16比特数据进行8b/10b编码的一种实现方案,它可以在每个时钟周期进行两字节数据的8b/10b编码。
编码器1输出的disparity信号被当成编译器2的disparity输入。两个编码器的编码和disparity计算在相同的时钟周期内进行。最终的disparity经过一个寄存器后作为16比特数据的disparity,也就是当前运行的disparity,同时它还还作为编译器1下一个时钟周期的disparity输入。
-
编码表
5b/6b编码表与3b/4b编码表以及控制字符编码表如下所示。由表可以看出对于RD为不同的值,对应的编码可能会出现不同的结果,这是因为编码可能会出现连续为0或者连续为1的情况,而这些情况并不能满足要求会被舍弃,但是6位数据要有32个编码状态,因此发明人提出连续两次编码的0和1的数量相等也可以,并且用RD表示上一次编码的结果RD=-1表示0的个数多余1,RD=+1表示1的个数多余0。如果编码结果的1和0个数相等,称为平衡编码,此时RD的数值保持不变。如果编码结果1和0个数不等,称为非平衡编码,此时RD的数值翻转,下次编码采用RD对应数值的编码作为编码结果。将上次8b/10b编码结果的RD数值用作本次5b/6b编码的起始RD,而3b/4b编码的起始RD等于5b/6b编码结果的RD,3b/4b编码结果的RD作为本次8b/10b编码的RD。
比如对D.17.4进行8b/10b编码,首先我们不知道前一次8b/10b编码的RD值为多少,因此需要进行分情况讨论,当前一次编码的RD=-1时,由表可以看出D.17
的编码结果均为100011,而对D.x.4编码时需要将RD进行翻转,也就是RD=+1,因此,此时的编码结果为0010,整体编码结果就是100011_0010,0的个数比1的个数多两位。从表中我们也能看见,如果此时RD=-1编码结果为1101,结合前面的低5位编码就会出现1比0多两位的情况,与前面的RD=-1矛盾;当前一次编码的RD=+1时,D17编码的结果还是100011,对D.x.4编码RD时进行翻转,也就是RD=-1,因此,此时的编码结果为1101,即1的个数比0的个数多两位。
再比如当RD=-1时,求K28.5,D.13.5,D.2.6的编码结果以及编码的RD。
首先对于K28.5,RD=-1时的编码结果为001111_1010且RD翻转为+1,因此第一次编码的RD=+1作为第二次编码的RD;RD=+1时D.13的编码结果为101100,为平衡码,编码后RD进行翻转,RD=-1时D.x.5的编码结果为1010,由于是平衡码,因此RD保持不变;RD=-1时D.2的编码101101,编码后RD进行翻转,RD=+1时D.x.6的编码为0110,是平衡码,因此RD不进行翻转仍为+1。