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位)

在这里插入图片描述
上图为计算流程,图中很多次涉及到被除数的首位为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的步骤即可。

本文参考:

  1. B站视频
  2. 其他人的博客
  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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还具有可编程性强、适应性广泛等优点,可以根据不同应用需求进行优化设计,提高数据的可靠性和传输速率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值