当前位置:   article > 正文

CRC校验verilog实现原理和反馈移位寄存器的关系_crc 伽罗瓦 斐波那契 lfsr

crc 伽罗瓦 斐波那契 lfsr

本文是我在调试EMMC的FPGA实现过程中发现CRC的实现没有看明白,遂查询资料,结合自身理解写下此文,以此记录并供大家学习交流。
(CRC和反馈移位寄存器各自的基本原理就不讲了,直接上问题)

疑点:EMMC手册的CRC实现图与一般的反馈移位寄存器图为何不同?

反馈移位寄存器通常分伽罗瓦和斐波那契两种,而查询资料,讲到用来实现CRC校验的都采用伽罗瓦式。
图1
经过分析,图1结果的确能实现CRC的循环模2除法。然而,EMMC手册中给出的图却不同。
图2
再看别人写的verilog程序(不知是不是官方程序,但经验证是正确的)。
图3
verilog程序和手册逻辑图是相同的,那么,这与伽罗瓦LFSR有什么区别,为什么他也能实现模2除呢?

分析

verilog实现CRC检验这里主要考虑串行输入情况,并行可类比。
首先分析伽罗瓦LFSR实现求CRC,这里用10101010这个数来除CRC7(X7+X3+1)。
图4
这里,寄存器初始状态是全0,依次输入10101010,可以发现,当串行输入值全部输完之后,寄存器还要继续移位8次,得到的寄存器状态值才是最终的CRC值。
再来看EMMC手册的实现方式。
图5
这里,寄存器的初始状态同样是全为0,但是,当串行值10101010输入完毕的同时,寄存器的值就是最终的CRC检验值。也就是说,输入的一串数据只要大于等于8位,那么虽然都可以停止下来读取寄存器的状态值,即为在此之前所输入的所有数据的CRC检验值。
图5中的原理,其实就是每输入一个值,就与上一次的余数相加之后再来做除法。这可以用十进制的一个除法来类比。
图6
在十进制中,每次被除数的位数应当大于等于除数,但我们实际上也可以一位一位地去做除法,如图6所示,从高位到低位,每输入一个值,就做一次除法,这样子就可以保证,无论你输入的数据是多少位的,只要你输入停止,我就可以即刻告诉你当前已输入数据做除法的余数。所以,不得不佩服图2 3里面这种实现方法的简洁与有效性。
欢迎留言交流沟通!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/689538
推荐阅读
相关标签
  

闽ICP备14008679号