CRC校验算法以及软硬件实现

PART TWO:算法实现

PART ONE

  • 一、工作原理
    • 1.1关于模2运算
    • 1.2关于生成多项式

一、工作原理

CRC码由两部分组成的,前部分是信息码,就是需要校验的信息,后部分是校验码。在发送端(存储器写)根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位监督码(CRC码),附在原始信息后边,构成一个新的二进制码序列数共k+r位,然后发送出去。在接收端(存储器读),根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。

如果CRC码长共n bit,信息码长k bit,就称为(n,k)码,剩余的r bit即为校验位。如(7,3)码:110 1001,前三位110为信息码,1001为校验码。如下1.1所示,是一个CRC码的构成示意图。

图1.1 校验码格式

图1.1 校验码格式

CRC码的规范要求定义所谓的生成多项式。该多项式成为多项式长除法的除数,该除数以消息为被除数,并且其中的商被舍弃,余数成为结果。需要注意的是多项式系数是根据有限域的算法计算的,因此加法运算始终可以按位并行执行(数字之间没有进位)。实际上,所有常用的CRC都使用两个元素GF(2)的Galois字段。这两个元素通常取0和1,非常适用于计算机存储。

CRC的校验值为r位长时,称为r位CRC。对于给定的r,可能有多个CRC,每个CRC具有不同的多项式。这样的多项式具有最高的次数n,这意味着它具有r +1个项。换句话说,多项式的长度为r +1;其编码需要r +1位。请注意,由于大多数多项式规范始终为1,因此它们都舍弃了MSB或LSB。
实际上,最简单的错误检测系统是奇偶校验,它是1位CRC(一种特殊的CRC校验):它使用生成多项式x +1(两个项),叫做CRC-1。

CRC校验码的生成规则可以概括为以下步骤:

  1. 将原信息码左移r bit,右侧补零,如 110–> 110 0000;
  2. 用110 0000除以g(x) (注意,使用的是模2除法),得到的余数即为CRC校验码;
  3. 将校验码续接到信息码的尾部,形成CRC码。

1.1关于模2运算

模2运算就是加法不考虑进位,减法不考虑借位:模二加减法可以等效为异或。而模2除法,从字面上可理解为二进制下的除法。多位模2除法采用模2减法,即不带借位的二进制减法。模2除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。

模2除法它既不向上位借位,也不比较除数和被除数的相同位数值的大小,只要以相同位数进行相除即可。模2加法运算为:1+1=0,0+1=1,0+0=0,无进位,也无借位;模2减法运算为:1-1=0,0-1=1,1-0=1,0-0=0,也无进位,无借位。相当于二进制中的逻辑异或运算。也就是比较后,两者对应位相同则结果为“0”,不同则结果为“1”。

在下面的示例中,当余数位数与除数位数相同时,才进行异或运算,余数首位是1,商就是1,余数首位是0,商就是0。当已经除了几位后,余数位数小于除数,商0,余数往右补一位,位数仍比除数少,则继续商0,当余数位数和除数位数一样时,商1,进行异或运算,得新的余数,以此至被除数最后一位。
CRC校验算法以及软硬件实现_第1张图片

图1.2 模2除法

上图1.2所示是1111000除以1101的模2运算竖式,可以看到,结果的余数是0111。实际上,在CRC运算中,总能保证除数的首位为1,则模2除法运算的商是由余数首位与除数首位的模2除法运算结果确定。因为除数首位总是1,按照模2 除法运算法则,那么余数首位是1就商1,是0就商0。

1.2关于生成多项式

生成多项式就是用来把要进行防错处理的二进制码流进行转换生成校验码,然后接收方会收到原始的二进制码流和校验码,按照与发送方相同的多项式再次进行转换生成校验码,与发来的校验码进行比较。如果一致则说明接收到的二进制码流是正确的;反之则说明接收到的二进制码流包含错误。
若一个循环码的所有码字多项式都是一个次数最低的非零首一多项式 g(x)的倍式,则称g(x)生成该码,并称g(x)为该码的生成元或生成多项式。
生成多项式是接受方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。在发送方,利用生成多项式对信息多项式做模2除生成校验码。在接收方利用生成多项式对收到的编码多项式做模2除检测和确定错误位置。
在产生CRC校验码时,要用到除法运算,一般来说,这是比较麻烦的,因此,把二进制信息预先转换成一定的格式,这就是CRC的多项式表示。二进制数表示为生成多项式的系数,如下:

在这里插入图片描述

而如下表1所示是一些常见的生成多项式

CRC校验算法以及软硬件实现_第2张图片
生成多项式的选取不是一个随意的过程,它有着下述几个条件:

  1. 生成多项式的最高位和最低位必须为1。
  2. 当被传送信息(CRC码)任何一位发生错误时,被生成多项式做除后应该使余数不为0。
  3. 不同位发生错误时,应该使余数不同。
  4. 对余数继续做除,应使余数循环。

你可能感兴趣的:(CRC校验算法以及软硬件实现)