CRC算法及Verilog实现

合集下载

CRC循环冗余校验原理及FPGA实现

CRC循环冗余校验原理及FPGA实现

CRC循环冗余校验原理及FPGA实现姚树渝|创建时间:2013年06月19日14:07|浏览:220|评论:0标签:管理13.1 基本CRC循环冗余校验原理介绍循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC。

它是利用除法及余数的原理来作错误侦测(Error Detecting)的。

实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。

根据应用环境与习惯的不同,CRC又可分为以下几种标准:①CRC-12码;②CRC-16码;③CRC-CCITT码;④CRC-132码。

CRC-12码通常用来传送6-bit字符串。

CRC-16及CRC-CCITT码则用是来传送8-bit字符,其中CRC-16为美国采用,而CRC-CCITT 为欧洲国家所采用。

CRC-132码大都被采用在一种称为Point-to-Point的同步传输中。

1.CRC特点CRC是种常用的检测错误的循环码,它能够榆测出如下错误:(1)突发长度小于r的突发错误。

(2)大部分突发长度等于r十l的错误,其中不可检测的这类错误只占2-(r-1)。

(3)大部分突发K度大于r+1的错堤,其中不可检测的这类错误只占2-r。

(4)所有奇数个错误。

CRC检错能力极强,开销小,易于用编码器及检测电路实现。

从其检错能力来看,它所不能发现的错误的几率仅为0.0047%以下。

从性能上和开销上考虑,均远远优于奇偶校验及算术和校验等方式。

因而,在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC-CCITT,WinRAR、NERO、ARJ、LHA等压缩工具软件采用的是CRC132,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF 等也都用CRC作为检错手段。

CRC冗余校验编码与解码的FPGA实现

CRC冗余校验编码与解码的FPGA实现

CRC冗余校验编码与解码的FPGA实现CRC(Cyclic Redundancy Check)冗余校验编码是一种常用的错误检测技术,它通过对数据进行多项式除法运算,生成一个校验码。

接收方可以利用这个校验码来检测数据传输是否出现错误或损坏。

在FPGA中实现CRC的编码和解码功能可以提供硬件级别的实时性能和效率,并且可以与其他模块轻松集成在一起。

首先,我们需要准备FPGA开发板、软件开发工具和一个CRC多项式。

CRC多项式的选择取决于所使用的CRC标准和数据宽度。

编码的FPGA实现主要包含以下步骤:1.数据输入:将待编码的数据通过输入端口输入到FPGA中。

2.除数寄存器初始化:初始化一个与CRC多项式位数相等的寄存器,初始值为0。

3.循环除法:采用循环除法算法,将输入数据和除数寄存器中的值进行除法运算。

每次计算结果都更新除数寄存器。

4.生成校验码:当所有输入数据都被除尽后,生成最终的校验码。

5.输出校验码:将生成的校验码通过输出端口输出到外部。

解码的FPGA实现主要包含以下步骤:1.接收数据:将接收到的数据通过输入端口输入到FPGA中。

2.除数寄存器初始化:与编码过程相同,初始化一个与CRC多项式位数相等的寄存器。

3.循环除法:采用同样的循环除法算法进行运算,将输入数据和除数寄存器中的值进行除法运算。

4.判断错误:当除数寄存器的值为零,说明数据没有出现错误。

否则,数据出现错误。

通过使用FPGA来实现CRC冗余校验编码和解码,可以获得高速、高效的数据传输,尤其适用于在低延迟和高吞吐量的系统中。

此外,FPGA的可编程性使得我们可以灵活地配置不同标准和多种数据宽度的CRC。

需要注意的是,在实现CRC编码和解码时,需要根据具体的CRC标准和数据宽度来确定多项式的选择以及对应的除法算法。

此外,合理的硬件设计和时序控制对于FPGA实现CRC的性能和正确性也至关重要。

综上所述,CRC冗余校验编码与解码的FPGA实现可以提供高效的数据传输和错误检测功能,适用于各种应用场景。

基于verilog的CRC算法的实现

基于verilog的CRC算法的实现

基于verilog的CRC算法的实现作者:洪向宇来源:《中国新通信》2017年第07期【摘要】循环校验码具有良好的误码检测和抗干扰能力,广泛应用于通信系统。

本文从CRC原理探究串行算法,利用matlab对CRC串行算法进行仿真,利用Verilog语言实现CRC 校验模块,并最终验证设计的正确性。

【关键字】循环校验码 CRC一、引言循环校验码(cyclic redundancy check, CRC)具有良好的误码检测和抗干扰能力,可广泛应用于通信系统的编解码技术,提高通信系统的检错能力。

由于CRC为循化冗余检验码,因此CRC能够检出大部分突发长度错误和所有奇数随机错误1。

在通信系统中,CRC编码模块常常作为通信系统的一部分出现的,因此CRC编码模块可使用硬件描述语言进行设计实现,利用可编程逻辑器件实现CRC模块,既满足了模块对校验时钟及速度的需求,也能够直接简便的实现CRC模块的硬件电路。

本文基于Verilog语言,利用串行算法实现了16位校验的CRC模块并利用matlab对算法进行验证。

二、CRC串行算法CRC校验码依据线性编码原理2。

对于信源为n位的二进制数据序列,经过算法处理,即输入信源与生成多项式进行模二除法,所得余数生成m位校验码。

将m位校验码放在信源序列的后面进行数据传输,接收端以相同算法对接收数据进行校验。

收到信源信息,如未发生误码,则接收到的校验位应能够被生成多项式模二整除。

算法公式可表示为,其中,xnD(x)为做n位移位运算的信源序列,g(x)为生成多项式,P(x)|R(x)为模二除法的商和余数。

三、CRC算法的FPGA实现由于并行插入16bit信源码与串行的16bit信源码序列是等效的,因此CRC串行与并行算法在电路级是等效的3。

CRC算法中的模二除法可用硬件电路中的移位寄存器实现。

利用matlab可对算法进行仿真,其中g为生成多项式,input为48bit测试向量,因为本文使用了CRC16校验,因此测试向量需在帧尾补足16个0,变为64bit串行数据。

基于VerilogHDL的IEEE1394协议中CRC校验的实现

基于VerilogHDL的IEEE1394协议中CRC校验的实现
parameter MSB =32'h8000_0000,ONE =32'hffff_ffff, CRC_COMPUTE=32'h04C11DB7;
always@(posedge clk or negedge start) begin if(! start) begin
crc<=32'hffff_ffff; len<=sizeInQuads; state<=state0; end else begin case(state) state0: begin
(总 生,则得到的余数不为 C(X)。
第 3 CRC 校验的设计与实现

通常 CRC 校验可以通过线性反馈移位寄存器来
五 实现。 根据 IEEE1394 协议中的规定,移位寄存器初 期 始值置 为全“1”,输入的数据比特先与移位 寄 存 器 的 )
趬趻 M O D E R N C OM P U T E R 2009.4
if(len! =0) begin
len<=len-8'h1; inquad_c<=inquad; state<=state1; end else begin state<=state0; end end state1: begin newmask<=MSB; state<=state2; end state2: begin if(newmask ! = 0) begin newbit<=((inquad_c & newmask) ! = 0);
实践与经验
基于 Verilog HDL 的 IEEE1394 协议中 CRC 校验的实现
张 艳 1 , 李现国 2
(1. 天津城市建设学院,天津 300384; 2. 天津工业大学,天津 300160)

CRC16、扰码、解扰码器并行方案原理和Verilog HDL程序设计要点

CRC16、扰码、解扰码器并行方案原理和Verilog HDL程序设计要点

课程设计课程名称现代通信原理与技术课程设计题目名称CRC16、扰码/解扰码器并行方案原理和Verilog HDL程序设计2013年10月25日目录一、CRC16并行算法原理二、CRC16并行算法的Verilog HDL程序设计三、扰码/解扰码器并行算法原理四、扰码/解扰码器并行算法的Verilog HDL程序设计五、参考文献一、CRC16并行算法原理1、CRC编码原理在数字通信中,可能会因为各种原因导致数据在传输过程中或接收时发生错误,为了保证数据传输的可靠性和数据校验的高效性,常常采用一些差错控制方法。

冗余校验(CRC)就是一种被广泛采用的差错控制方法和数据编码方法。

它具有编码和解码方法简单,剪错和纠错能力强等特点,能有效地对数据进行编码,并可以显著的提高系统的剪错能力,从而保证数据的可靠性和正确性,因此在大多数的以太网协议中都采用了CRC的校验来进行差错控制。

CRC主要有两种,即非标准的由用户定义的CRC的生成多项式和国际标准化组织规定的标准的生成多项式。

其中第二中应用广泛,国际标准化组织规定的几种主要常见的CRC如表所示。

CRC编码是根据CRC检验原理得出的一种编码方法,其基本思想是:利用线性编码理论,在发送方向根据要传输的K位二进制序列,以一定的规则产生r位校验用的监督吗(CRC码),并附在信息位之后,构成一个新的二进制代码序列共n=k+r位。

在接收方,则根据信息码和CRC码之间的规则进行校验,以确定传输中是否出现错误。

对一个数据进行编码,就是原始数据通过某种算法,得到一个新的数据。

而这个新的数据与原始数据有着固定的内在联系。

通过把原始数据和新的数据组合在一起形成新的数据,因此这个数据具有自我校验的能力。

将原始数据表示为P(x),它是一个n阶多项式表示为;式子中,为数据位;x为伪变量,用指明各位间的排列位置。

在对这个数据进行编码的时,CRC生成多项式G(x),并在带编码的二进制多项式P(x)的末尾添加r个0,这样对应的二进制多项式升幂为。

CRC算法原理及其Verilog实现

CRC算法原理及其Verilog实现

CRC算法原理及其Verilog实现⼀.CRC简介CRC校验是⼀种在数据通信系统和其它串⾏传输系统中⼴泛使⽤的错误检测⼿段。

通⽤的CRC标准有CRC-8、CRC-16、CRC-32、CRC-CCIT,其中在⽹络通信系统中应⽤最⼴泛的是CRC-32标准。

本⽂将以CRC-32为例,说明CRC编码的实现⽅式以及如何⽤verilog语⾔对CRC编码进⾏描述。

⼆.模2运算在说明CRC编码⽅式之前,⾸先介绍⼀下模2运算法则,在CRC运算过程中会使⽤到模2除法运算。

模2运算是⼀种⼆进制运算法则,与四则运算相同,模2运算也包括模2加、模2减、模2乘、模2除四种运算。

模2运算⽤“+”表⽰加法运算,⽤“-”、“×”或“.”、“/”分别表⽰减法、乘法和除法运算。

与普通四则运算法则不同的是,模2加法是不带进位的⼆进制加法运算,模2减法是不带借位的⼆进制减法运算。

同时,模2乘法在累加中间结果时采⽤的是模2加法运算;模2除法求商过程中余数减除数采⽤的是模2减法运算。

因此,两个⼆进制数进⾏模2加减法运算时,相当于两个⼆进制数进⾏按位异或运算,每⼀位的结果只与两个数的当前位有关。

模2除法在确定商时,与普通⼆进制除法也略有区别。

普通⼆进制除法中,当余数⼩于除数时,当前位的商为0,当余数⼤于等于除数时,当前位的商为1。

模2除法在确定当前位的商时,只关⼼余数的⾸位,⾸位为1则商为1,⾸位为0则商为0。

1.模2加法的定义:0+0=0,0+1=1,1+0=1,1+1=0。

举例如下:1010+0110=1100。

2.模2减法的定义:0-0=0,0-1=1,1-0=1,1-1=0。

举例如下:1010-0110=1100。

3.模2乘法的定义:0×0=0,0×1=0,1×0=0,1×1=1。

举例如下:1011×101=100111列竖式计算:1011× 101——————101100001011——————100111其中横线之间的累加过程,采⽤的是2进制加法,不进位。

crc16的verilog实现技术报告

crc16的verilog实现技术报告

CRC16原理1.基本原理CRC校验码是基于将位串看作是系数为0或1的多项式,一个k位的数据流可以看作是关于x的从k-1阶到0阶的k-1次多项式的系数序列。

m(x)=a0+a1x1+a2x2+⋯⋯+a k−1x k−1生成多项式G(x),规定发送方和接收方必须事先商定一个生成多项式G(x),其高位和低位必须是1。

要计算m位的帧m(x)的校验和,基本思想是将校验和加在帧的末尾,使这个带校验和的帧的多项式能被G(x)除尽。

当接收方收到加有校验和的帧时,用G(x)去除它,如果有余数,则CRC校验错误,只有没有余数的校验才是正确的。

2. G(x) 应当满足以下条件:1)生成多项式的最高位和最低位必须为1。

2)当被传送信息(CRC码)任何一位发生错误时,被生成多项式做除后应该使余数不为0。

3)不同位发生错误时,应该使余数不同。

4)对余数继续做除,应使余数循环。

实际中用的是CRC国际标准,各种标准推荐的生成多项式g(x)如下:2.CRC码生成方法借助于多项式除法,其余数为校验字段。

信息字段代码为: 1011001;对应m(x)=x6+x4+x3+1。

假设生成多项式为:g(x)=x4+x3+1;则对应g(x)的代码为: 11001。

x4m(x)=x10+x8+x7+x4 对应的代码记为:10110010000;采用多项式除法: 得余数为: 1010 (即校验字段为:1010)。

发送方:发出的传输字段为: 1 0 1 1 0 0 1(信息字段)1010(校验字段)接收方:使用相同的生成码进行校验:接收到的字段/生成码(二进制除法)如果能够除尽,则正确。

Matlab 仿真实现的程序crcsimulat.m的代码如下:msg=[1 0 0 1 0 1 0 1 1 1 0 1 0]; %信息序列poly=[1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1]; %生成多项式[M N]=size(poly); %生成多项式的大小mseg=[msg zeros(1,N-1)]; %存放加了CRC的序列[q r]=deconv(mseg,poly); %q为商,r为余数r=mod(abs(r),2); %进行模2处理crc=r(length(msg)+1:end); %CRC校验码frame=bitor(mseg,r); %最后加上CRC后,发送出去的序列% 接收端处理[qr rt]=deconv(frame,poly); %将接收到的序列除以多项式rt=mod(abs(rt),2); %进行模2处理,得到信息序列在传输时未出错的情况下,rt全部为零;如果在信道传输中出错,则在接收端前发送序列frame变化。

循环冗余校验(CRC)之verilog实现

循环冗余校验(CRC)之verilog实现

循环冗余校验(CRC)之verilog实现本来是不想写的,是因为⾃⼰还没有彻底搞懂唯⼀的⼀个环节:软件实现和理论怎么对应。

对于我这种⿊⽩是⾮必须分明的⼈⽽⾔,这是⼀种折磨。

⽽这周类似的,悬⽽未决的事情远不⽌这⼀件。

这些导致这周过得很不爽快,但是我很清楚的明⽩我必须去⾯对,去接受,去改变,就像昨晚的欧冠,这么虐⼼的过程,说不定在最后迎来意想不到的⼤胜利。

循环校验,也称为CRC检验,这是⼀个很常见的,很成熟的。

该算法的理解很简单,随便⽤百度百科⼀搜,然后花半个⼩时估计就能完全理解了。

这篇博⽂描述:怎么实现硬件并⾏的CRC计算。

主要的参数为:1.⽣成多项式,在不同的协议中有不同的⽣成多项式,⼀般这些多项式都是确定的。

2.模2除法如果已经了解CRC算法,就明⽩它的原理就是将数据和多项式进⾏模2除,最后得到的余数就是最后的CRC。

这⾥需要记住的就是:模2除就是进⾏异或。

但是,如果上⾯的你都了解后,你会发现这些对于解决CRC算法完全没有作⽤,这就是坑爹的百科。

⽹络上⼤部分的CRC都是软件实现,其实在解压软件中就有CRC,但是此时⼜会出现⼀个问题,你会发现下载的软件对于同⼀个字符串,CRC算出来的结果会不同。

这⾥给⼀个表⽰正确的CRC计算软件:/softview/SoftView_100981.html软件界⾯:软件说明 :(作为⼀个搞硬件的,理解这些软件参数的确不是⼀个容易的活,搜了很多资料)width : 表⽰最后CRC的bit的位数Poly : 表⽰多项式对应的⼆进制数,这⾥没有进⾏颠倒,x4+x+1=10011,最⾼位省略,对应的就是0x03,如果颠倒就是0x1100。

init :表⽰软件寄存器初值,上图为0x00.refin : 如果此值为true,表⽰输⼊的数据需要进⾏⽐特翻转,也就是Bit7要变成最低位, Bit0要变成最⾼位,这⾥是每个字节⽽⾔,每个字节之间的关系不需要进⾏颠倒。

如果此值为false,表明不需要进⾏字节的⽐特翻转refout:如果此值为true,这表⽰进⾏异或后算出来的CRC需要进⾏整个⽐特翻转,然后存⼊,例如:123456789 (实际中只能为0,1,为了⽅便解释这⾥的翻转和refin的区别,此处6,7,8,9等都是⼀位),转换后就是:987654321.如果此值为false,例如:123456789,则该⼀步后的输出为123456789XorOut:最个是将异或后的数据,在refout后的得到的数据与该值进⾏异或后,最终结果才是软件计算的CRC。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CRC算法原理及其Verilog实现1CRC简介CRC校验是一种在数据通信系统和其它串行传输系统中广泛使用的错误检测手段。

通用的CRC标准有CRC-8、CRC-16、CRC-32、CRC-CCIT,其中在网络通信系统中应用最广泛的是CRC-32标准。

本文将以CRC-32为例,说明CRC编码的实现方式以及如何用verilog语言对CRC编码进行描述。

2二.模2运算在说明CRC编码方式之前,首先介绍一下模2运算法则,在CRC运算过程中会使用到模2除法运算。

模2运算是一种二进制运算法则,与四则运算相同,模2运算也包括模2加、模2减、模2乘、模2除四种运算。

模2运算用“+”表示加法运算,用“-”、“×”或“.”、“/”分别表示减法、乘法和除法运算。

与普通四则运算法则不同的是,模2加法是不带进位的二进制加法运算,模2减法是不带借位的二进制减法运算。

同时,模2乘法在累加中间结果时采用的是模2加法运算;模2除法求商过程中余数减除数采用的是模2减法运算。

因此,两个二进制数进行模2加减法运算时,相当于两个二进制数进行按位异或运算,每一位的结果只与两个数的当前位有关。

模2除法在确定商时,与普通二进制除法也略有区别。

普通二进制除法中,当余数小于除数时,当前位的商为0,当余数大于等于除数时,当前位的商为1。

模2除法在确定当前位的商时,只关心余数的首位,首位为1则商为1,首位为0则商为0。

1.模2加法的定义:0+0=0,0+1=1,1+0=1,1+1=0。

举例如下:1010+0110=1100。

2.模2减法的定义:0-0=0,0-1=1,1-0=1,1-1=0。

举例如下:1010-0110=1100。

3.模2乘法的定义:0×0=0,0×1=0,1×0=0,1×1=1。

举例如下:1011×101=100111列竖式计算:1011× 101——————101100001011——————100111其中横线之间的累加过程,采用的是2进制加法,不进位。

4.模2除法:0/1=0,1/1=1。

举例如下:1011/101=10,余数为100。

列竖式计算:10————101 )1011101————001101————0013三.CRC实现原理CRC校验的基本思想是:利用线性编码理论,在发送端根据要发送的k位二进制码序列,以一定的规则产生一个校验用的r位监督码(即CRC 码),并附在信息码后面,构成一个新的共k+r位的二进制码序列,最后发送出去。

在接受端,则根据信息码和CRC码之间所遵行的规则进行校验,以确定传输过程中是否出错,并纠错。

一般而言,监督码的位宽r越大,纠错能力就越能,例如,CRC32的纠错能力比CRC16要强。

CRC校验获得监督码的方式是,将k位信息码转换成多项式,然后除以一个生成多项式,获得余数即为监督码。

在求解一个k位二进制信息码的CRC之前,首先需要将二进制信息码转换成多项式。

一个二进制数序列的各个位是它对应多项式的系数,例如,二进制序列1101011101对应的多项式为:M(x)=1×X9+1×X8+0×X7+1×X6+0×X5+1×X4+1×X3+1×X2+0×X1+1×X0M(x)= X9+X8+X6+X4+X3+X2+1通过这种转换方式获得的多项式称为信息多项式。

在进行CRC计算时,除了信息多项式之外,还需要有一个生成多项式G(x)。

生成多项式G(x)要求次数大于0,并且要求0次幂的系数为1。

根据以上约束,以及对纠错能力的要求,人们提出了一些通用的CRC生成多项式,例如:CRC16和CRC32等。

CRC16的生成多项式为:G(x)= X15+X10+X2+1CRC32的生成多项式为:G(x)= X32+X26+X23+ X22+X16+X12+X11+X10+X8+ X7+X5+ X4+ X2+X1+11.1CRC的值等于信息多项式M(x)乘以2n ,再除以生成多项式G(x)所得的余数,除法采用模2除法。

其中,n表示的是生成多项式G(x)的最高次幂,CRC16中n为16,CRC32中n为32。

4四.CRC-32串行计算公式推导根据二进制信息码转换成多项式的方法,对于任意一个长度为(m+1)的二进制信息码,可以转换成一个最高次幂为m的多项式:M(x)= Mm×Xm+ Mm-1×Xm-1+ … + M1×X1+ M0×X0 将以上公式中的X置换成2,表示是一个二进制的多项式,那么该多项式的系数只能是1和0。

M(x)= Mm×2m+ Mm-1×2m-1+ … + M1×21+ M0×20为求此二进制序列的CRC值,首先将M(x)乘以232,然后再除以生成多项式G(x),所得余数即为CRC32的值。

G(x)亦为一个二进制多项式。

设除法运算获得的商为Q(x),余数为R(x),那么:M(x)×232/ G(x)= Mm×2m×232/ G(x) + Mm-1×2m-1×232/ G(x)+ … + M1×21×232/ G(x)+ M0×20×232/ G(x)--------(公式一)M(x)×232/ G(x) = Q(x) + R(x)/ G(x)--------(公式二)将M(x)中最高次项的系数Mm作为一个特殊的M(x)即带入公式二,即得到公式三:Mm×232/ G(x) = Qm(x) + Rm(x)/ G(x)--------(公式三)其中,Mm是一个只有0次幂的多项式,Mm的值为1。

Rm(x)是余数,是一个最高次幂为31的多项式。

再将公式三代入公式一:M(x)×232/ G(x) = Mm×2m×232/ G(x) + Mm-1×2m-1×232/ G(x)+ … + M1×21×232/ G(x) + M0×20×232/ G(x)={ Qm(x)×2m + Rm(x)/ G(x)×2m}+Mm-1×2m-1×232/ G(x)+ … + M1×21×232/ G(x) + M0×20×232/ G(x)=Qm(x)×2m{Rm(x)×2/G(x)×2m-1Mm-1×2m-1×232/ G(x)} + … + M1×21×232/G(x) + M0×20×232/ G(x)= Qm(x)×2m + {(Rm(x)×2 + Mm-1×232)/ G(x)} ×2m-1 + … + M1×21×232/ G(x)+ M0×20×232/ G(x)--------(公式四)公式四中,设{(Rm(x)×2 + Mm-1×232)/ G(x)}= Qm-1(x) + Rm-1(x)/ G(x)--------(公式五)再代入到公式四中,那么公式四转化为:M(x)×232/ G(x)= Qm(x)×2m + Qm-1(x)×2m-1 + {(Rm-1(x)×2 + Mm-2×232)/ G(x)} ×2m-2 + … + M1×21×232/ G(x) + M0×20×232/ G(x)以此类推,最终获得公式:M(x)×232/ G(x)= Qm(x)×2m + Qm-1(x)×2m-1 + Qm-2(x)×2m-2 + … + Q1(x)×21 + Q0(x) + R0(x)/G(x)--------(公式六)根据CRC的定义,多项式R0(x)对应的系数即为我们的CRC32的值。

以上推导过程表明:一个m+1位的二进制序列,可以按位求取CRC32的值。

运算时,首先从最高位(第m+1位,设最右边的为第1位)开始计算,然后依次计算较低位。

当输入第n个位(n<m+1)时,首先将第n+1位运算后的结果乘以2,再将第n的值(0或1)乘以232,两者相加后除以生成多项式G(x)。

因此,每一位的CRC32运算就转化成了一个最高次幂为32的多项式除以一个最高次幂为32的多项式(生成多项式),结果(余数)为一个最高次幂不超过31的多项式。

5五.CRC32串行计算的LFSR实现上一节已经推导出了CRC的串行实现方法,但如何将公式六用Verilog语言表示出来呢?用Verilog描述CRC32的串行计算方法时,使用到了一种叫做LFSR(Linear feedback shift register)的结构。

下图为该LFSR的结构图,其中寄存器3到寄存器25没有在图中画出。

图1.CRC32的串行移位寄存器实现如图所示,各个寄存器储存着上一次CRC32运算的结果,寄存器的输出即为CRC32的值。

让我们回顾一下CRC32的生成多项式:G(x)= 232+226+223+ 222+216+212+211+210+28+ 27+25+ 24+ 22+21+1当输入新的位参与运算时,信息多项式为:M(x)= Mn×232上一次CRC计算的结果为:Rn+1(x) = A31×231+ A30×230+ A29×229+ … + A2×22+ A1×21+ A0×1根据上一节推导出的公式,新的CRC32值Rn(x)为{Rn+1(x)×2 +M(x)}/ G(x)的余数。

设Q(x) = Rn+1(x)×2 + M(x),则:Q(x) = (A31+ Mn)×232+ A30×231+ A29×230+ …+A1×22+ A0×21在计算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减法,不借位。

根据以上分析,上图中的结构刚好能够完成一位串行输入的CRC32计算。

相关文档
最新文档