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

您所在的位置:网站首页 什么是crc校验码 CRC校验原理和推导过程及Verilog实现(一文讲透)

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

2023-08-12 19:27| 来源: 网络整理| 查看: 265

目录 一、CRC简介1.1 CRC可检测的错误1.2 CRC需要知道的基本名称1.2.1 多项式公式1.2.2 多项式简记式1.2.3 数据宽度1.2.4 初始值与结果异或值1.2.5 输入值反转与输出值反转 二、CRC校验原理2.1 CRC校验计数基础知识2.2 CRC多项式的选择(除数的选择) 三、CRC校验码手动计算四、CRC校验算法推导与Verilog实现4.1 CRC校验公式推导过程4.2 CRC校验Verilog实现 五、相关工具六、Reference

一、CRC简介

CRC(Cyclic Redundancy Checksum)是一种纠错技术,代表循环冗余校验和。

数据通信领域中最常用的一种差错校验码,其信息字段和校验字段长度可以任意指定,但要求通信双方定义的CRC标准一致。主要用来检测或校验数据传输或者保存后可能出现的错误。

在数据传输过程中,无论传输系统的设计再怎么完美,差错总会存在,这种差错可能会导致在链路上传输的一个或者多个帧被破坏(出现比特差错,0变为1,或者1变为0),从而接受方接收到错误的数据。

为尽量提高接受方收到数据的正确率,在接收方接收数据之前需要对数据进行差错检测,当且仅当检测的结果为正确时接收方才真正收下数据。检测的方式有多种,常见的有奇偶校验、因特网校验和循环冗余校验等。

CRC检错能力强,开销小,易于用编码器及检测电路实现,从性能和开销上考虑均优奇偶校验和累加校验。在数据存储和数据通讯领域,多用CRC校验,不能发现的错误在0.005%以下。著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC-CCITT,WinRAR、NERO、ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF等也都用CRC作为检错手段。

另外,虽然CRC校验也可以纠错,但通常不会用,多数都是用于检错而不是纠错。

1.1 CRC可检测的错误 可检测出所有奇数个错误;可检测出所有双比特的错误;可检测出所有小于等于校验位长度的突发错误;相当大的概率检测出大于校验位长度的突发错误。

突发错误是指几乎是连续发生的一串错,突发长度就是指从出错的第一位到出错的最后一位的长度(但是,中间并不一定每一位都错)。

1.2 CRC需要知道的基本名称

这里需要知道几个组成部分或者说计算概念:多项式公式、多项式简记式、数据宽度、初始值、结果异或值、输入值反转、输出值反转、参数模型。

1.2.1 多项式公式

对于CRC标准除数,一般使用多项式(或二项式)公式表示,如下图中除数11011(poly值为0x1b)的二项式为G(X)=X4+X3+X+1,X的指数就代表了该bit位上的数据为1(最低位为0)

这里特别注意一下位数问题,除数的位数为二项式最高次幂+1(4+1=5),这个很重要 在这里插入图片描述

1.2.2 多项式简记式

通过对CRC的基本了解我们知道,多项式的首尾必定为1,而这个1的位置在下一步计算一定为0,所以就把前面这个1给省略掉了,出现了一个叫简记式的东西,如上例中除数11011的简记式为1011,很多看过CRC高级语言源码的人会知道,对于CRC_16标准下G(X)=X16+X15+X2+1(16#18005)的poly值实际上是8005,这里使用的就是简记式,以后见到的基本都是简记式

1.2.3 数据宽度

数据宽度指的就是CRC校验码的长度(二进制位数),知道了CRC的运算概念和多项式,就可以理解这个概念了,CRC长度始终要比除数位数少1,与简记式长度是一致的。

1.2.4 初始值与结果异或值

在一些标准中,规定了初始值,则数据在进行上述二项式运算之前,需要先将要计算的数据与初始值的最低字节进行异或,然后再与多项式进行计算。

而在结果异或值不为零的情况下,则需要将计算得到的CRC结果值再与结果异或值进行一次异或计算,得到的最终值才是我们需要的CRC校验码。

这里可以看出,初始值与结果值的位数要求与数据宽度一致。

1.2.5 输入值反转与输出值反转

输入值反转的意思是在计算之前先将二项式反转,然后再用得到的新值和数据进行计算。如对于G(X)=X16+X15+X2+1(16#18005),其正向值为1 1000 0000 0000 0101,反转值则为1010 0000 0000 0001 1,注意这里反转并不是按位取反,而是低bit位与高bit位交换位置

输出值反转则是将最终得到的CRC结果反转。

通常,输入值反转后的结果值也会是反转的,所以这两个选项一般是同向的。

二、CRC校验原理

CRC校验根本思想就是先在要发送的数据帧后面附加一个数(这个就是用来校验的校验码),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它是数据帧除以选定的CRC除数产生的余数

新帧到达接收端后,有两种方法比较传输是否出错: 一是用同样的方法对数据帧除以CRC除数产生的余数跟校验码相比,如果相同,则数据正确,否则数据错误; 二是对新帧除以CRC除数,如果余数为0,则数据正确,否则数据错误。

要校验的数据加上此数据计算出来的crc校验码组成新的数据帧,如下图所示。 在这里插入图片描述

2.1 CRC校验计数基础知识

CRC校验中的运算不是普通的运算,称为“模2运算”

模2加法和减法都是异或运算,例子如下: 1010+0110=1100,1010-0110=1100

模2乘法的定义: 0×0=0,0×1=0,1×0=0,1×1=1。 1011×101=100111 在这里插入图片描述 其中横线之间的累加过程,采用的是2进制加法,不进位。

模2除法,其实也是异或运算: 0/1=0,1/1=1。 1011/101=10,余数为100。 在这里插入图片描述

2.2 CRC多项式的选择(除数的选择)

对于CRC标准除数,一般使用多项式(或二项式)公式表示(参照节1.2.1和1.2.2),CRC除数位数越高,检错能力越强,通常是根据设计中的数据流大小来选择,比如数据流是8bit为一个包的话,则CRC校验位数选择8bit或者16bit等比较好。 在这里插入图片描述

三、CRC校验码手动计算

CRC校验码就是两个数相除的余数,而且余数位数要正好比除数少一位,即使MSB是0

下面举例说明CRC校验码手动计算过程: 对于数据1110 0101,指定多项式为x4+x3+x+1,则除数为11011。首先要将数据左移4bit(校验码的位数),然后再进行计算: 在这里插入图片描述 将上面计算得到的校验位补到数据的后面就构成了要发送的新数据帧: 在这里插入图片描述

四、CRC校验算法推导与Verilog实现

第三大节讲了如何手动计算CRC校验码,但如何在编程中实现,这就是个难题,网上很多文章都只是浅浅地谈了一下,并没有具体推导,如果对推导过程没兴趣的,可以直接翻到第五大节直接用



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3