MPHY协议解读三:8b10b编码
整体概述
8b10b编码思维导图如下:
本章节主要分析MPHY协议中使用的8b10b编码,包括编码优劣势、实现规则两大部分
8b10b编码优劣势
优势:
1)保证DC平衡
我们知道电容的阻抗公式是Zc=1/2πf*C,信号频率越高,阻抗越低,反之频率越低,阻抗越高;在串行高速传输过程中,由于串行链路中存在耦合电容,在码型是高频的时候,基本上可以不损耗的传输过去,但是当码型是连续的‘0’或‘1’时,耦合电容的损耗比较大,导致电压幅度降低,带来最严重的后果就是无法判断该码型是‘1’还是‘0’,导致接收端接收错误。而8b10b编码的码型翻转率都比较高,保证底损耗传输,降低接收端接收错误的概率。
2)保证CDR电路时钟恢复
CDR:Clock Data Recovery
Unit从数据信号中恢复正对数据窗口的时钟,即时钟恢复电路。主要结构如下图:
VCO:压控振荡器,输出时钟频率与输入电压成正比
V control:电压控制单元,依据指示提高或降低VCO的输入电压
Phase
Detector:鉴相器,VCO输出时钟和输入数据相比较,产生时钟相位早晚指示给V control
可以看出,如果接收端输入数据长时间处于‘0’或‘1’,Phase Detector无法输出有效的相位指示,负反馈环路无法正常工作,最终导致VCO输出时钟“失锁”
8b10b编码可以很好的解决这个问题,编码提供足够多的数据边沿跳变,以便接收器在收到的数据码型上锁定相位。
劣势:
1)数据传输效率低,额外开销大
8b10b实现原理
8b10b符号和术语
每个传送的字节(8B)有256种可能的数据值,而代码字(10B)理论上具有1024种可能的数据值。为简化对它们的处理,开发了一种8B/10B编码的简写符号,DX.Y 和 KX.Y。
D分组用于数据字节编码。即DX.Y,X为8b的低5位的值,Y为8b的高3位的值,如图下图所示,A表示最低位,H表示最高位。
K分组用于特殊控制符号编码。即KX.Y,X为8b的低5位的值,Y为8b的高3位的值。
3b4b/5b6b编码
8位的数据用H,G,F,E,D,C,B,A表示(从最低位到最高位),8b分成了两个子分组,一组包括3位,即3bit(H,G,F),另一组包括5位,即5-bit(E,D,C,B,A)。编码器将这8bit数据译成10bit,用a,b,c,d,e,I,f,g,h,j表示。10bit也分成了两个子分组,一组包括4-bit(f,g,h,j),另一组包括6-bit(a,b,c,d,e,i)。并且8bit中的3bit(H,G,F)与10bit中的4bit(j.h.g.f)对应,8bit中的5bit(E,D,C,B,A)与10bit中的6bit(I,e,d,c,b,a)对应。编码后的10bit按照abcdeifghj的顺序连续传送,即输出对输入进行了大小端的转换。
为了编出DC平衡的10b码流,则需要尽量平衡‘0’和‘1’的个数。如果一个10b码流中‘1’的个数与‘0’的个数相等,那么我们称其为均衡的。
如果4bit和6bit两个子分组都是均衡的,那么这两个子分组构成的10b也是均衡的。如果10b码都是均衡的,那么就是完美的DC平衡编码。但是,这是不可能的,因为4bit子分组有16种值其中只有6种是均衡的,而4bit对应的3bit子分组有8种值,显然,4bit子分组中仅仅6种均衡的代码不足以表示-bit子分组中的8种值。同样,6bit子分组中所有值种只有20种均衡的,也不足以表示5bit子分组中的32种值。所以我们只能找‘1’的个数与‘0’的个数相差最小的值来表示余下来的值,因为4bit和6bit都是偶数位,‘1’的个数减去‘0’的个数的差不可能是+1或者-1,最小是+2或者-2,所以在8b10b的编码方案中也需要使用偏差为+2或-2的代码。
8b10b的编码规则要求将4bit与6bit结合起来的时候,10b代码的偏差最大为+2(即1的个数减去0的个数)或者-2(即1的个数减去0的个数)。所以4bit偏差为+2的值不能跟6bit偏差为+2的值结合,因为这样结合出来的10b的偏差就是+4,不符合要求。
RD
因为10b编码中最大的偏差值是+2或者-2,所以发送出去的串行数据流中仍然有可能会有偏差+2或者-2的偏差,这样数据流依然不能保证DC平衡。为了维持数据流的DC平衡,每个8b数据都对应着两种可能的值,如表3所示,两种值分别对应RD-与RD+两列。RD-这一列中的值偏差是+2或者0,RD+这一列中的值偏差则是-2或者0,编码器根据当前RD的值来决定选择RD-列中的值还是RD+列中的值。
假设开始发送的时候,RD默认为RD-,那么当对8b数据编码的时候,编译器将用RD-这一列的值。如果取出来的10b代码是均衡的,那么RD保持RD-不变,下一个字节对应的还是取RD-这一列的值。否则RD变为RD+,即下一个字节对应的应该取RD+这一列的值,如果取出来的10b代码是均衡的,那么RD保持RD+不变,下一个字节对应的还是取RD+这一列的值。否则RD将从RD+变回RD-,即RD-这一列的值将被使用。以下图是行程偏差计算的状态图。
MPHY实现相关点
在控制字符中,MPHY协议主要使用K28.1,K28.3,K28.5和K28.6,每种控制字符含义如下,其具体含义在后面会具体讲解:
在MPHY TX端发送时,8b10b编码遵循RD原则,即依据RD的累积值不能超过-1或+1.
在MPHY RX端接收时,RX会依据接收的数据进行RD的累积判断,如果RD累积值超过-1或+1,则认为该10bit数据时错误数据,此时MPHY会上报PHY ERROR给上层Unipro,Unipro发送NAC,让MPHY TX对错误数据进行重传。
在实际实现时,8b10b编码是上层Unipro和MPHY共同完成的。如TX方向Unipro发送原始数据流,MPHY进行8b10b编码。Unipro发送FILLER无效数据指示信号,MPHY发送K28.1编码。