crc生成多项式怎么算

您所在的位置:网站首页 循环冗余校验标准crc-16的生成多项式 crc生成多项式怎么算

crc生成多项式怎么算

2023-08-09 23:46| 来源: 网络整理| 查看: 265

IC君的第38篇原创文章

上一篇文章讲述了CRC 的数学原理和通项式选择,大家可以点击下面的链接阅读:

想知道数据传输的正确性?CRC算法来检查

这一篇文章聊一聊CRC算法的硬件电路实现:串行电路和并行电路。

下面的内容还是IC君的朋友文武写的,IC君稍微做了优化排版和少量的编辑工作提升大家的阅读体验。

1

 CRC硬件电路的实现很简单,下图给出教科书上任意生成多项式G(X)=gnXn+gn-1Xn-1+···+g1X+g0的电路结构:

87432e851a683a73c49c5dd717b6ca24.png

为什么从右边输入data?

因为CRC是除余数,所以从右边输入数据,相当于把信息位data先左移位。

以简单的CRC8举例,多项式G(x)=X8 +X7 +X6 +X4 +X2 +1 的电路示意图如下:

29eb7610d941759969ca423247f35db6.png

对应的Verilog code代码如下:

2813b3978071f3c09bb5a3bef7df2b70.png

上面的Verilog code上用了LFSR这种变量声明,有没有感到奇怪?

LFSR(线性移位寄存器)和CRC的算法很像的,有兴趣的可去看看LFSR的相关知识。

一位串行输入的CRC电路实现方法很简单,每周期的组合逻辑链路简单延时短。它的缺点是输入位宽只有一位,所以一个clock周期只能算一位,如果是64bit的信息位就要64个clock周期。如果需要传输的位数比较多,会对系统的性能产生比较大的影响。

假设要把输入位宽变成8位(byte)输入,电路将是什么样的呢?并行的CRC其实也简单,可以用提前抽取的概念来实现。

用下图来解释一下,CRCM有M个校验位就是有M个寄存器,现在把输入变成N位。

ae72629f9d42bf9f9778b6c7ea8f8653.png提前抽取就是通过关系函数得到下一个clock寄存器的输入nxt_crc[M-1:0]:

关系函数CN如下:

nxt_crc=CN(crc_out,data),

crc_out是前一个clock的寄存器输出;

data是当前的输入数据;

函数CN就是一个组合逻辑网络,也可叫做所谓的scramble。怎样得出这个CN呢?如果数字信号处理学的好,可以去推导一下。网上有各种算法,很多很多。下面介绍一种方法。

2

以CRC8,G(x)=X8 +X7 +X6 +X4 +X2 +1为例子产生一个CRC8_8的CN,下面直接给出CRC8_8的Verilog code,后面讲怎么得到这个CN。

c85e62d0fee70f3ff6b9aaea821eaaaf.png

上面的Verilog code 的代码是由下面的矩阵得出的

795dabfcc799d4c783c7703fa2194188.png

把N_in作为数据,M_in作为CRC的上一个clock的值就有:

LFSR_S[0] =DATA[0]^DATA[1]^DATA[3]^DATA[6]^DATA[7]^LFSR_N[0]^LFSR_N[1]^LFSR_N[3]^LFSR_N[6]^LFSR_N[7];

怎么获得这个矩阵呢?

CRCM_N(M_in,N_in)= CRCM_N(M_in,0)+ CRCM_N(0,N_in)

86153451c53f7f462da798cead7f7cbb.png

可以用crc8_parallel(N_in):输入data_in 的是8‘b00000001,得到crc8的值,就是H1的第一行8’hd5;输入data_in 的是8‘b00000010,得到crc8的值,就是H1的第二行8’h7f;以此类推。计算出上面矩阵H1=[]NxM。计算H2=[]MxM的方法和H1是一样的。

有上面的矩阵就有CN函数。有了CN就可很容易得出CRC硬件电路了。上面的方法其实可写成一个脚本,实现任意多项式任意位宽输入的并行CRC硬件电路。www.OutputLogic.com 有自动生成器,不过大家最好自己写一写。提醒:上面有LSB和MSB谁先输入到并行CRC里面去的问题?琢磨一下吧!

最后给出CRC8 ,G(x)=X8 +X7 +X6 +X4 +X2 +1的参考文献:

[1] A Practical Parallel CRC Generation Method, www.OutputLogic.com

[2] Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks ,Philip Koopman, Preprint: The International Conference on Dependable Systems and Networks, DSN-2004.

更多源代码可以在知识星球获得哦。

明天公众号可能要推一篇关于人工智能的广告,到时候感兴趣的同学可以点进去看一看,据说有一些免费课程。

广告费用于给IC君团队一些小小激励,激发大家的原创热情,也希望大家踊跃投稿(给稿费哦),另外公众号以后也可以搞一些活动回馈给大家。

写一篇原创文章非常不容易,麻烦大家转发、分享、点“在看”哦,谢谢!

往期精彩回顾

18495208237986111d975a39ae07983d.png

想知道数据传输的正确性?CRC算法来检查

静态时序分析和动态时序分析的比较和转换

IC面试中常被问到——跨时钟域信号如何处理?

112208629a8fd91d12b7c9b8d2741734.png


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3