通信系统不可避免地要受到各种干扰的影响,使接收端收到的信息与发送端发出的信息不一致,即接收端收到的信息产生了误码。为了降低数据通信线路传输的误码率,通常有改善数据通信线路传输质量和差错检测控制两种方法。差错检测控制的方法很多,本文讨论在10G以太网接人系统中并行实现CRC-32编解码的方法、并行CRC算法的Unfolding算法可以实现并行CRC的计算,但是并行电路所用的资源增加到了原来的J倍。8位并行CRC算法、并行CRC-16的编码逻辑、USB技术中并行CRC算法给出的并行算法都建立在公式递推的基础上。当并行深度较小时,递推算法比较适用。而当并行深度很大的情况下(10G以太网接人系统使用64比特并行数据通路),递推过程就显得过于烦琐而缺乏实用性。为此,本文提出了矩阵法、代入法和流水线法等三种算法,解决了深度并行情况下CRC算法的实现问题。利用本文提出的算法,可以得出64比特并行CRC计算的逻辑表达式,并用于10G以太网接入系统的设计。设M/(x)为信息多项式,G(x)为生成多项式。一般的CRC编码方法是:先将信息码多项式左移r位,即M(x)·xr,然后作模2除法
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
(M(x)· x r)/G(x)=Q(x)+R(x)/G(x) (1)WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
所得到的月(x)就是CRC校验码。以二进制码0x9595H的CRC-32编码为例:WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
· 将信息码左移32比特变成0x959500000000H,记为m。WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
·CRC-32G的生成多项G(x)=x32+x26+x23+x22+x16+x12+xll+x10+x8+x7+x5+x4+x2+x+1,转换成16进制码为g=0x104C01DB7H。用m除以g(模2除法),所得余数0x3738F30BH就是0x9595H的CRC-32码。实现0x9595H的基本CRC-32编码的Matlab程序如下:——可——编——程——控-制-器-技——术——门——户
WWW_P※LCJS_CO※M-PLC-技-.术_网
g(33:-1:1)=[1,0 0 0 0 0 1 0 0,1 1 0 0 0 0 0 1,0 0 0 1 1 1 0 1,1 0 1 1 0 1 1 1];WWW_P※LCJS_CO※M-PLC-技-.术_网
WWW_PLCJS@_COM%-PLC-技.术_网
a(48:-1:1)=[1 0 0 1 0 1 0 1,1 0 0 1 0 1 0 1,0 0 0 0 0 0 0 0,0 0 0 0 0 0 0 0,0 0 0 0 0 0 0 0,0 0 0 0 0 0 0 0];WW.W_PLC※JS_C,OM-PL,C-技.术_网
WWW_P※LCJS_CO※M-PLC-技-.术_网
for i=48:-1:33,WW.W_PLCJS_COM-PLC-技.术_网
W1WW_P4LCJS_COM-PLC-技.术_网
if a(i)= =1WWW_PLCJS_COM-PLC-技.术_网
WWW_PL※CJS_COM-PLC-技.术_网
a(i:-1:i-32)=xor(a(i:-1:i-32),i(33:-1:1));WWW_PLCJS_COM-PLC-技.术_网
WWcW_PLCJS_COM-PLC-技.术_网
endWWW_PLCJS@_COM%-PLC-技.术_网
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
endWWW_P※LCJS_CO※M-PLC-技-.术_网
WWW_PLCJS_COM-PLC-技.术_网
crc=a(32:-1:1)WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
P.L.C.技.术.网——可编程控制器技术门户
如果想用以上CRC-32程序计算其他长为L的序列的基本CRC-32码,只需将数组α的上界和for循环中i的初始值改为32+L,并用该序列代替数组。开始的序列"1001010110010101"即可。用数字电路实现的串行CRC编码器如图1所示。图1中每个矩形表示D触发器。gi的取值范围是1或者0。取1时表示通路,取0时表示断路。进行基本CRC-32编码时,每个D触发器初始状态为0,从数据端串行输入二进制的信息码。信息码输入结束后,D触发器中锁存的数值就是信息码的基本CRC-32编码。此电路适用于信息码长为任意值的情况。在某些信息系统中以基本CRC产生算法为基础附加了新的规定。例如IEEE802.3协议规定,以太网的FES(帧校验序列)域以CRC-32为基础,并且在编码时首先将信息码的最初4个字节取反码,对目的地址、源地址、长度/类型域、数据域、PAD域求出基本CRC-32码之后再将结果取反,最后的结果才是FCS。同上述过程等价的另一种实现方法是将图1中所有D触发器的初值置1,这样结果不必取反。为使电路设计者验证其FCS编码正确,IEEE802.3还给出了一个样本,即:将序列0xBED723476B8FB3145EFB3559H重复126次,最后得到的FCS值应该为0x94D254ACH。10G以太网是IEEE802.3ae工作组提出的建议。它保持了以前以太网的帧结构,但是线速度达到了10Gbps的量级。为了降低10G以太网接入系统的功耗并达到芯片加工工艺的要求,必须采用并行数据通路。为计算FCS需要研究并行CRC算法。所设计的10G以太网接入系统采用64比特并行数据通路,因此本文主要讨论64比特并行CRC-32的实现方法。本文共介绍三种实现方法,其中矩阵法和代入法是基于组合逻辑的直接实现方法,第三种方法是基于流水线的实现方法。WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
1 矩阵法WWW_PL※CJS_COM-PLC-技.术_网
WWW_P※LCJS_CO※M-PLC-技-.术_网
记图1中的32个D触发器的输出从右至左依次为d31,d30,…,d0。信息码元的输入端为i。令D=[d0d1…d31]T表示编码器当前所处的状态,I=[i63i62…i0]表示第1至第64个时钟的信息码元输入,向量Dˊ=[d0ˊd1ˊ,…d31ˊ] T表示编码器的下一个状态,D(64)表示64个时钟之后CRC编码器所处的状态。则设计64位并行CRC逻辑编码器,就是找出函数关系D(64)=f(D,I)。WW.W_PLCJS_COM-PLC-技.术_网
WWW_PL※CJS_COM-PLC-技.术_网
do=d31+i63WW.W_PLC※JS_C,OM-PL,C-技.术_网
WWW_PLCJS@_COM%-PLC-技.术_网
d1=d0+d31+i63WWW_P※LCJS_COM-PLC-)技.术_网
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
d2=d1+d31+i63WW.W_PLC※JS_C,OM-PL,C-技.术_网
WW.W_PLC※JS_C,OM-PL,C-技.术_网
d3=d2W1WW_P4LCJS_COM-PLC-技.术_网
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
…WWW_P※LCJS_COM-PLC-)技.术_网
——可——编——程——控-制-器-技——术——门——户
d31=d30WWcW_PLCJS_COM-PLC-技.术_网
WWW_P※LCJS_CO※M-PLC-技-.术_网
写成行列式,有D=TD+Si63WWW.PLCJS.COM——可编程控制器技术门户
WWW_P※LCJS_COM-PLC-)技.术_网
其中:WWcW_PLCJS_COM-PLC-技.术_网
WW.W_PLCJS_COM-PLC-技.术_网
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
2个时钟之后编码器的状态为:P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
D=TD+Si62=T)TD+Si63)+Si62=T2D+TSi63+Si62plcjs.技.术_网
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
依此类推,有:WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
D(64)=T64D+T63Si63+T62Si62+…+TSi1+Si0 (2)WWW_PL※CJS_COM-PLC-技.术_网
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
这里所有矩阵运算和代数运算中的加号的语义都是模2加法。为了。设计64位并行CRC电路,必须计算(2)式中的大规模矩阵乘法T64、T63S等。WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
2 代入法P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
plcjs.技.术_网
矩阵法的优点在于其直观性。但是需要做大规模乘法运算。下面讨论的代入法能够得到与矩阵法相同的结果。同时可以避免大规模矩阵乘法运算。设8比特并行CRC-32电路的初始状态是d31,d30,…,d0,输入是i7,i6,…,j0,输出是z31,Z30,…,z0。利用前面所述的矩阵法,可以得出8比特并行CRC-32编码器的组合逻辑表达式。如表1所示。WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
WWW_PL※CJS_COM-PLC-技.术_网
即:WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
WWW_PLCJS@_COM%-PLC-技.术_网
z31=d23+d29+i5;WW.W_PLCJS_COM-PLC-技.术_网
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
z30=d22+d31+i7+d28+i4WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
WWW_PLC※JS_COM-PmLC-技.术_网
…WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
P.L.C.技.术.网——可编程控制器技术门户
z0=d24+d30+i6+i0WW.W_PLCJS_COM-PLC-技.术_网
表1 8位行CRC逻辑表WWcW_PLCJS_COM-PLC-技.术_网
z0 |
d24,d30,i6,i0 |
z1 |
d25,d31,i7,i1,d24,d30,i6,i0 |
z2 |
d26,i2,d25,d31,i7,i1,d24,d30,i6,i0 |
z3 |
d27,i3,d26,i2,d25,d31,i7,i1 |
z4 |
d28,i4,d27,i3,d26,i2,d24,d30,i6,i0 |
z5 |
d29,i5,d28,i4,d27,i3,d25,d31,i7,i1,d24,d30,i6,i0 |
z6 |
d30,i6,d29,i5,d28,i4,d26,i2,d25,d31,i7,i1 |
z7 |
d31,i7,d29,i5,d27,i3,d26,i2,d24,i0 |
z8 |
d0,d28,i4,d27,i3,d25,i1,d24,i0 |
z9 |
d1,d29,i5,d28,i4,d26,i2,d25,i1 |
z10 |
d2,d29,i5,d27,i3,d26,i2,d24,i0 |
z11 |
d3,d28,i4,d27,i3,d25,i1,d24,i0 |
z12 |
d4,d29,i5,d28,i4,d26,i2,d25,i1,d24,d30,i6,i0 |
z13 |
d5,d30,i6,d29,i5,d27,i3,d26,i2,d25,d31,i7,i1 |
z14 |
d6,d31,i7,d30,i6,d28,i4,d27,i3,d26,i2 |
z15 |
d7,d31,i7,d29,i5,d28,i4,d27,i3 |
z16 |
d8,d29,i5,d28,i4,d24,i0 |
z17 |
d9,d30,i6,d29,i5,d25,i1 |
z18 |
d10,d31,i7,d30,i6,d26,i2 |
z19 |
d11,d31,i7,d27,i3 |
z20 |
d12,d28,i4 |
z21 |
d13,d29,i5 |
z22 |
d14,d24,i0 |
z23 |
d15,d25,i1,d24,d30,i6,i0 |
z24 |
d16,d26,i2,d25,d31,i7,i1 |
z25 |
d17,d27,i3,d26,i2 |
z26 |
d18,d28,i4,d27,i3,d24,d30,i6,i0 |
z27 |
d19,d27,i5,d28,i4,d25,d31,i7,i1 |
z28 |
d20,d30,i6,d29,i5,d26,i2 |
z29 |
d21,d31,i7,d30,i6,d27,i3 |
z30 |
d22,d31,i7,d28,i4 |
z31 |
d23,d29,i5 |
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
下文用"+"表示按位模2和运算,"{,}"表示链接运算。从CRC的(1)式很容易得出以下算法:plcjs.技.术_网