赞
踩
本文是我在调试EMMC的FPGA实现过程中发现CRC的实现没有看明白,遂查询资料,结合自身理解写下此文,以此记录并供大家学习交流。
(CRC和反馈移位寄存器各自的基本原理就不讲了,直接上问题)
反馈移位寄存器通常分伽罗瓦和斐波那契两种,而查询资料,讲到用来实现CRC校验的都采用伽罗瓦式。
经过分析,图1结果的确能实现CRC的循环模2除法。然而,EMMC手册中给出的图却不同。
再看别人写的verilog程序(不知是不是官方程序,但经验证是正确的)。
verilog程序和手册逻辑图是相同的,那么,这与伽罗瓦LFSR有什么区别,为什么他也能实现模2除呢?
verilog实现CRC检验这里主要考虑串行输入情况,并行可类比。
首先分析伽罗瓦LFSR实现求CRC,这里用10101010这个数来除CRC7(X7+X3+1)。
这里,寄存器初始状态是全0,依次输入10101010,可以发现,当串行输入值全部输完之后,寄存器还要继续移位8次,得到的寄存器状态值才是最终的CRC值。
再来看EMMC手册的实现方式。
这里,寄存器的初始状态同样是全为0,但是,当串行值10101010输入完毕的同时,寄存器的值就是最终的CRC检验值。也就是说,输入的一串数据只要大于等于8位,那么虽然都可以停止下来读取寄存器的状态值,即为在此之前所输入的所有数据的CRC检验值。
图5中的原理,其实就是每输入一个值,就与上一次的余数相加之后再来做除法。这可以用十进制的一个除法来类比。
在十进制中,每次被除数的位数应当大于等于除数,但我们实际上也可以一位一位地去做除法,如图6所示,从高位到低位,每输入一个值,就做一次除法,这样子就可以保证,无论你输入的数据是多少位的,只要你输入停止,我就可以即刻告诉你当前已输入数据做除法的余数。所以,不得不佩服图2 3里面这种实现方法的简洁与有效性。
欢迎留言交流沟通!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。