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. git branch & git remote branch

    git branch & git remote branch $ git branch -h usage: git branch [<options>] [-r | -a] [-- ...

  2. js camelCase formatter

    js camelCase formatter 驼峰命名 转换器 'A'.charCodeAt(); // 65 'Z'.charCodeAt(); // 90 'a'.charCodeAt(); // ...

  3. Swift 5.3 All In One

    Swift 5.3 All In One refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  4. 神奇的数学学习网站 All In One

    神奇的数学学习网站 All In One magical math websites {{uploading-image-923797.png(uploading...)}} Math is Fun ...

  5. Apache 低版本不支持 WebSocket

    Apache 低版本不支持 WebSocket Apache HTTP Server Version 2.4 Apache Module mod_proxy_wstunnel https://http ...

  6. Docker使用指南

    上文简单介绍了docker,这边记录一下docker的使用. 一.Docker启停 1.启动docker systemctl start docker 2.关闭docker systemctl sto ...

  7. 总结 接口 final关键字 abstract关键字 static 关键字

    final关键字: * final 修饰的方法能被继承 不能被重写 * final修饰的类不能被继承 * final 修饰的变量(基本类型)不能被修改 * final 修饰的成员变量必须初始化 局部变 ...

  8. 你真的懂 MP4 格式吗?

    MP4 文件格式又被称为 MPEG-4 Part 14,出自 MPEG-4 标准第 14 部分 .它是一种多媒体格式容器,广泛用于包装视频和音频数据流.海报.字幕和元数据等.(顺便一提,目前流行的视频 ...

  9. Vue学习笔记-API调试工具--->国产apipost按装(比postman好按装好用)

    一  使用环境: windows 7 64位操作系统 二   Vue学习笔记-API调试工具--->apipost按装 1.下载: https://www.apipost.cn/ (比postm ...

  10. vue子组件的样式没有加scoped属性会影响父组件的样式

    scoped是一个vue的指令,用来控制组件的样式生效区域,加上scoped,样式只在当前组件内生效,不加scoped,这个节点下的样式会全局生效. 需要注意的是:一个组件的样式肯定是用来美化自己组件 ...