crc 校验错误_信道编码之循环冗余校验(CRC)

news/2024/11/8 3:25:21/

6b29e0d83abf086ac52192b8206d94e5.png

香农在其著名的论文《A mathematical theory of communication》中提出了信道编码定理,在传输速率小于信道容量的情况下,可以通过编码非常高效的提高传输的可靠性。我们现在所说的信道编码主要指的是纠错编码,比如卷积码,汉明码,Turbo码和LPDC码等等。本文主要研究在这些编码技术中比较常用的一种检验技术,即CRC。

CRC技术也是通过增加信道的冗余来提高传输的可靠性,不但能够起到校验的作用同时也具备一定的纠错能力。CRC算法的实现是基于循环码的,其数学原理在于通过发射端信息做一个多项式除法,得到余数作为检验位,然后将其加入原始信息的后面。在接收端提取发射端的数据位然后做相同的求余运算,再将计算出的校验位和发送数据带有的检验位相对比,若相同则说明数据是正确的,若不同说明数据是错误的。下图展示了一个简单的CRC结构:

7bcac858a2e625fdc648d33e8c42f214.png

前面说了CRC的原理是做除法取余数,这里就涉及了一个除法项,我们称之为生成多项式(Generator Polynomial),这个生成多项式是发送机和接收机两端约定好的一个二进制序列,在整个传输过程中保持不变。这个生成多项式同时满足如下几个条件:

  1. 最高位和最低为为1
  2. 当传输信息任何1位发生错误时,被其除后余数不为0
  3. 不同位数发生错误时,余数不同。
  4. 对于余数做除法,应使余数循环。

这里我们以一个简单的CRC-4为例,来解释生成多项式的作用和CRC校验的原理:

CRC-4的常用的一个生成多项式为:

即10011,其求余过程如下图所示:

4b689e4fbf7bf28ed178008cb9c051f7.png

最后的发送数据就为:

9b3e2512c24fbc96d3e2a8e4ab9d6a29.png

其实现的Matlab代码如下:

InputBits 

最终输出的结果为:

cdbad69c19fa0093d01963191018b6fb.png

和上面手算的相同。


软件仿真结束后我们就可以开始使用硬件进行实现了,我个人实现的思路是通过状态机来实现上述matlab代码中的循环运算,首先设定一个数据位宽长度计数器width cont,每当进来一次有效的数据,判断其最高位是否为1,若否则左移一位width cont减1,找到其最高位为1的数据后进入下一个状态进行xor运算,在xor状态中将数据和poly 序列进行xor运算,随后在进入刚才的判断状态,找到最高位为1的位置,直到width cont < poly序列的长度时结束计算,然后保存余数,跳入等待下一个有效数据计算的状态。正当我兴致冲冲打算去码代码的时候,发现了一个神奇的网站可以直接生成CRC校验的代码。。。

CRC Generation Tool​www.easics.com
86a3691f7f64b2ed1df7cf51bb90faa3.png

只要选择好poly多项式和数据位宽就可以直接生成verilog代码,十分方便:

67c844d37d5ac1a2f47b05f067e82d02.png

生成代码如下:

// polynomial: x^4 + x^1 + 1

这是个函数形式的代码,并且通过并行的形式直接可以计算出CRC的几个余数,效率简洁高效,我暂时还没看懂这个代码是什么原理,懂得大佬可以指点一下。

随后在发射端只要进行一个简单的CRC编码:

always 

接收端校验使用的方法为:

always 

具体的仿真结果这里就没有做了,等有空再补上~

参考文献

[1] 王栋. 基于CRC的多比特纠错算法研究与实现[D].西安电子科技大学,2013.


http://www.ppmy.cn/news/654873.html

相关文章

LabVIEW实现CRC校验

目录 1、内部控件计算CRC校验 2、公式节点计算CRC校验 CRC&#xff08;循环冗余校验&#xff09;&#xff0c;是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术&#xff0c;主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除…

Xilinx FPGA-CRC校验简介

一、CRC原理。 CRC校验的原理非常简单&#xff0c;如下图所示。 其中&#xff0c;生成多项式是利用抽象代数的一些规则推导出来的&#xff0c;而模2加&#xff08;也就是异或&#xff09;&#xff0c;是对应于有限域的除法。 二、CRC算法。 那么在FPGA当中&#xff0c;也有好几…

crc错误 modbus poll_请教个MODBUS RTU的CRC校验问题?-工业支持中心-西门子中国

一、转帖&#xff1a; Modbus RTU采用16位的循环冗余校验码(CRC)。通过一个对数据进行“或”运算以及移位运算的复杂程序&#xff0c;由主设备产生CRC&#xff0c;并且由接收设备进行检查。如果双方计算出的CRC值不符&#xff0c;从设备就会要求重新传送信息。 Modbus RTU协议分…

来搞清楚CRC校验的原理和实现

在MIPI_CSI-2协议里payload数据的校验使用了CRC校验&#xff0c;但是关于CRC校验只知其一&#xff0c;或者说只知的还不到其一&#xff0c;因此非常有必要搞清楚它&#xff0c;自然的我搜查了一些博主的文章尝试得到答案&#xff0c;最终在知乎前辈的一篇文章中找到了比较容易理…

java 文件crc校验_JavaCRC校验原理

一、基本原理 CRC检验原理实际上就是在一个p位二进制数据序列之后附加一个r位二进制检验码(序列),从而构成一个总长为n=p+r位的二进制序列;附加在数据序列之后的这个检验码与数据序列的内容之间存在着某种特定的关系。如果因干扰等原因使数据序列中的某一位或某些位发生错误…

crc 校验错误_资深工程师:图说CRC原理应用及STM32硬件CRC外设

在嵌入式产品应用中,常常需要应对系统数据在存储或者传输过程中的完整性问题。 所谓完整性是指数据在其生命周期中的准确性和一致性。这些数据可能存储在EEPROM/FLASH里,或者基于通信协议进行传输,它们有可能因为外界干扰或者程序错误,甚至系统入侵而导致被破坏。如果这些数…

解读CRC校验计算

个人随笔 (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 参考&#xff1a;http://www.sunshine2k.de/articles/coding/crc/understanding_crc.html 参考&#xff1a;https://en.wikipedia.org/wiki/Cyclic_redundancy_check 参考&#xff1a;https://www.cnblogs.com/…

7z解压crc错误_winrar压缩包提示crc校验和错误,文件被破坏的解决办法

winrar压缩包提示crc校验和错误&#xff0c;文件被破坏的解决办法 书法字体2020.05.09rar校验错误 当你辛辛苦苦下载下来的RAR压缩包解压文件时提示“crc校验和错误&#xff0c;文件被破坏...”&#xff0c;你的直觉肯定是&#xff1a;文件下载过程中损坏了&#xff0c;然后重新…