1.CRC简介

CRC全称循环冗余校验(Cyclic Redundancy Check, CRC),是通信领域数据传输技术中常用的检错方法,用于保证数据传输的可靠性。网上有关这方面的博客和资料很多,本文尽量简洁的梳理一下它的原理。后面还会结合自己的实践经验(不多),说一说如何使用verilog语言在FPGA中做CRC校验。感兴趣的朋友可以关注我后续的更新,一起交流学习!

CRC校验的基本思路是数据发送方发送数据之前,先生成一个CRC校验码,这个校验码可以是单bit也可以是多bit,并附在有效数据末尾,以串行方式发送到接收方。接收方接收到数据后,进行CRC校验,根据校验结果就可以知道数据是否有误。

CRC校验码的生成:将有效数据扩展后作为被除数,使用一个指定的多项式作为除数,进行模二除法,得到的余数就是校验码。

数据接收方的CRC校验:将接受的数据(有效数据+CRC校验码)扩展后作为被除数,用上述指定的多项式作为除数,进行模二除法,得到余数为0,则表示校验正确。

2.CRC校验过程

需要注意的是,CRC校验中的被校验数据在进行扩展之前,尽量以字节(8bit)为单位,如果数据不够一个完整的字节,可以高位补0。这一点在后面verilog实现时很关键。

2.1多项式选取

多项式的选择会影响检查错误的可靠性,检测错误的概率和多项式之间存在一定的数学关系,涉及到一些算法原理,这里不去深究,感兴趣的朋友可以查阅通信原理和线性编码相关书籍。

多项式的表达式:G(x)=x^n+x^(n-1)…+1,其中n>=1。

该表达式可以用2进制数表示,以便软件编程。例如多项式G(x)=x^5+x^3+x^2+1,用2进制表示就是101101;多项式G(x)=x^6+x^5+x^1+1,用2进制表示就是1100011。很容易看出规律吧。

有些资料里将多项式最高位的1省略,不过这里建议手动计算时保留这一位,免得出错。

通信上有一些常用的多项式,如下表示所示。这是前人总结好的,广泛使用的,可根据通信方式选择,例如CRC-5/USB算法对应的是用于USB通信的CRC多项式。

2.2求余数(发送方)

求余目的是得到CRC校验码。首先将有效数据扩展n位作为被除数,n是多项式的最高次幂,例如前面的多项式101101最高次幂是5(比2进制位数少1),则有效数据扩展5位。然后用多项式的2进制数用模2除法去除被除数,得到的余数是CRC校验码。

先搞明白模2除法运算机制。

模2除法可以借助逻辑上的异或运算移位实现,例如被除数是2进制的10001111,除数是1010,则模2除法求余数的计算过程如下图所示,得到商是101,余数是111。可以看出,每次计算,除数最高位的“1”都要和被除数最高位的“1”对齐,然后进行异或运算。得到的余数位数不小于除数,则移位后再次对齐、计算,直到余数位数(从最高位的1开始算)小于除数位数。

再看CRC校验码的计算过程。

假如发送的有效数据是10101010(注意是2进制),我们把它作为被除数。这里选择CRC-5/USB校验算法,多项式是x^5+x^2+1,对应2进制形式是100101。

首先对有效数据扩展5bit,也就是在后面添5个0,得到被除数1010101000000。然后进行模2除法,最终得到5bit(比多项式少1bit)余数11000,这就是CRC校验码。

把上面得到的校验码附在有效数据后面,构成数据1010101011000,然后发送给接收方。

2.3求余数(接收方)

数据接收方对数据(包含校验码)求余数,计算过程与上述完全相同。最终得到的余数为0,才能说明数据传输无误。

假如接收的数据无误,这里写出来接收方的计算过程:

最终得到余数为0,证明数据无误。

3.CRC校验计算实例

关于CRC校验码的计算,用上面比较繁琐的手算方式有助于了解计算过程,实际上现在有很多CRC计算工具,在线的和离线的都有。例如参考链接1的在线计算工具,可以用来验证自己手算或者自己写的校验代码结果是否正确。

这里用一个2byte数据做一次完整CRC校验,其中校验码的计算分别用手算和在线工具计算进行对比。

1)假设要发送的数据是0x8421,对应2进制为1000 0100 0010 0001;校验算法使用CRC-8,对应多项式是100000111。

2)手动计算求校验码:有效数据扩展后为1000 0100 0010 0001 0000 0000,计算得CRC校验码为00000101,16进制为0x05。(算到眼疼~

3)在线工具计算校验码:0x05,结果一致,说明手算无误。

4)发送数据后面附上校验码:1000 0100 0010 0001 0000 0101,即0x842105。

4)手动计算求接收方校验结果:0x00。

5)在线工具计算求接收方校验结果:0x00,接收无误。

参考链接:

1、http://www.ip33.com/crc.html

2、https://www.cnblogs.com/liushui-sky/p/9962123.html

CRC校验原理和verilog实现方法(一)的更多相关文章

  1. CRC校验原理和verilog实现方法(二)

    1 前言 在 前面的博客  CRC校验原理和verilog实现方法(一)  中,介绍了CRC校验的原理和手动计算过程.本文说一下我在学习CRC校验FPGA实现的一点心得体会. 2 线性反馈移位寄存器 ...

  2. CRC校验原理和verilog实现方法(三)

    1 代码生成 verilog实现CRC校验,可以充分发挥FPGA的硬件特性,即并行运算的能力. 具体实现方式,可以参考我上一篇博客,关键是用线性反馈移位寄存器表示出多项式,另外注意校验数据高位在先.然 ...

  3. 流水线技术原理和Verilog HDL实现(转)

    源:流水线技术原理和Verilog HDL实现 所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行.这使得操作执 ...

  4. 流水线技术原理和Verilog HDL实现

    所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行.这使得操作执行速度只与流水线输入的速度有关,而与处理所需的时 ...

  5. golang中浮点型底层存储原理和decimal使用方法

    var price float32 = 39.29 float64和float32类似,只是用于表示各部分的位数不同而已,其中:sign=1位,exponent=11位,fraction=52位,也就 ...

  6. Verilog语言实现并行(循环冗余码)CRC校验

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

  7. 用C#实现的几种常用数据校验方法整理(CRC校验;LRC校验;BCC校验;累加和校验)

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

  8. 常用校验码(奇偶校验码、海明校验码、CRC校验码)

    一.奇偶校验码 二.海明校验码 三.CRC校验码   计算机系统运行时,各个部之间要进行数据交换.交换的过程中,会有发生误码的可能(即0变成1或1变成0),由于计算机的储存是通过二进制代码来实现的的, ...

  9. CRC校验的C语言实现

    文章转自 循环冗余校验(CRC)算法入门引导 - Ivan 的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/liyuanbhu/article/details/7 ...

随机推荐

  1. es6 curry function

    es6 curry function // vuex getters export const getAdsFilterConfig = (state) => (spreader) => ...

  2. Fullscreen API All In One

    Fullscreen API All In One 全屏显示 https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API https ...

  3. webpack 5 模块联合

    webpack 5 模块联合 webpack 5 https://webpack.docschina.org/concepts/module-federation/ https://github.co ...

  4. React Hooks vs React Class vs React Function All In One

    React Hooks vs React Class vs React Function All In One React Component Types React Hooks Component ...

  5. after upgrade macOS Catalina bugs

    after upgrade macOS Catalina bugs 升级了macOS catalina后,碰到的 bugs? macOS 10.15.5 https://www.apple.com/m ...

  6. CSS transition & shorthand property order

    CSS transition & shorthand property order shorthand property https://developer.mozilla.org/en-US ...

  7. foreign language learning

    foreign language learning free online learning websites 多邻国 https://www.duolingo.com 忆术家 https://www ...

  8. Docker & Node.js

    Docker & Node.js https://nodejs.org/en/docs/guides/nodejs-docker-webapp/ https://docs.docker.com ...

  9. react & redux data flow diagram

    react & redux data flow diagram Redux 数据流程图

  10. JS Calendar API

    JS Calendar API js 如何获取当天是周几(一周的第几天) const date = new Date(); // Mon Mar 23 2020 15:15:36 GMT+0800 ( ...