CRC校验原理全面解读

1. 简介

在数字信号的通信中,常常会因各种因素导致传输错误,于是,聪明的科学家以及开发人员便设计,研发出了各种防止传输错误的方法。校验码便是最常见的一种。👍

最常见的校验码是奇偶校验码,仅仅只占一位,便可以根据数据中0或者1的数量对数据提供校验;然而奇偶校验的缺点也很明显,首先,它对错误的检测概率大约只有50%。也就是只有一半的错误它能够检测出来。另外,每传输一个字节都要附加一位校验位,对传输效率的影响很大(奇偶校验很简单,感兴趣的可以自己了解一下,不再赘述)。

奇偶校验优点也很明显,它很简单,因此可以用硬件来实现,这样可以减少软件的负担


CRC(Cyclic Redundancy Check)循环冗余检验,是一种用于检测数据传输中出现错误的校验方法。其特征是信息字段和校验字段的长度可以任意选定。它通过生成一个循环冗余校验码,将校验码附加到待传输的数据中,接收方再根据相同的算法对收到的数据进行校验,如果校验码无误,则可以判定数据传输正确。

CRC校验可以有效地检测传输过程中可能发生的位错误、丢失数据或假包等问题,是一种常用的数据完整性保护方法。其优点是简单高效,并且能够在较低的计算负载下提供较高的校验能力。

需要注意的是,CRC校验不能纠正错误,只能检测错误。在数据传输的场景中,如果发现数据传输存在错误,通常需要重新发送或采取其他的错误处理措施。

2. 原理

CRC能被广泛采用,肯定有其“过人之处”,让我们来看看它的庐山真面目。

2.1 CRC的发送与接收

发送方 给出需要传递的数据(Data),并定义多项式,以多项式得到(n+1)位除数(divisor),对数据的末尾补上n0,作为被除数,用除数去除被除数,得到的余数就是所需要计算的n位CRC校验码,将得到的CRC校验码拼接到原始数据的末端生成新的数据,将这个数据一并传给接收方。

接收方 将得到的一整块数据作为被除数,用在发送方得到的除数去除被除数,如果结果余数为0的话,代表数据的传输没有出错,得到的数据是正确且有效的。反之当前数据有误,将当前数据丢弃,并通知发送方重新发送。

还有另一种方法:发送方分别发送数据和CRC数据,结束方得到数据末尾补n0作为被除数,用多项式除数去除被除数,得到的余数如果作为接收方的CRC校验码,如果接收方得到的CRC数据和发送方发的CRC一致的话,同样也可以证明数据的传输是没有问题的(本文采用第一种方法)。

所谓的发送方和接收方,一般是指参与通信的两个芯片/ 模块。
在这里插入图片描述

2.2 CRC校验码的生成

CRC运算,也就是这种特殊的除法运算,必须要指定个除数,在CRC算法中,这个除数有一个专有名称叫做“生成多项式”。生成多项式的选取是个很有难度的问题,如果选的不好,那么检出错误的概率就会低很多。不过专家早已经考虑到了这个问题,给我们提供了好多个生成多项式可供选择。11001便是其中之一(生成多项式的要求之一就是最高位和最低位必须为1)。

假设我们现在需要传输一个8位二进制数据10110011。我们选择除数为11001,根据计算规则,在被除数后添加40
在这里插入图片描述
可以看到,计算结果为100,为了保证位数,在前面添加一个0,变成了0100,所以要发送的数据=原数据+CRC校验码,也就是101100110100

2.3 CRC校验码的校验

在接收方收到数据(其实是数据与CRC合并后的新数据)后,将其除以我们定义的除数,若结果为0,则说明结果没错,反之当前数据有误,将当前数据丢弃,并通知发送方重新发送。计算过程如下。
在这里插入图片描述
从上述例子来看,余数为0,说明数据传输没有问题。此时可对此次传输的数据做下一步处理,并准备接收新的数据。

3. 拓展问题

3.1 模2除法为什么等同于异或运算?

模2除法与算术除法类似,但每一位除的结果不影响其它位。只需要自己简单模拟一遍便可知道。
分成4中情况:

  • 0-0:这个结果自然是0
  • 1-1:同上,结果为0
  • 0-1:向高位借1,当2用,所以结果为1
  • 1-0:显然,结果为1
数据A0011
数据B1010
异或运算的结果1001

所以,我们可以得出结论,从结果上看,模2除法与异或运算是等同的。

3.2 为什么除数的位数和被除数补充的位数相差为1?

这个问题并不难回答,这和除数,也就是生成多项式的特征有关系,在特征多项式中,最高位和最低位都为1,而除法运算中,每次参与异或运算的两个数,最高位必然都为1(“被减数”最高位为零则位数不够,必须向低位借数值),这样一来,运算的结果/中间结果最高位为0,没有实际意义,所以余数最多也会比除数少1位。

3.3 为什么CRC校验码不能纠正错误,只能检测错误?

  1. CRC校验码是通过需要发送的原数据计算得来的,为了保证通信效率,一般CRC校验码的长度会比原数据短(校验码是“辅助数据”)。但每一位只能表示0和1,且原数据的值分布一般没有规律,所以不可能存在这样的逆变换,使CRC校验码生成原数据。
  2. 即使存在这样的逆变换,又如何保证CRC校验码传输正确呢?

综上所述,CRC校验码不能纠正错误,只能检测错误。且一般情况下,用到CRC校验码的场景,通信速率都很高,所以在检出错误数据的时候,重新传输是一种简单便捷的方法。

4. 总结

CRC校验在CAN通信中用得比较多,对于确保数据传输的准确性起着非常重要的作用。

参考链接(均来自CSDN):

  1. 循环冗余校验(CRC)算法入门引导
  2. CRC校验原理及步骤
  3. 【科普】CRC校验(一)什么是CRC校验?
  • 5
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: FPGA CRC校验原理是使用循环冗余校验算法对数据进行校验。CRC校验通常用于数据传输或存储时,以防止数据在传输或存储过程中被破坏或篡改。在FPGA中,CRC校验器通常是由硬件实现的模块,可以通过FPGA的可编程逻辑进行设计。 CRC校验原理是将需要校验的数据分成一定大小的数据块,每个数据块都传送时进行校验。校验数据块时,FPGA会计算数据块的CRC码,然后与数据传输或存储设备中存储的CRC码进行比较。 在FPGA中,校验数据块的过程通常由硬件实现的模块完成。该模块会输入需要校验的数据块和预定义的CRC码种子,然后按照预定义的算法进行计算。计算完成后,该模块会输出新的CRC码,然后FPGA会与存储或传输设备中的CRC码进行比较,以确定数据块是否正确。 总的来说,FPGA CRC校验是一种用于数据传输或存储过程中数据校验的方法。在硬件实现中,FPGA会根据预定义的算法对数据进行计算,并与存储或传输设备中存储的CRC码进行比较,以确保数据传输或存储的可靠性。 ### 回答2: FPGA CRC校验是一种基于硬件的数据校验方法,它通过将待校验的数据流和预定的校验码值一起输入到FPGA芯片中,利用硬件电路实现CRC计算。CRC校验是一种能够检测数据传输过程中是否发生了错误的技术,它可以检测到单比特错、双比特错甚至更多比特的错。 具体来说,FPGA CRC校验的实现原理是通过将输入的数据流和预定义的CRC校验码一同送入CRC电路中,经过一系列的移位、异或和反转操作得到校验结果,然后将校验值与输出的校验结果比较,如果出现差错,则表示数据包出现错误。FPGA CRC校验是一种高效、稳定的校验方法,它广泛应用于数字通信、网络传输、存储设备等领域。 总之,FPGA CRC校验是一种依靠硬件实现的数据完整性校验方式,它通过预定义的校验算法计算出数据包的校验值,并与实际校验结果进行比较,从而检测数据传输过程中是否发生了差错,保证数据在传输过程中的安全可靠。 ### 回答3: FPGA作为一种灵活可编程的集成电路,可以灵活地实现各种数字电子系统中的处理、控制、通信、计算等功能,其中CRC校验是一种应用比较广泛的数据校验协议。其原理是在传输数据的时候,通过添加一个校验码到数据后面,接收端可以通过对数据和校验码进行计算来验证数据的准确性。 在FPGA中实现CRC校验,通常采用硬件的实现方式,首先通过CRC算法计算生成CRC校验码表,然后将该表存储在FPGA中。在数据传输过程中,FPGA通过对数据和CRC校验码表进行异或运算,得到计算结果,并将该计算结果加到原始数据的末尾,然后将数据和校验码一起发送。接收端接收数据后,同样对数据和CRC校验码表进行异或计算,并将其与接收到的校验码进行比较,如果相同则表明数据传输正确,否则需要重新传输。 FPGA实现CRC校验具有高速、低功耗、可靠性强等优点,特别适合高速数据传输领域,如网络通信、存储设备、无线通信等领域。此外,FPGA还具有可编程性强、适应性广泛等优点,可以根据不同应用需求进行优化设计,提高数据的可靠性和传输速率。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值