<数字小IP设计> 六、Verilog实现CRC校验算法,CRC32/16/12/8 verilog实现

一,CRC介绍

CRC(Cycle Redundancy Check),是一种核对数据正确性的高效的验证手段。其特点是检错能力强,开销小,易于用编码器及检测电路实现。
CRC算法是从模二除法演化而来,目前校验算法有CRC4、CRC5、CRC6、CRC7、CRC8、CRC16、CRC32、CRC64等,其中常用的就是CRC8、CRC16、CRC32和CRC64.
剩下的啰里啰唆其实都和算法本身有关,做硬件的我们其实能用到的东西很有限。但是有没有必要了解呢,还是有必要的,这里我推荐大家去知网下载一些硕博士论文看,上面一般会有CRC算法的前世今生,十分详细。

二,我们需要了解的基础知识

1, crc的多项式
crc8,crc16以及crc32指的一般是算法用到的多项式的长度(位数),比如crc8的多项式0x07,换算成二进制就是x8+x3+x2+x+1,按理说在电路中代表即九位二进制数10000_0111,但是因为crc所用多项式的最高位必然为1,所以我们开心的省略最高位,仅以剩下的位数作为多项式内容的表示,因此crc8的一个多项式本应为0x107,但是我们实际应用中表示为0x07.
当然有些小伙伴又会疑惑了,在实际电路中我们还是要把最高位的运算搞出来,那这样省略有什么意义呢,其实在电路中这样的省略当然是有意义的。

  1. 在电路中,我们所用总线宽度是有固定尺寸的,一般为8的整数倍,比如8bits (2bytes),16bits,32bits,64bits。如果保留crc多项式的最高位,那么它总是会多占用高byte中的0位。这种占用会导致设计者需要单独为类似的所有需求都增加一个单独的byte,从而导致这个byte的高7位浪费。如果用到crc的多了,这会导致设计电路的面积、功耗的增加,同时导致可靠性的下降。这个在设计中是需要尽量避免的。
  2. 在传输过程中,所有的总线都需要进行类似扩展一个byte的操作,又会导致总线效率的降低,同时如果在32位的系统中进行crc32的运算,我们每一次运算都需要总线搬运两次,而且第二次纯浪费,这个对整个系统的效率都是很大的影响
  3. 在运算中我们也并不需要将最高位显示出来,我们可以假设两种情形,如果需要运算的数据最高位为1,那么他与多项式的计算结果来看,最高位显然是0,完全可以无视。如果需要运算的数据最高位为0.那么他本身就不需要与多项式进行运算,我们可以直接进行左移(为什么左移这个建议百度,不详细说了)。

2,crc在数字电路中的设计需求。
在工作中我发现,作为设计师并不能天马行空的去精简PL或者说一些需求提出者的“模糊”需求,而是应该充分的考虑应用并对这些模糊的需求进行一般化的解决。具体在我们的crc设计中,crc 的模块一般具有多项式可配置,输入及初始值可配置,在crc运算结果中增加可选的异或运算进行校验的增加,为方便适应各种芯片的大小端口寻址增加的输入翻转、输出翻转等功能。为实

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值