『一文讲透』CRC校验原理和推导过程及Verilog实现

路科验证 2024-06-11 12:00

一、CRC简介


循环冗余校验和(Cyclic Redundancy Checksum, CRC)是一种检错技术。


数据通信领域中最常用的一种差错校验码,其信息字段和校验字段长度可以任意指定,但要求通信双方定义的CRC标准一致。主要用来检测或校验数据传输或者保存后可能出现的错误。


在数据传输过程中,无论传输系统的设计再怎么完美,差错总会存在,这种差错可能会导致在链路上传输的一个或者多个帧被破坏(出现比特差错,0变为1,或者1变为0),从而接受方接收到错误的数据。


为尽量提高接受方收到数据的正确率,在接收方接收数据之前需要对数据进行差错检测,当且仅当检测的结果为正确时接收方才真正收下数据。检测的方式有多种,常见的有奇偶校验、因特网校验和循环冗余校验等。


CRC检错能力强,开销小,易于用编码器及检测电路实现,从性能和开销上考虑均优奇偶校验和累加校验。在数据存储和数据通讯领域,多用CRC校验,不能发现的错误在0.005%以下。著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC-CCITT,WinRAR、NERO、ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF等也都用CRC作为检错手段。


另外,CRC校验多数都是用于检错而不是纠错


1.1 CRC可检测的错误


 •  可检测出所有奇数个错误;

 • 可检测出突发长度

 •  大部分突发长度=n-k+1的错误可以检测出,其中不可检出的错误占2-(n-k-1);

 •  大部分突发长度>n-k+1的错误可以检测出,其中不可检出的错误占2-(n-k)。


其中,n为信息码+监督码总长度,k为信息码长度。

突发错误是指几乎是连续发生的一串错,突发长度就是指从出错的第一位到出错的最后一位的长度(但是,中间并不一定每一位都错)。


1.2 CRC需要知道的基本名称

这里需要知道几个组成部分或者说计算概念:多项式公式、多项式简记式、数据宽度、初始值、结果异或值、输入值反转、输出值反转、参数模型。


1.2.1 多项式公式

对于CRC标准除数,一般使用多项式(或二项式)公式表示,如下图中除数11011(poly值为0x1b)的二项式为G(X)=X4+X3+X+1,X的指数就代表了该bit位上的数据为1(最低位为0)


这里特别注意一下位数问题,除数的位数为二项式最高次幂+1(4+1=5),这个很重要


1.2.2 多项式简记式

通过对CRC的基本了解我们知道,多项式的首尾必定为1,而这个1的位置在下一步计算一定为0,所以就把前面这个1给省略掉了,出现了一个叫简记式的东西,如上例中除数11011的简记式为1011,很多看过CRC高级语言源码的人会知道,对于CRC_16标准下G(X)=X16+X15+X2+1(16#18005)的poly值实际上是8005,这里使用的就是简记式,以后见到的基本都是简记式


1.2.3 数据宽度

数据宽度指的就是CRC校验码的长度(二进制位数),知道了CRC的运算概念和多项式,就可以理解这个概念了,CRC长度始终要比除数位数少1,与简记式长度是一致的。


1.2.4 初始值与结果异或值

在一些标准中,规定了初始值,则数据在进行上述二项式运算之前,需要先将要计算的数据与初始值的最低字节进行异或,然后再与多项式进行计算。


而在结果异或值不为零的情况下,则需要将计算得到的CRC结果值再与结果异或值进行一次异或计算,得到的最终值才是我们需要的CRC校验码。


这里可以看出,初始值与结果值的位数要求与数据宽度一致。


1.2.5 输入值反转与输出值反转

输入值反转的意思是在计算之前先将输入数据反转,然后再计算。如对于输入数据,其正向值为1 1000 0000 0000 0101,反转值则为1010 0000 0000 0001 1,注意这里反转并不是按位取反,而是低bit位与高bit位交换位置


输出值反转则是将最终得到的CRC结果反转。


通常,输入值反转后的结果值也会是反转的,所以这两个选项一般是同向的。


二、CRC校验原理


CRC校验根本思想就是先在要发送的数据帧后面附加一个数(这个就是用来校验的校验码),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它是数据帧除以选定的CRC除数产生的余数


新帧到达接收端后,有两种方法比较传输是否出错:

一是用同样的方法对数据帧除以CRC除数产生的余数跟校验码相比,如果相同,则数据正确,否则数据错误;

二是对新帧除以CRC除数,如果余数为0,则数据正确,否则数据错误。


要校验的数据加上此数据计算出来的crc校验码组成新的数据帧,如下图所示。


2.1 CRC校验计数基础知识

CRC校验中的运算不是普通的运算,称为“模2运算


模2加法和减法都是异或运算,例子如下:

1010+0110=1100,1010-0110=1100


模2乘法的定义:

0×0=0,0×1=0,1×0=0,1×1=1。1011×101=100111

其中横线之间的累加过程,采用的是2进制加法,不进位。

模2除法,其实也是异或运算:
0/1=0,1/1=1。1011/101=10,余数为100(补了2个0)。

2.2 CRC多项式的选择(除数的选择)


对于CRC标准除数,一般使用多项式(或二项式)公式表示(参照节1.2.1和1.2.2),CRC除数位数越高,检错能力越强,通常是根据设计中的数据流大小与格式来选择。数据流是8bit为一个包的话,则CRC校验位数选择8bit或者16bit等比较好。


三、CRC校验码手动计算


CRC校验码就是两个数相除的余数,而且余数位数要正好比除数少一位,即使MSB为0。


下面举例说明CRC校验码手动计算过程:

对于数据1110 0101,指定多项式为x4+x3+x+1则除数为11011。首先要将数据左移4bit(校验码的位数),然后再进行计算:


将上面计算得到的校验位补到数据的后面就构成了要发送的新数据帧:


四、CRC校验算法推导与Verilog实现


第三大节讲了如何手动计算CRC校验码,但如何在编程中实现,这就是个难题,网上很多文章都只是浅浅地谈了一下,并没有具体推导,如果对推导过程没兴趣的,可以直接翻到第五大节直接用链接生成Verilog代码。


4.1 生成矩阵G

CRC是循环码的一种,这是通信原理上的内容。由生成矩阵G,就可以由k个信息位得到整个码组,即要传输的完整数据(信息码+监督码):

其中,g(x)是唯一的(n-k)次生成多项式,xk与g(x)相乘是使其左移k位。G(x)为生成矩阵,与4.2中G(x)意义不同(我懒得改了)。整个码组A(x)为



其中,A为输入数据矩阵。以CRC4举例,多项式为x4+x+1(10011),输入数据为5bit举例

输入数据矩阵A,就可以得到相应的数据码,计算结果中前5bit为信息码,后4bit为监督码


4.2 CRC校验公式

CRC校验码其实是两个多项式相除的余数,我们要传输的数据(也是被除数)是多项式M(x) 的系数,除数是生成多项式G(x) 的系数,G(x) 的最高次幂为xn-k ,校验码是余数多项式R(x) 的系数,Q(x) 为商,则计算公式为

4.3 CRC串行计算公式推导

上面的式子其实已经可以计算得到CRC校验码了,但还无法在硬件上实现,所以需要用硬件的思想推导可实现的计算方法,这里以CRC-32的标准来进行举例推导。

根据二进制信息码转换成多项式的方法,对于任意一个长度为(m+1)的二进制信息码,可以转换成一个最高次幂为m的多项式:


其中,2m 是二进制的科学计数法。
为求此二进制序列的CRC值,首先将M(x) 乘以232,然后再除以生成多项式G(x),所得余数R(x) 是一个最高次幂为31的多项式,其系数为CRC-32的值,那么:


先从最高位开始解,

结合公式一、公式二与公式三可得:


接着解次高位,在公式四中,最高位的余数与M(x)次高位的和除以G(x),可得到次高位的商和余数:

将公式五代入公式四中:

以次类推可得最终公式:


以上推导过程的前提是串行计算,即先计算多项式M(x)最高位以G(x),得到最高位的商和余数;最高位的余数与M(x)次高位求和除以G(x)得到次高位的商和余数……如此反复计算直到运算完最低位得到的余数R0(x)对应的系数即为我们的CRC-32的校验码。

以上推导过程表明:一个m+1位的二进制序列,可以按位求取CRC-32的值。运算时,首先从最高位(第m+1位,设最右边的为第1位)开始计算,然后依次计算较低位。因此,每一位的CRC-32运算就转化成了一个最高次幂为32的多项式除以一个最高次幂为32的多项式(生成多项式),结果(余数)为一个最高次幂不超过31的多项式。


4.4 CRC校验串行计算的Verilog实现

4.1和4.2节讲了公式推导,这一节讲如何用Verilog表达出来。

首先得了解LFSR,线性反馈移位寄存器简称LFSR,用于产生可重复的伪随机序列,也可用来实现CRC校验。LFSR主要由触发器(寄存器)、异或门以及反馈线路组成。


通常推荐伽罗瓦LFSR,如图所示,对于二进制来说,gn 到g0的各个系数表示这条支路是否存在,1为存在,0则不存在。各个寄存器储存着上一次CRC校验运算的结果,寄存器的输出即为CRC的值,这里还是以CRC-32举例,其生成多项式为:

当输入新的位参与运算时,信息多项式为:

上一次CRC计算的结果为:

根据上一节推导出的公式,新的CRC-32值Rn(x) 为 {Rn+1(x)×2 + M(x)}/ G(x) 的余数。设


在计算Q(x)/G(x) 的结果时,根据模2运算法则,如果A31+ Mn 的结果为1,则商为1,余数为Q(x)-G(x) ;如果A31+ Mn 的结果为0,则商为0,余数为Q(x) 本身。其中,A31+ Mn 是模2加法;Q(x)-G(x) 是模2减法。


当上一个CRC-32结果的最高位A31和输入的数值Mn模2加法结果为1时,上一次CRC结果右移一位,完成乘2的过程,再与G(x)多项式的系数进行异或运算,完成减法。由于任何数与0异或保持不变,所以LFSR中只有在G(x)多项式为1的系数处才放置异或门。运算完毕以后把结果存入寄存器即为新的CRC-32值。


当上一个CRC-32结果的最高位A31和输入的数值Mn模2加法结果为0时,Q(x)不够除,Q(x)本身作为余数存入寄存器,获得新的CRC-32值。由于A31+ Mn的结果为0,异或门不起作用,Q(x) = A30×231+ A29×230+ … +A1×22+ A0×21,由Rn+1(x)右移一位获得, Q(x)的0次幂为0,刚好把A31+ Mn的结果作为输入。


4.5 CRC校验并行计算的Verilog实现

4.3节是串行的表述,每一bit数据需要一个时钟周期,为提高速率还得用上并行计算的思想,输入数据S要并行输入到G(x)系数为1的支路中,输入数据从输入端按高到低逐bit输入,就可以实现。

假如被除数是2位的数据S[1:0]=01,多项式是10011,x4 +x+1。在CRC校验里面,习惯省略最高位的1,多项式用0011表示。那么S除以0011的模二运算数字电路结构为:


其中d1~ d4是寄存器输入;q1~q4是寄存器输出。寄存器需要赋初值,一般赋全1或全0。

d1=S[1]^q4;


d2= S[1]^ q1^q4;


d3=q2;


d4=q3。


经过一次移位后:


q1=d1= S[1]^q4;


q2= d2= S[1]^ q1^q4;


q3= d3=q2;


q4= d4=q3。


此时有:


d1=S[0]^q3;


d2= S[0]^ S[1]^ q4^q3;


d3= S[1]^ q1^q4;


d4= q2。


令c[3:0]={q4,q3,q2,q1},d[3:0]={d4,d3,d2,d1},那么d就是最终的运算结果表达式,如下


d[3]=c[1];


d[2]= S[1]^ c[0]^c[3];


d[1]= S[0]^ S[1]^ c[3]^ c[2];


d[0]= S[0]^ c[2]。


令c的初值为0,则01对0011的模二除法的余数为0011。

再比如多项式为x5 +x3 +x+1,简记式为01011,其数字电路结构为:

输入数据S要全部输入完,寄存器得到的结果才是最后的结果。同理可推导出其他多项式和输入数据的情况。


4.6 CRC校验在多个字节(数据包)场景下的计算方法

对于多个字节(数据包),这里举个例子,如果数据是10bit*100个包,则每次输入10bit得到校验码后,该检验码为下次数据计算时寄存器D的初值,如此反复计算得到最后的检验码添加到整个数据后面即可,而不需要每个数据包后面都添加检验码。


文章来源:https://blog.csdn.net/qq_42446721/article/details/127054205

版权归原作者所有


路科验证 专注于数字芯片验证的系统思想和前沿工程领域。路桑是Intel资深验证专家,主持验证架构规划和方法学研究,担任过亿门级通信芯片的验证经理角色。在工程领域之外,他在西安电子科技大学和西安交通大学客座讲授芯片验证课程。著有书籍《芯片验证漫游指南》。
评论
  • 大模型的赋能是指利用大型机器学习模型(如深度学习模型)来增强或改进各种应用和服务。这种技术在许多领域都显示出了巨大的潜力,包括但不限于以下几个方面: 1. 企业服务:大模型可以用于构建智能客服系统、知识库问答系统等,提升企业的服务质量和运营效率。 2. 教育服务:在教育领域,大模型被应用于个性化学习、智能辅导、作业批改等,帮助教师减轻工作负担,提高教学质量。 3. 工业智能化:大模型有助于解决工业领域的复杂性和不确定性问题,尽管在认知能力方面尚未完全具备专家级的复杂决策能力。 4. 消费
    丙丁先生 2025-01-07 09:25 69浏览
  • By Toradex 秦海1). 简介嵌入式平台设备基于Yocto Linux 在开发后期量产前期,为了安全以及提高启动速度等考虑,希望将 ARM 处理器平台的 Debug Console 输出关闭,本文就基于 NXP i.MX8MP ARM 处理器平台来演示相关流程。 本文所示例的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。  2. 准备a). Verdin i.MX8MP ARM核心版配合Dahlia载板并
    hai.qin_651820742 2025-01-07 14:52 22浏览
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 135浏览
  •     为控制片内设备并且查询其工作状态,MCU内部总是有一组特殊功能寄存器(SFR,Special Function Register)。    使用Eclipse环境调试MCU程序时,可以利用 Peripheral Registers Viewer来查看SFR。这个小工具是怎样知道某个型号的MCU有怎样的寄存器定义呢?它使用一种描述性的文本文件——SVD文件。这个文件存储在下面红色字体的路径下。    例:南京沁恒  &n
    电子知识打边炉 2025-01-04 20:04 96浏览
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 155浏览
  • PLC组态方式主要有三种,每种都有其独特的特点和适用场景。下面来简单说说: 1. 硬件组态   定义:硬件组态指的是选择适合的PLC型号、I/O模块、通信模块等硬件组件,并按照实际需求进行连接和配置。    灵活性:这种方式允许用户根据项目需求自由搭配硬件组件,具有较高的灵活性。    成本:可能需要额外的硬件购买成本,适用于对系统性能和扩展性有较高要求的场合。 2. 软件组态   定义:软件组态主要是通过PLC
    丙丁先生 2025-01-06 09:23 82浏览
  • 村田是目前全球量产硅电容的领先企业,其在2016年收购了法国IPDiA头部硅电容器公司,并于2023年6月宣布投资约100亿日元将硅电容产能提升两倍。以下内容主要来自村田官网信息整理,村田高密度硅电容器采用半导体MOS工艺开发,并使用3D结构来大幅增加电极表面,因此在给定的占位面积内增加了静电容量。村田的硅技术以嵌入非结晶基板的单片结构为基础(单层MIM和多层MIM—MIM是指金属 / 绝缘体/ 金属) 村田硅电容采用先进3D拓扑结构在100um内,使开发的有效静电容量面积相当于80个
    知白 2025-01-07 15:02 40浏览
  • 随着市场需求不断的变化,各行各业对CPU的要求越来越高,特别是近几年流行的 AIOT,为了有更好的用户体验,CPU的算力就要求更高了。今天为大家推荐由米尔基于瑞芯微RK3576处理器推出的MYC-LR3576核心板及开发板。关于RK3576处理器国产CPU,是这些年的骄傲,华为手机全国产化,国人一片呼声,再也不用卡脖子了。RK3576处理器,就是一款由国产是厂商瑞芯微,今年第二季推出的全新通用型的高性能SOC芯片,这款CPU到底有多么的高性能,下面看看它的几个特性:8核心6 TOPS超强算力双千
    米尔电子嵌入式 2025-01-03 17:04 55浏览
  • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
    优思学院 2025-01-06 12:03 107浏览
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 117浏览
  • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
    Industio_触觉智能 2025-01-06 10:43 87浏览
  • 自动化已成为现代制造业的基石,而驱动隔离器作为关键组件,在提升效率、精度和可靠性方面起到了不可或缺的作用。随着工业技术不断革新,驱动隔离器正助力自动化生产设备适应新兴趋势,并推动行业未来的发展。本文将探讨自动化的核心趋势及驱动隔离器在其中的重要角色。自动化领域的新兴趋势智能工厂的崛起智能工厂已成为自动化生产的新标杆。通过结合物联网(IoT)、人工智能(AI)和机器学习(ML),智能工厂实现了实时监控和动态决策。驱动隔离器在其中至关重要,它确保了传感器、执行器和控制单元之间的信号完整性,同时提供高
    腾恩科技-彭工 2025-01-03 16:28 170浏览
  • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
    GIRtina 2025-01-06 11:10 102浏览
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球无人机锂电池产值达到2457百万美元,2024-2030年期间年复合增长率CAGR为9.6%。 无人机锂电池是无人机动力系统中存储并释放能量的部分。无人机使用的动力电池,大多数是锂聚合物电池,相较其他电池,锂聚合物电池具有较高的能量密度,较长寿命,同时也具有良好的放电特性和安全性。 全球无人机锂电池核心厂商有宁德新能源科技、欣旺达、鹏辉能源、深圳格瑞普和EaglePicher等,前五大厂商占有全球
    GIRtina 2025-01-07 11:02 45浏览
  • 光耦合器,也称为光隔离器,是一种利用光在两个隔离电路之间传输电信号的组件。在医疗领域,确保患者安全和设备可靠性至关重要。在众多有助于医疗设备安全性和效率的组件中,光耦合器起着至关重要的作用。这些紧凑型设备经常被忽视,但对于隔离高压和防止敏感医疗设备中的电气危害却是必不可少的。本文深入探讨了光耦合器的功能、其在医疗应用中的重要性以及其实际使用示例。什么是光耦合器?它通常由以下部分组成:LED(发光二极管):将电信号转换为光。光电探测器(例如光电晶体管):检测光并将其转换回电信号。这种布置确保输入和
    腾恩科技-彭工 2025-01-03 16:27 178浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦