10G以太网系统中的并行CRC编解码器的设计
通信系统不可避免地要受到各种干扰的影响,使接收端收到的信息与发送端发出的信息不一致,即接收端收到的信息产生了误码。为了降低数据通信线路传输的误码率,通常有改善数据通信线路传输质量和差错检测控制两种方法。差错检测控制的方法很多,本文讨论在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除法
(M(x)· x r)/G(x)=Q(x)+R(x)/G(x) (1)
所得到的月(x)就是CRC校验码。以二进制码0x9595H的CRC-32编码为例:
· 将信息码左移32比特变成0x959500000000H,记为m。
·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程序如下:
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];
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];
for i=48:-1:33,
if a(i)= =1
a(i:-1:i-32)=xor(a(i:-1:i-32),i(33:-1:1));
end
end
crc=a(32:-1:1)
如果想用以上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的实现方法。本文共介绍三种实现方法,其中矩阵法和代入法是基于组合逻辑的直接实现方法,第三种方法是基于流水线的实现方法。
1 矩阵法
记图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)。
do'=d31+i63
d1'=d0+d31+i63
d2'=d1+d31+i63
d3'=d2
…
d31'=d30
写成行列式,有D'=TD+Si63
其中:
2个时钟之后编码器的状态为:
D''=TD'+Si62=T)TD+Si63)+S
- LT3751如何使高压电容器充电变得简单(08-12)
- 三路输出LED驱动器可驱动共阳极LED串(08-17)
- 浪涌抑制器IC简化了危险环境中电子设备的本质安全势垒设计(08-19)
- 严酷的汽车环境要求高性能电源转换(08-17)
- 适用于工业能源采集的技术 (08-10)
- 单片式电池充电器简化太阳能供电设计(08-20)