当前位置:   article > 正文

CRC原理及rtl高效实现方法

CRC原理及rtl高效实现方法

CRC 算法的基本思想是将传输的数据当做一个位数很长的数。将这个数除以另一个数。得到的余数作为校验数据附加到原数据后面。CRC算法中,将二进制数据流作为多项式的系数,然后进行的是多项式的乘除法。

如:

除法其实做的是异或运算,可以更简便的用表格表示,假设生成项为10011

转化为电路:

 数据从低位输入,若最高位数据为0则寄存器移位,若最高位数据为1则生成项与寄存器中的值异或后寄存器移位。因此,在生成项为10011时,待测数据移位一次结果如图所示:

但是这种方法每次只能计算1bit数,效率太低

我们把计算过程加长,计算4次后,寄存器中数据如图所示:

由此,可根据移位n次后寄存器中的数据与输入数据的关系,带入公式直接得到计算n次的CRC结果

注意:

对于一个1bit数a来讲,a^a=0,0^a=a

随着计算数据量的增加,上图方格中的数据量会成指数增长,因此需要去冗余。

对于dn,如果出现的次数为偶数,则删除;如果出现的次数为奇数,则保留;最后将方格中剩余的数相互异或。

对于CRC32,有固定的参数模型。

Name:”CRC-32”

Width:32

Poly:04C11DB7

Init:FFFFFFFF

RefIn:True

RefOut:True

XorOut:FFFFFFFF

Check:CBF43926

其中,Width表示CRC比特数。

Poly为32位生成项。

Init为算法开始时寄存器的初始化预置值,用十六进制表示。

RefIn若为False表示待测数据的每个字节都不用“颠倒”,若为True表示待测数据的每个字节在计算前都需要先“颠倒”,即字节顺序不用颠倒,但是每个字节内部的比特需要颠倒。如待处理数据为0x31 32 33 34,颠倒后为0x8C 4C CC 2C。

RefOut若为False表示计算结束后寄存器中的值直接进入XorOut即可,若为True,表示计算结束后整个寄存器中的值先颠倒再进入XorOut处理。如寄存器中的值为0x31 32 33 34,颠倒后的值为0x2C 22 4C 8C.

XorOut为十六进制数,该值与RefOut输出的值进行异或,即可得到最终CRC值。

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

闽ICP备14008679号