目前在磁介质存储器与主机之间的信息传输、计算机之间的通信以及网络通信等采用串行传送方式的领域中,广泛采用循环冗余校验码(Cyclic Redundancy Check, CRC)。循环冗余校验码是在 n 位有效信息位后拼接 k 位校验位构成的,它通过除法运算来建立有效信息和校验位之间的约定关系,是一种具有很强检错纠错能力的校验码。

一、基本原理

CRC校验基本原理.png

在传送过程中,发送方可以把M(x) - R(x)作为编好的校验码进行传送,接收方接收到编码后仍用原约定的多项式G(x)去除,如果能够整除,即余数为 0,则表示该校验码传送正确;如果不能够整除,即余数不为 0,则表示该校验码传送有误

CRC校验基本原理2.png

二、模2运算

根据式(2-16)可知,M(x) - R(x)是减法操作,可能需要涉及借位运算,难以用简单的拼装方法实现编码。为了回避借位,CRC码采用了模2运算。

所谓模2运算是指以按位模2加为基础的二进制四则运算。模2运算不考虑进位和借位

1. 加减运算

加减运算本质上是异或运算,加不进位,减不退位。

2. 乘法运算

模2乘法就是在做乘法时按模2加的规则求部分积之和计算时不进位

模2乘例题.png

3. 除法运算

模2除就是在做除法时按模2减求部分余数,计算时不借位。若部分余数(首次为被除数)最高位为1,则上商为1;若部分余数最高位为0,则上商为0。每求一位商后,使部分余数减少一位,即去掉部分余数的最高位,再继续求下一位商。当部分余数的位数小于除数位数时,该余数就是最后的余数。

模2除例题.png

三、CRC编码方法

CRC编码方法.png

CRC编码方法2.png

在CRC码中,由 k 位有效信息位和 r 位校验信息构成的 k + r 位编码,称为(k+r, k)码。在上面的CRC中,由于 k = 4, k + r = 7,故称(7, 4)码。

四、CRC的检错与纠错

1. 检错

将接收到的CRC码用原约定的生成多项式G(x)做模2除,若得到的余数为0,表示接收到的信息中没有错误;若得到的余数不为0,则表示接收到的信息中某一位出错

CRC编码检错纠错.png

因为不同位出错对应的余数不同,所以根据余数值就可以确定出错的位置

CRC编码检错纠错2.png

2. 纠错

以上图 G(x) = 1011 时出错为例。把余数001补0再除以 G(x) = 1011,得到的第二次余数为010,再补0除以1011,得到的余数为100,按此继续下去,可以发现得到的余数依次为011、110、111、101,最后又回到001,即各次余数会按表中的顺序反复循环,这就是循环码的来历。

CRC编码检错纠错3.png

根据循环码的这一特点,当接收到的CRC码与 G(x) 做模2除得到的余数不为0时,可以一边对余数补0继续做模2除,同时使被检测的CRC码循环左移,当出现余数101时,原来出错的位已移到A7的位置,通过异或门把它纠错(取反)后在下次移位时送回A1。将编码继续循环左移,移满一个循环后,就可得到一个纠错后的CRC码。

CRC编码检错纠错4.png

当位数增加时,循环冗余校验能有效地降低硬件成本,故得到广泛应用。

五、CRC编码的硬件实现

关于CRC的硬件实现,推荐以下文章:

CRC编码