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值。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值