CRC冗余校验的原理和FPGA实现思路

这篇具有很好参考价值的文章主要介绍了CRC冗余校验的原理和FPGA实现思路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

CRC校验码,顾名思义是用于校验的。它可以用于检测数据传输过程中是否出现错误(某些位,或某几位,或者某块区域位错误),反正 可以知道数据出错了,但是不能纠错

CRC校验,本质上是模2除法求余。将发送信息M当做被除数,发送方和接收方共同约定一个除数G

(可以随机选择,也可以使用国际标准,但是最高位和最低位必须为1)

,然后求余R,该余数R即为CRC值。
然而在 verilog实现的时候却并不会通过最原始的模2除法实现,而是用串行CRC电路来实现,这本质上也是一种模2除法。下面我将指出两种方法的一致性以便于记录和理解:

在描述CRC校验的流程之前,需要先描述一下模2除法

模2除法

模2除法可以说和二进制除法没什么关系,千万不要搞混了。它的计算其实也很简单,就是简单的移位和异或处理。

模2除法有三个准则:

  • 被除数的首位为1,则商的该位为1。被除数的首位为0,则商的该位为0。
  • 减法运算时需要模2减,即异或操作。
  • 当被除数的位数小于除数,计算结束。

为便于理解,我们举个例子。
假设原始数据M为 1101011011
多项式为 x 4 + x + 1 x^4 + x + 1 x4+x+1
可以得到除数G为 10011

首先在原始数据后面添加4个0(因为多项式是5位,添加5-1=4位)

crc校验fpga,通信链路基带侧,fpga开发,数字通信,算法
上图为计算流程,图中很多次涉及到被除数的首位为0,则该商的该位为0的计算时,都略过了,只有最后一次没有略过,但是依然是便于理解的。
最终得到商为 1100001010
余数R为 1110
因为多项式是5位的,所以得到的校验位是5-1=4位的。余数R恰好为4位,无需在前面补0。因此哦我们得到校验位就是1110。
CRC模块的输出就是1101011011 1110

串行CRC电路

在FPGA中该如何实现CRC校验的工作呢?仔细观察上面的操作,可以发现,CRC校验码的计算,相当于是把多项式和原始数据左对齐,然后按位进行异或、再把多项式右移到新的1处,如此重复的操作,最终可以得到一个余数。
在电路里,右移和异或都是很基本的操作,只要了解该原理,我们就可以尝试复现该算法。

描述不清,我们直接看刚刚的例子
假设原始数据M为 1101011011
多项式为 x 4 + x + 1 x^4 + x + 1 x4+x+1
可以得到除数G为 10011
老样子,首先在原始数据后面添加4个0(因为多项式是5位,添加5-1=4位)。

  • 第一步
1 1 0 1 0 | 1 1 0 1 1 0 0 0 0   //原始数据串
1 0 0 1 1                       //多项式,左对齐,二者进行按位异或
-------------------------------
0 1 0 0 1                       //第一次异或结果
  • 第二步
0 | 1 0 0 1 1 | 1 0 1 1 0 0 0 0   //第一次异或结果和原始数据串中未操作的数合并得到新的数据串
    1 0 0 1 1 	                  //多项式右移到下一个1处,再次按位异或
-------------------------------
    0 0 0 0 0                     //第二次异或结果
  • 第三步
0 0 0 0 0 0 | 1 0 1 1 0 | 0 0 0   //第二次异或结果和原始数据串中未操作的数合并得到新的数据串
              1 0 0 1 1 	      //多项式右移到下一个1处,再次按位异或
-------------------------------
              0 0 1 0 1           //第三次异或结果
  • 第四步
0 0 0 0 0 0 0 0 | 1 0 1 0 0 | 0   //第三次异或结果和原始数据串中未操作的数合并得到新的数据串
                  1 0 0 1 1 	  //多项式右移到下一个1处,再次按位异或
-------------------------------
                  0 0 1 1 1       //第四次异或结果
  • 第五步
0 0 0 0 0 0 0 0 0 0 1 1 1 0   //第四次异或结果和原始数据串中未操作的数合并得到新的数据串
                  1 0 0 1 1   //多项式右移到到下一个1处,发现移不过去,于是结束
-------------------------------                           

得到最终结果之后,因为一开始在数据串后面添加了4个0,所以这里保留低4位,得到校验码1110,加在数据串后面得到1101011011 1110。

仔细看完这一步操作,细细思索就会发出疑问:多项式右移到下一个1处 这一关键的步骤是怎么实现的呢?

其实很简单,我们只需要记住:对于10011这个多项式来说,和数据做异或就是把数据的最高位(即第五位)和低两位(即第一第二位)做翻转。

当数据为0开头的时候,我们不想翻转。当数据为1的时候我们想要翻转。那我们就把输入数据的最高位也加入运算当中去即可(众所周知,在异或操作中,1代表翻转,0代表不翻转)

譬如当多项式右移到0开头的位置的时候

0 1 1 1 0   //某数据串
1 0 0 1 1   //多项式
-------------------------------
1 1 1 0 1                           

这个时候应该是跳过的,为了让数据恢复原样,我们就把结果的最高位和低两位与原始数据的最高位取反后的结果进行异或即可

1 1 1 0 1   //某数据串
1     1 1   //多项式
-------------------------------
0 1 1 1 0                          

而当多项式右移到1开头的位置的时候

1 1 1 1 0   //某数据串
1 0 0 1 1   //多项式
-------------------------------
0 1 1 0 1                           

这个时候应该是正确的,但是我们也同样可以把结果的最高位和低两位与数据的最高位进行异或

0 1 1 0 1   //某数据串
0     0 0   //多项式
-------------------------------
0 1 1 0 1                          
总结

比较模2除法和CRC串行电路两种方法,其实大同小异。但是如果不从电路的视角来理解,会觉得二者差异很大。个人比较偏向于CRC串行电路的理解方法,直观且便于实现。
解CRC就重复加CRC的步骤即可。

本文参考:文章来源地址https://www.toymoban.com/news/detail-716940.html

  1. B站视频
  2. 其他人的博客

到了这里,关于CRC冗余校验的原理和FPGA实现思路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从原理到代码理解CRC循环冗余校验

    概述:本文详细介绍了CRC循环冗余计算的数学原理,算法中使用的参数说明,并以Modbus协议中的CRC-16算法为例,进行手算验证,同时提供LabVIEW和C语言的直接计算CRC-16 值的代码以及C的查表计算CRC-16代码和代码原理的说明。 初次接触CRC校验是因为项目需要上位机软件来记录P

    2024年02月04日
    浏览(30)
  • 循环冗余校验(CRC)的计算

    循环冗余校验(Cyclic Redundancy Check,CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。 若信息码字为111000110,生成多项式 x 5 x^5 x 5 + x

    2024年02月11日
    浏览(37)
  • CRC(循环冗余校验码的校验方法)

    5个关键点: 1.信息码:即给出要校验的二进制码 2.生成多项式:一般多项式会给,从最高位的指数位数就可以得到有几个校验码;如果没给多项式,肯定会给个多项式二进制码,根据它来推就行(具体推的规律,下面会讲) 3.校验位:由多项式的最高位指数得出 4.多项式对应

    2024年02月08日
    浏览(30)
  • 【STM32】CRC(循环冗余校验)

    (1)CRC(Cyclic Redundancy Check),循环冗余校验 (2) 什么是校验,为什么需要校验:数据传输,数据存储过程中需要使用到的 (3)什么是 冗余:表示比实际上要传输的数据还要多 (4)校验实现的关键: 冗余少、运算少、识错纠错能力强 (有些算法只能识别错误但是无法纠错) (1)(

    2024年02月03日
    浏览(39)
  • JAVA获取CRC(即循环冗余校验)

    前言:网上查了很多,CRC计算时,除数长度太长无法计算,所以写此文章。希望大家喜欢!     CRC(Cyclic Redundancy Check),即循环冗余校核,是一种根据网络数据包或电脑文件等数据产生简短固定位数 校核码 的快速算法。      CRC校验本质上是选取一个合适的 除数 ,要进行校

    2024年02月06日
    浏览(29)
  • 【基础知识】CRC(循环冗余校验)直接计算和查表法

    校验是什么,个人理解就是经过一个算法,使用大量数据(几MB的数据)生成较小长度的一串信息(如16Bit),并切要做到 原数据不同时,生成的信息大概率不同(不是加密算法不考虑刻意造数据的情况) 原数据中任意一个或几个数据出现错误时,生成的信息不同(所有的原信

    2024年02月05日
    浏览(41)
  • CRC计算流程详解和FPGA实现

            CRC校验,中文翻译过来是:循环冗余校验,英文全称是:Cyclic Redundancy Check。是一种通过对数据产生固定位数的校验码,以检验数据是否存在错误的技术。         其主要特点是检错能力强、开销小,易于电路实现。像网络通信上,就使用了CRC32进行数据校验。

    2024年04月12日
    浏览(21)
  • 计算机网络:数据链路层之差错控制、奇偶校验码、CRC循环冗余码、海明码

    带你度过期末难关 文章目录 一、差错控制 1、冗余编码 2、编码VS编码 二、检错编码 1、奇偶校验码 2、CRC循环冗余码 三、纠错编码————海明码 海明距离 1、确定校验码位数r 2、确定校验码和数据的位置 3、求出校验码的值 4、检错并纠错 纠错的方法一: 纠错方法二: 总

    2024年02月04日
    浏览(42)
  • 【Verilog】CRC校验码生成器原理及verilog实现

    目录 一、CRC的基本原理  二、CRC生成步骤 2.1举个栗子 三、Verilog实现 四、参考资料 4.1 CRC在线计算器 CRC :Cyclic Redundancy Check循环冗余校验码         将被处理的报文比特序列当做一个二进制多项式A(x)的系数,任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和

    2024年02月11日
    浏览(25)
  • CRC校验码生成逻辑的实现原理详解——结合C语言和Verilog语言代码分析

    因为前段时间用到CRC校验码,所以在网上找到了很多有关CRC校验码计算原理以及生成CRC校验码的代码实现(包括C语言和Verilog语言的实现)的文章,但关于CRC校验码代码实现的原理未能找到相关文章,于是自己结合C语言和Veirlog语言的实现代码以及CRC校验码的计算原理,对CR

    2023年04月22日
    浏览(87)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包