原创 [博客大赛]CRC 校验:从原理到实现(一)

2013-6-9 15:40 2206 19 22 分类: FPGA/CPLD

CRC 校验:从原理到实现

 

CRC校验,就是循环冗余校验,Cyclic Redundancy Check,是数据通信领域中最常用的一种差错校验码,用于保障数据的完整性。其特征是信息字段和校验字段的长度可以任意选定,也就是说,不管信息序列(明文序列,plaintext或者message)有多长,只要选定某一种CRC校验,最后得到的校验序列(校验和)的长度是一定的。

 

通常使用的CRC校验有CRC-8CRC-12CRC-16CRC-32,后面的数字就表示校验之后校验字段的长度(以bit记)。

 

1、CRC校验的基本原理——多项式求余运算

 

所有的CRC校验都是基于以下几个等式,但是发送端和接收端的工作机制的不同会使得下面的等式有一些细微变化。为了便于说明,我们选定这种机制:发送端将校验序列附在明文序列之后发出去,接收端对明文序列和校验序列做校验,结果为0说明校验正确

 

发送端,

20130606154904252.jpg

或者

20130606155010145.jpg

接收端:

20130606155043622.jpg

或者

20130606155109561.jpg

M明文序列的多项式,R是校验序列的多项式,r是校验序列多项式的最高次幂(也就是校验字段的长度,CRC-32对应的r=32,依次类推)。G是生成(Generator)多项式对某一种确定的CRC校验,其G是固定的。

 

发送端GM做模运算(求余运算),得到校验序列R,将R附加到明文序列M之后传给接收端;

 

接收端收到M+R的序列后么,也用GM+R做模运算,将公式12带入34,得出结论:如果的到结果为0,说明序列正确,数据完整。

 

所以,CRC校验最根本的就是用生成多项式对明文多项式(或者是明文+校验序列的多项式)做除法求余计算,而它的实现方法就是用线性反馈移位寄存器(Liner Feedback Shift RegisterLFSR)实现多项式的求余计算。

 

2、LFSR和多项式取模运算的关系

 

为什么用LFSR就能实现CRC校验/多项式求余运算呢?我们首先来看一个简单的LFSR,每经过一个时钟周期,3bit的移位寄存器都会按照异或逻辑由低到高做一次值的更新,左侧串行输入多项式序列M

 

20130606155143513.jpg

 

我们假设寄存器的初始值为(R2R1R0=001),输入序列一直为0,则寄存器的值(R2R1R0)会按照如下状态机跳转,遍历除000外的所有7个状态,相当于一个状态机

20130606155216569.jpg

再假设M输入在时间上展开不是全0的,而是以1开始后面有若干个0,就对应了不同的多项式序列x^n,寄存器剩余的值就是用x^3+x+1除以多项式序列对应的余数序列。

 

M在时间上展开的值

多项式序列M(x)

寄存器最后的值/余数R(x)

1

1

1

10

x

x

100

x^2

x^2

1000

x^3

x+1

10000

x^4

x^2+1

100000

x^5

x^2+x+1

1000000

x^6

x^2+1

 

如果将这张表延续下去,会看到周期性的效果:x^7对应的R(x)1,依次类推,x^n对应的R(x)都可以用这张表中的内容来表示,有公式:

20130606155251546.jpg

 

又根据伽罗华域的性质,GF(2^m)域的本原多项式为P(x) = x^8 + x^4 +x^3 + x^2 + 1,将a作为P(x)的根,则有a^8=a^4+a^3+a^2+1,所以任何多项式M(x)都可以用x^n0<=n<=255)来表示,如下表所示:

 

20130606155325830.jpg

20130606155540807.jpg

 

所以任何M(x)的余数R(x)都可以x^0~x^7的余数准确的表示,所以用LFSR可以实现多项式的取模运算。

 

举个例子来说明,对CRC16而言,其生成多项式G(x)=x^16+x^15+x^2+1。如图所示,这是一个根据生成多项式设计的CRC16校验逻辑,由初始值为全016位以为寄存器和由G(x)确定的异或逻辑组成(只有一个输入的异或门默认为另一个输入为0,也就是输出等于输入)。每经过一个时钟周期,移位寄存器都会按照异或逻辑由低到高做一次值的更新,按照图中所示,用X表示输入的值,用R表示当前的寄存器值,R表示前一时钟的寄存器值,有:

 

R[15]=X^R[15]^R[14]

R[14:3]=R[13:2];

R[2]= X^R[15]^R[1];

R[1]=R[0];

R[0]= X^R[15];

20130606155631165.jpg


文章评论3条评论)

登录后参与讨论

DiracFatCat 2016-3-14 10:43

一起加油吧~

用户595347 2016-3-14 07:31

同看,希望能继续下去,新人求带路…

用户346042 2013-7-5 13:57

学习一下

用户271389 2013-6-6 14:46

是吗?我不太会用这个发布日志的东西,我用pdf截图的

用户403664 2013-6-3 16:58

扫描的?其实可以通过高级编辑器复制粘贴word文档内容的
相关推荐阅读
用户271389 2013-06-09 21:00
建立时间、保持时间和时序约束条件
建立时间、保持时间和时序约束条件 1、什么是建立时间(Tsu)和保持时间(Th) 以上升沿锁存为例,建立时间是指在时钟翻转之前输入的数据D必须保持稳定的时间;保持时间是在时钟翻转之后输入数据D必须保...
用户271389 2013-06-09 20:38
[博客大赛]CRC 校验:从原理到实现(二)
CRC 校验:从原理到实现(二)   1、收发端CRC校验的可选机制   CRC校验是为了保证信息在发送端和接收端之间传输的完整性,所以除了在收发两端都要实现CRC计算之外,还需要...
用户271389 2013-06-06 16:35
数字逻辑设计中的触发器和锁存器
数字逻辑设计中的锁存器和触发器 1、锁存器和触发器的定义和比较 锁存器(latch)---对脉冲电平敏感,在时钟脉冲的电平作用下改变状态,当Gate输入为高电平时,输入D透明传输到输出Q;当Gate...
我要评论
3
19
关闭 站长推荐上一条 /2 下一条