玩转VHDL019-8B10B编码序

2020-02-02 10:34发布

本帖最后由 ucx 于 2018-3-14 12:19 编辑

8B10B编码是把8比特的信源码编码为10比特的信道码(或称线路码),广泛应用于各种高速总线或网络。
8B10B编码的优点
1. 尽管8B10B规则比较复杂,但其实现逻辑比较简单,适合于高速应用场合。
2. 以字节为单位编码,便于和上层应用交互数据。
3. "0"和"1"数量保持基本一致,利于线路码传输。
4. 连"0"或连"1"不超过5位,易于接收比特同步,只有逗号码是5连位,其他码连码均不超过4位。当使用逗号码时,接收可以简单判断5连位的位置实现字同步。
5. 协议规定了数据码(D码)和控制码(K码),K码可用作传输帧起始或结束、空闲等握手信息,使8B10B编码适用于同步通信或异步通信场合。只要信道传输速率不小于数据速率的1.25倍均可以使用8B10B编码。
6. 在不使用K码只使用D码的场合,也可以实现字同步。线路码一个码字为10个比特,在接收端比特同步后必需实现字同步才能正确解码。这里,记接收端字定界起始位置与字真实起始位置相差的比特数为字偏差。显然字偏差的范围是0到9,当字偏差是0时为字同步,字偏差是1到9时为字定界错误。当有K码时,在K码(若是K28.1、K28.5、K28.7,这三个K码也被称作逗号码)处100%的可能发现字定界错误。而在D码中的定界错误(字偏差1到9的任一情况)均有不小于1/4的概率检测出定界错误。那么当数据随机变化时,总可以检测出D码中的定界错误。也就是说,没有逗号码参与也可以实现字同步。
8B10B编码原理简述
    信源码8位256种组合,信道码10位1024种组合。简单地从1024中挑选256个不能同时满足〇幺均等和连位限制的一般编码规则。8B10B是从1024里挑选出440个D码,有的信源码对应1个信道D码,有的信源码对应2个信道D码。那么也可以说成,1个信源码对应2个信道码,有的两个信道码相同,有的两个信道码不同。所以,把信道码分成两组,一组叫正码组,另一组叫负码组。正码和负码的关系是相同或相反(按位取反)。K码与信源没有对应关系,属于控制码,同样也是分为正负两组,正码和负码始终相反。
    信道码中0和1的个数不均衡性用RD来表示,这里简称不均衡性为极性。8B10B信道码使用5个0和5个1、4个0和6个1、6个0和4个1三种情况,分别称为〇极性、正极性、负极性。正极性码一定在正码组,负极性码一定在负码组,某个〇极性码可能在正码组、负码组或同时在正负码组。也就是说当信源码对应〇极性码时,可能是1对1也可能是1对2。RD的值只有两种情况:+或者-。RD变化规则:正极性码后RD=+,负极性码后RD=-,〇极性码后RD保持不变。正负码选择规则:当前(或者说输入)RD==+则选择负码,RD==-则选择正码。RD的这种变化规则和码字选择使得〇幺均衡,并保证任何两个符合规则的码字连在一起不会出现超过4连位的情况。如果使用K码不会出现超过5连位的情况。
    为了使编码逻辑简单适合硬件实现,8B10B编码规则使得其可以拆分为5B6B和3B4B编码的组合来。8位信源用S[7:0]表示,10位信道用C[0:9]表示。信源码高位在前,信道码低位在前。x=S[4:0], y=S[7:5]。那么x→C[0:5], y→C[6:9],所以记C[0:9]为Dx,C[6:9]为Dy。Dx和Dy泛指D码和K码,如特殊指明是K码时用Kx和Ky表示。x→Dx、y→Dy对应规则同8B10B总体规则(S直接→C)一样,有极性变化,5B6B极性输出为3B4B的极性输入,3B4B的极性输出为下一码字的5B6B极性输入。不同之处的是当y==7时,Dy不是1个或2个,而是有4个不同的码字与y对应,这4个码字为±P7和±A7。
    将S拆分为x和y,映射出Dx和Dy,再将Dx和Dy拼接成C,是适合硬件实现的路径。而将S直接映射出C更适合于软件实现。两条路径获得的结果相同。
8B10B硬件实现
    限于文字限制,编解码硬件实现在下一帖给出。后续在讲述硬件实现时,源代码采用VHDL语言以附件的形式给出,功能描述采用类verilog语言。因为verilog更接近于C,使用verilog和VHDL的都能看懂。为更加清晰描述,使用verilog最基本的语句,并稍作修改为类verilog语言,简单规则如下。
=表示赋值,不区分阻塞和非阻塞。@clk和@~clk分别表示时钟上升沿和下降沿,则赋值语句有以下四种形式,其意义显而易见。
a = b;
@CLK a = b;
@clk{a1 = b1; a2 = b2; if(condition) a2 = b3;}
@CLK if(condition){a1 = b1; a2=b2;}
'Z'表示高阻,'-'表示不关心
A[x:y][i:j]; 表示定义一个矢量数据位长为|i-j|索引号从x到y的一维数组,数组可以整体或部分赋值,例: A[0:3][5:3]={"00-", "Z10", "ZZZ", "111"};
{}可以表示位拼接运算和数组值,不会引起混淆。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。