CRC校验verilog实现原理和反馈移位寄存器的关系

本文是我在调试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里面这种实现方法的简洁与有效性。
欢迎留言交流沟通!

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值