转自:http://blog.163.com/yucheng_xiao/blog/static/76600192201393092918776/

一、基本原理

CRC检验原理实际上就是在一个p位二进制数据序列之后附加一个r位二进制检验码(序列),从而构成一个总长为n=p+r位的二进制序列;附加在数据序列之后的这个检验码与数据序列的内容之间存在着某种特定的关系。如果因干扰等原因使数据序列中的某一位或某些位发生错误,这种特定关系就会被破坏。因此,通过检查这一关系,就可以实现对数据正确性的检验。

二、几个基本概念

1、帧检验序列FCS(Frame Check Sequence):为了进行差错检验而添加的冗余码。

2、多项式模2运行:实际上是按位异或(Exclusive OR)运算,即相同为0,相异为1,也就是不考虑进位、借位的二进制加减运算。如:10011011 + 11001010 = 01010001。

3、生成多项式(generator polynomial):当进行CRC检验时,发送方与接收方需要事先约定一个除数,即生成多项式,一般记作G(x)。生成多项式的最高位与最低位必须是1。常用的CRC码的生成多项式有:

CRC8=X8+X5+X4+1

CRC-CCITT=X16+X12+X5+1

CRC16=X16+X15+X5+1

CRC12=X12+X11+X3+X2+1

CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1

每一个生成多项式都可以与一个代码相对应,如CRC8对应代码:100110001。

三、CRC检验码的计算

设信息字段为K位,校验字段为R位,则码字长度为N(N=K+R)。设双方事先约定了一个R次多项式g(x),则CRC码:

V(x)=A(x)g(x)=xRm(x)+r(x)

其中:   m(x)为K次信息多项式, r(x)为R-1次校验多项式。

这里r(x)对应的代码即为冗余码,加在原信息字段后即形成CRC码。

r(x)的计算方法为:在K位信息字段的后面添加R个0,再除以g(x)对应的代码序列,得到的余数即为r(x)对应的代码(应为R-1位;若不足,而在高位补0)。

计算示例

设需要发送的信息为M = 1010001101,产生多项式对应的代码为P = 110101,R=5。在M后加5个0,然后对P做模2除法运算,得余数r(x)对应的代码:01110。故实际需要发送的数据是101000110101110。

图 3.1

四、错误检测

当接收方收到数据后,用收到的数据对P(事先约定的)进行模2除法,若余数为0,则认为数据传输无差错;若余数不为0,则认为数据传输出现了错误,由于不知道错误发生在什么地方,因而不能进行自动纠正,一般的做法是丢弃接收的数据。

五、几点说明:

1、CRC是一种常用的检错码,并不能用于自动纠错。

2、只要经过严格的挑选,并使用位数足够多的除数 P,那么出现检测不到的差错的概率就很小很小。

3、仅用循环冗余检验 CRC 差错检测技术只能做到无差错接受(只是非常近似的认为是无差错的),并不能保证可靠传输。

六、数学推理
虽然以上内容已经有了一个较为清晰的数学计算过程,在这一小节将给出更为严谨的数学模型,以加深印象:
与第三节内容保持一致
1.设欲传输的信息有K位,如图6.1所示
2.首先将欲传输的数据序列m(x)乘以 X, 其中R为g(x)的最高次冥。
      3.将得到的多项式Xm(x)除以约定的多项式g(x)
4.忽略除法结果的“商”,取出其余数,并与XRm(x)相加,形成K+R位的发送序列,即:m’(x) = XRm(x) +r(x)
      图 6.1
CRC编码过程如下:
设待校验的信息码有k位,即:m = (mk-1、mk-2、mk-3……m1、m0), 多项式m(x)可表示为
m(x) = mk-1xk-1+ mk-2xk-2 +……m1x1+ m0x0   ------------------------------------------------------------------------ 式(1)
用多项式g(x)的最高次幂R对应的X乘以m(x),将得到式(2)
Xm(x) = mk-1xk+R-1+ mk-2xk+R-2 +……m1x1+R+ m0x0+R -------------------------------------------------------- 式(2)
将Xm(x) 模2除以g(x),得到多项式商为A(x),余数为r(x),即:
A(x)g(x) = Xm(x) +r(x) -----------------------------------------------------------------------------------------------------式(3)
余数多项式r(x)可表示为
r(x) = rR-1xR-1+ rR-2xR-2 +……r1x1+ r0x------------------------------------------------------------------------------------式(4)
将式(2)和式(4)代入式(3)得
A(x)g(x) = mk-1xk+R-1+ mk-2xk+R-2 +……m1x1+R+ m0x0+R  + rR-1xR-1+ rR-2xR-2 +……r1x1+ r0x0   --------式(5)
式(5)对应的码组为K+R位,即:
N = (mk-1+ mk-2 +……m1+ m0  + rR-1+ rR-2 +……r1+ r0) ------------------------------------------------------------式(6)              
从M到N就是CRC的编码过程mk-1+ mk-2 +……m1+ m0  为k位信息码;rR-1+ rR-2 +……r1+ r0为R位校验码。
在信息接收端,将接受到的K+R位码除以相同的多项式g(x),根据式(3)所产生的余数为0,则接受到的数据信息正确无误,否则则认为信息在传输过程中产生的误码。
根据式(1)~式(6),CRC编码必须进行模2除运算,CRC的校验位就是模2除得到的余数,如果余数用寄存器的存数表示,模2除用异或门表示,那么通用的CRC串行电路就可以同图6.2所示的电路来实现。

七、LFSR(线性反馈移位寄存器)的深入解析

在计算过程中,线性反馈移位寄存器是这样一种移位寄存器:它的输入位是之前状态的一个线性函数。如图7.1
蓝色方框位为输入位,而之前的状态就是0110,显然,按照这个图示,bit0的下一次的状态是bit2,bit3,为自变量的函数值。 
图 7.1
那么这个函数是可以是什么呢?对于二进制算法无非就是一些门电路了,而最常用的线性函数则是异或门XOR。LFSR的初始化值称之为 seeD(形象点就是火种,比如7.1中的0110),而且对寄存器的操作也是确定的,那么由这个移位寄存器产生的数据流也同样是由当前的状态确定,另一方面,因为这个移位寄存器的位数是有限且确定的,所以数据流最终必然会进入一个重复的周期循环中
图  7.2

说明:1.因为函数的唯一性,所以有了箭头的唯一性。

     2.因为4位LFSR的限制,所以,不管数据怎么形成,最终总是难免会重新进入0110的状态。
     所以这个循环必然存在,正如如来佛对孙悟空说的,你怎么跑都跑不出我的五指山,当然实际情况并不是只有5个状                态。
    问题到这一步又会产生新的一个疑问?到底五指山有几根指头呢?答案是这样的——只要反馈函数选择适当,产生的随机序列将会跑很多的“指头”才能返回到初始状态,也就是说循环周期会很长。具体的例子请参考图7.3
   图 7.3
A 4-bit Fibonacci LFSR with its state diagram. The XOR gate provides feedback to the register that shifts bits from left to right. The maximal sequence consists of every possible state except the "0000" state.
CRC(循环冗余校验)与LFSR有很相似的地方,为什么这么说呢?继续分析,先来看一下一种特殊结构的LFRS。
Galois LFRS (伽罗瓦 线性反馈移位寄存器)
什么是伽罗瓦线性反馈移位寄存器呢?只是为了纪念一个数学家,他的名字叫伽罗瓦,知道这点也就够了,最主要的是掌握它的结构特性,它到底有什么特点呢? 对照图7.4所示
1>模块化;2>异或门插在内部;3>一对多的LFSR
图 7.4

它是一种轮流的结构,能够产生与传统LFSR相同的输出数据流。在讲述这个结构具体运作功能之前,有几个知识点需要建立。

1>什么叫抽头(taps)
在LFSR中影响下一个状态的bit位的位置叫做抽头,在7.1中就是bit2、bit3的位置,在图7.4中为[16. 14. 13. 11]。对应多项式为X16 +X14 +X13+X11+1,在这个多项式中有以下几点值得注意:
a.多项式最后的1不会对应某一个抽头,它对应输出位(最右边一位,即X0
        b.首位直接相连。
c.异或门输出到抽头位置,比如14.13.11;其中一个输入为抽头前一个位置,另一个输入对应输出位。
2>输入位,与输出位
LFSR中最左边的一位为输入位,而最右边的一位称为输出位。输出位与抽头进行异或运算后,数据整体向右移动一位。
运算规律总结(这点非常重要)
1.输出为1时,有异或门的位置,数据被翻转向右移向下一位置。没有异或门      的位置,数直接向右移向下一位置。
2. 输出为0时,有异或门的位置,数据没有被翻转而是直接向右移向下一位置。   没有异或门的位置,数直接向右移向下一位置。
因为输出只能是0或1,所以所有的运算都应该遵循这两条规则,如图7.5所示
     图 7.5

C语言代码实现:

图  7.6

说明:请注意硬件逻辑与C语言逻辑的区别

     C语言实现中是先把LFSR中的数据全部右移动一位,然后判断之前的输出位是否为1
     为1时,把抽头处的数据翻转,若为0则不变。

          这里就有个问题,在硬件电路中是先翻转然后再右移动1位;而在软件语言处理则是先右移1位,然后在相应位置翻转,而实际最终结果是一样的。其实现过程如图7.7所示
图 7.7

请对比图7.5与图7.7,分析硬件电路与C语言实现同一种算法的不同过程。

CRC模2运算及LFSR电路实现。
设需要发送的信息为M = 1010001101,产生多项式对应的代码为P = 110101,R=5。在M后加5个0,然后对P做模2除法运算,得余数r(x)对应的代码:01110。故实际需要发送的数据是101000110101110。
对应多项式为110101 即 x5+ x4+ x2+1。
模2除运算过程:
图 7.8
图7.6说明:
左边的步数(如第6步)表示除数与多项式模2减后的余数。
右边的步数(如第8步)表示上一步(如第6步)余数的最高位为0时,把余数左移动一位,并相应带入被除数的1位。
请与图7.7对照分析实际的电路实现过程。

第1步 ———— 第5步:被除数被移入LFSR
应用LFSR运算规律总结,可得到实际模2运算的一种电路图,具体执行请参考图7.9

                                                      图 7.9

CRC的校验原理及硬件、软件算法实现相关推荐

  1. 航芯x博联科技,一站式BMS方案(完整硬件+软件算法)免费评估申请

    上海航芯携手博联科技,全新打造一站式BMS方案,这是一款高性能的开发平台,集成了博联自研的基于锂离子电池管理系统BMS算法库以及上海航芯MCU ACM32F403,出色的性能及高可靠性使该产品可广泛适 ...

  2. tcp中的crc检验算法原理_CRC校验原理及其实现

    原文作者:王超的独立博客 出处:http://www.wangchaochao.top/2020/09/20/Principle-and-implementation-of-CRC/ 前言 最近的工作 ...

  3. CRC校验原理及STM32 IAP在线升级程序

    CRC校验原理: 什么是CRC校验? CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据传输检错功能,对数据 ...

  4. 简单易懂的CRC校验原理阐述

    不要跑,CRC没这么难!(简单易懂的CRC原理阐述) 网上大多的教材都是面向大佬的很多细节原理都没有讲清楚,对于我们这些新萌菜鸟们实在太不友好了.于是我写一篇相对轻松易懂的博客,希望能对学习CRC的朋 ...

  5. CRC校验原理和推导过程及Verilog实现(一文讲透)

    目录 一.CRC简介 1.1 CRC可检测的错误 1.2 CRC需要知道的基本名称 1.2.1 多项式公式 1.2.2 多项式简记式 1.2.3 数据宽度 1.2.4 初始值与结果异或值 1.2.5 ...

  6. CRC冗余校验举例和原理

    什么是CRC校验? CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并 ...

  7. CRC校验原理及CRC-8简单校验函数设计

    CRC校验原理及CRC-8简单校验函数设计 CRC为循环冗余校验码,是一种常用的.具有检错.纠错能力的校验码.通常发送方在发送的数据之后,附上其CRC校验码.接收方收到数据后,也做同样的CRC校验,得 ...

  8. CRC校验原理的完整学习

    前言:1.想直接用CRC的可以直接看程序,想了解原理,或者写程序的原理的.可以看按顺序看整篇 2.模二除法没有深入研究,所以模二除法待验证,也不去验证了,我花了一个月的业余时间写.3.本文只进行了16 ...

  9. 【个人学习总结】CRC校验原理及实现

    [个人学习总结]CRC校验原理及实现 一.CRC校验原理[理论篇] 1.硬核视频讲解[重点看,非常非常好!!!] 2.基础文章[略看] 3.深入文章!!![代码.查表法有点看不懂,跨越有点大] 理解重 ...

最新文章

  1. NodeJS、NPM安装配置步骤(windows版本)
  2. Spring、SpringMVC、SpringBoot、SpringCloud的联系和区别
  3. suse linux通过iso文件安装gcc
  4. Android最佳性能实践(二)——分析内存的使用情况
  5. C++:new 和 delete
  6. 【POI xls Java map】使用POI处理xls 抽取出异常信息 --java1.8Group by ---map迭代 -- 设置单元格高度...
  7. java 并发demo_《Java并发编程实践》中4.3.5章demo的一个疑问?
  8. python的智能算法_scikit-opt——Python中的群体智能优化算法库
  9. 数据结构(二)——堆
  10. HNOI2015 接水果
  11. rootkit 后门检查工具 rkHunter安装使用
  12. 修复关于DxO Nik Collection 2.0.8在Photoshop 2020不能显示中文问题
  13. 桥接模式、NAT模式和仅主机模式
  14. codeforces 596E Wilbur and Strings(DFS)
  15. 在线教育和线下教育的优劣势
  16. 【物联网】23.物联网开发之感测系统 - GPS(GNSS)
  17. 【Linux服务器架设】存储服务器构建原理-NFS
  18. 【STM32F407】第8章 ThreadX NetXDUO之TCP服务器
  19. 腾讯游戏王者荣耀扫码登录源码
  20. 刚刚毕业去京东技术三面+HR面,成功拿到40K offer就职京东

热门文章

  1. Linux命令能否运行在Windows上?
  2. 基于物联网的视频系统的实现
  3. 【夏季暴强减肥食谱】
  4. 【网络安全】什么是漏洞扫描?有哪些功能?
  5. python 爬虫之URLlib的编码和解码
  6. 15kw充电桩电源模块,三相电源模块电路图,仅供学习参考
  7. 基于JAVA-关爱留守儿童志愿者管理系统-计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  8. rpm及deb包管理
  9. docker部署jar包的几种方式
  10. 中国天河3号计算机排名,中国天河三号问世,一举超越美国顶点计算机,曾跻身全球领先序列...