一种循环冗余校验的快速计算方法

文档序号:7505880阅读:271来源:国知局
专利名称:一种循环冗余校验的快速计算方法
技术领域
本发明涉及循环冗余校验技术,特别是指一种循环冗余校验的快速计算方法。
背景技术
随着技术的不断进步,各种数据通信的应用越来越广泛,由于传输距离、现场状况、干扰等诸多因素的影响,设备之间的通信数据常会发生一些无法预测的错误。为了降低错误所带来的影响,一般在通信时采用数据校验的方法,循环冗余码校验(CRC)就是常用的重要校验方法之一。
CRC校验为数据传输提供了一种简单而有效的突发差错检测方法,可适用于很多方面。CRC校验采用多项式编码方法,被处理的数据块可以看作是一个n阶的二进制多项式。比如假定待发送的二进制数据段为g(x),生成多项式为m(x),则得到的CRC校验码为c(x),具体说就是,CRC校验码的编码方法是用待发送的二进制数据g(x)除以生成多项式m(x),将最后的余数作为CRC校验码。该CRC编码既可以通过软件实现,也可以通过硬件实现;既可以用结构简单,但处理时延较大的串行方法构造;也可以用结构复杂,但是处理时延较小的并行方法构造。
目前,CRC编码技术已经较为成熟,主要采用的实现方案有以下三种第一种是基本的比特级构造方法,也可以称作直接计算法,这是最简单的CRC计算方法,是通过硬件实现的,如图1所示,该方法在硬件上主要通过线性反馈移位寄存器(LFSR)来实现。移位寄存器由时钟驱动,每个时钟输入数据移位寄存器参与计算,同时也直接输出;当所有的输入比特都处理完成之后,移位寄存器中剩下的就是CRC比特,将该CRC比特依次移出到数据流上,就完成了CRC编码。在实际应用中,可采用以下算法具体实现a1.定义一个寄存器R用来存放循环冗余校验码,寄存器的长度一般为处理器的基本存储单元的整数倍,比如8比特、16比特、32比特等等,并且将寄存器R的值置为0;a2.如果寄存器R最左边的比特等于1,则将下一个消息比特移入,并且将寄存器R和生成多项式进行异或;否则只将消息比特移入即可;a3.重复步骤a2,直到所有消息比特都被移入处理,留在寄存器R中的就是输入序列的循环冗余校验码。
这种方法所用的模块代码少,不需要存储查找表,计算简单,修改灵活,可移植性好,软硬件实现的复杂度差不多,对任意长度生成多项式m(x)都适用。但如果发送的数据块很长,该方法就不太适合,因为该方法需要逐比特处理,也就是一次只能处理一位数据,效率太低,运算量大,不能满足实时处理的要求,对于高速数据通信更不适用。
第二种是标准查找表算法,该方法的CRC计算可认为是输入比特和移位寄存器状态比特构成的多项式对生成多项式的余数,该方法需要预先提供CRC生成表。假定寄存器的宽度为n,输入比特位数为m,则在实际应用中,当m<n时,可采取下面的操作步骤b1.定义一个宽度为n比特的寄存器R用来存放循环冗余校验码,寄存器的长度一般为处理器的基本存储单元的整数倍,比如8比特、16比特、32比特等等,并且将寄存器R的值置为0,即设置(rn-1,...,r0)比特序列为0;b2.将寄存器R右移n-m比特,即得到(Rn-1,...,rn-k-r)序列,然后所得到的序列和m个输入比特异或;b3.在查找表中找到对应的值,与寄存器R左移m比特得到的序列(rm-1,...,r0)异或,就得到新的CRC值;b4.重复步骤b2和b3,直到所有消息比特都被移入处理,留在寄存器R中的就是输入序列的循环冗余校验码。
当n=m时,步骤b2和步骤b3会有些许改变b2’.将输入的m个比特与寄存器R异或,也就是将输入的m比特与(rn-k-1,...,r0)异或;b3’.在查找表里面找到对应的值,就得到新的CRC值。
当n<m时,不能采取这种算法。
这种算法需要提供存储2m×n比特大小的查找表,每处理m比特需要执行一次查表和两次异或操作,软硬件实现时复杂度和性能差不多。与直接计算法相反,该方法运算量小,速度快,但是可移植性较差,且应用有局限性,不能处理m>n时的情况,也就是说,每次处理的比特数m不能大于生成多项式的最高阶数n,否则就不能应用该算法。
此外,所存储的查找表随着m的增加而成2的指数增加,比如每次处理8个比特时,查找表大小为256个存储单元;每次处理16个比特时,查找表大小就变为65536个存储单元,可见,这种方法的并行度不能过高。
第三种是并行循环冗余校验编码方法,如图2所示,这是一种基于线性反馈移位寄存器的并行结构,图2中,d0~dm-1表示并行输入序列的m个比特位,er,c为矩阵Fw的第r行第c列,x0~xm-1为输出的系统状态列向量,其中w为并行输入级数。该方法实际是通过硬件门电路来构建当前CRCn生成多项式所对应的各个寄存器之间的关系,最终获取CRC值。
不难看出,该方法的速度是常规方法的w倍,代价就是存储一个F16矩阵并增加硬件的复杂度。该方法的并行度很高,适合硬件如采用FPGA实现,但该算法并不适合软件比如用DSP芯片实现。原因很简单,图2所示的并行结构并行度为m,一般的处理器都达不到这么高的并行度。
随着第三代移动通信中高速数据业务的发展,CRC校验也在第三代移动通信的数据传输中得以大量应用。但由于3GPP基带处理的时延要求相当严格,基带处理器的性能与单位时间内的业务处理能力紧密相关,这样,CRC编码的效率好坏,就会直接影响到基带处理器的性能。如果没有合适的快速CRC校验的计算方法,将会使高速数据通信中的业务处理能力受到很大影响。

发明内容
有鉴于此,本发明的主要目的在于提供一种循环冗余校验的快速计算方法,能大大提高CRC校验的处理速度,降低CRC校验的处理时延,进而一定程度地提高业务处理能力。
本发明进一步的目的是一种循环冗余校验的快速计算方法,使其在保证快速计算速度的同时,达到最佳的存储量/时延配置。
为达到上述目的,本发明的技术方案是这样实现的一种循环冗余校验的快速计算方法,该方法包括以下步骤a.根据当前所采用CRCn生成器的逻辑结构,获取并存储该生成器中每个移位寄存器在处理每个输入比特时的状态;b.从步骤a所获取的所有移位寄存器的全部状态中,提取出处理完输入序列每个比特后CRCn生成器中每个移位寄存器的状态;并将所提取出的每个移位寄存器状态组成中的移位寄存器初始状态表示部分和输入序列表示部分分别存储;c.以每个分别存储部分包含的自变量为地址索引,生成该存储部分对应的查找表;d.以CRCn模式进行CRC校验时,判断当前需处理的比特数是否大于每次能处理的比特数m,如果不是,则按串行方式处理;如果是,则读取m比特,分别以输入比特和移位寄存器变量为地址索引,查找输入序列表示部分对应的查找表和移位寄存器初始状态表示部分对应的查找表,然后将所有查找结果进行异或并保存异或结果;将对应每个移位寄存器的异或结果分别作为该移位寄存器的当前状态,返回步骤d。
其中,步骤c和步骤d之间进一步包括判断分别存储的移位寄存器初始状态表示部分或输入序列表示部分是否需要继续细分,如果需要,则按给定条件将当前的存储部分进一步划分为一个以上存储部分,并对划分后的每个存储部分分别生成对应的查找表;否则,直接执行步骤d。
该方法进一步包括预先设置需要进行细分的条件,则所述判断是否需要细分为判断是否符合细分条件,如果符合,则需要细分;否则不需要细分。这里,所述进行细分的条件为步骤b中所划分的分别存储部分的存储量大于给定存储量。
如果将当前存储部分进一步划分为一个以上存储部分,则步骤d中所述查找输入序列表示部分对应的查找表和移位寄存器初始状态表示部分对应的查找表是分别查找至少一个输入序列表示部分对应的查找表和一个以上移位寄存器初始状态表示部分对应的查找表。
上述方案中,可将每个存储部分的内容分别存储在表中。另外,CRCn生成器中每个移位寄存器的初始状态存储在寄存器中,或放置在向量中。
本发明所提供的循环冗余校验的快速计算方法,由于根据当前所采用CRCn生成多项式对应的逻辑结构,预先得出在不同输入比特的处理状态下,CRCn所用到的每个寄存器的当前状态与其他寄存器及输入比特位的关系,生成对应的查找表,使得在进行CRC校验时,可直接根据预先生成的查找表计算出每个寄存器当前状态下的输出,从而大大提高了CRC校验的处理速度,也就是降低了CRC校验的处理时延。
本发明的方法对所得到的关系按寄存器值和输入比特位值进行划分,并可根据需要或根据算法复杂度的情况,对已划分的寄存器部分或输入比特位部分再细分,如此,可不同程度的减小存储量,以较小的存储代价,换取了很大的处理时延。并且,本发明方法具有相当的灵活性,在保证计算速度快的前提下,可随时根据具体条件,确定最佳的存储量/计算时间配置,能实现很高的并行度。


图1为一种LFSR的组成结构示意图;图2为并行CRC体系结构示意图;图3为本发明方法的实现流程图;
图4为本发明一实施例的逻辑结构示意图;图5为图4所述实施例的CRC计算过程示意图。
具体实施例方式
本发明的基本思想就是根据当前所采用CRCn生成多项式对应的逻辑结构,预先得出在不同输入比特的处理状态下,CRCn所用到的每个移位寄存器的状态更新情况与其它移位寄存器和输入比特位之间的关系,并根据该关系生成对应的查找表;在进行CRCn校验时,直接利用预先生成的查找表获取每个移位寄存器当前状态下的输出。
如图3所示,本发明方法的具体实现过程包括以下步骤步骤301根据当前所采用CRCn生成器的逻辑结构,获取并存储该生成器中所涉及的每个移位寄存器在处理每个输入比特时的状态。
步骤302从步骤301所获取的所有移位寄存器的全部状态中,提取出处理完输入序列每个比特后CRCn生成器的每个移位寄存器的状态。
步骤303~304将步骤302所提取出的每个移位寄存器状态组成中的移位寄存器初始状态表示部分和输入序列表示部分分别存储;并以每个分别存储部分包含的自变量为地址索引,生成该存储部分对应的查找表。
步骤305~306在以CRCn模式进行CRC校验时,先判断当前需处理的比特数是否大于每次能处理的比特数m,如果不是,则按现有技术中一般的串行方法处理;如果是,则执行步骤307。
步骤307~310读取m比特的信息,分别以输入比特和移位寄存器变量为地址索引,查找输入序列表示部分对应的查找表和移位寄存器初始状态表示部分对应的查找表,并将所有查找结果进行异或,保存异或结果;并且,将对应每个移位寄存器的异或结果分别作为该移位寄存器的当前状态,然后返回步骤305。
在步骤304和步骤305之间还可以增加一个判断,判断分别存储的移位寄存器初始状态表示部分或输入序列表示部分是否还需继续细分,如果需要,则按给定条件将当前的存储部分进一步划分为一个以上存储部分,并对划分后的每个存储部分分别生成对应的查找表。可预先设置细分条件,比如查找表的存储量大于某个给定值就再细分,那么,细分时就按照存储量给定值来决定如何细分,具体说就是,当前存储部分的查找表存储量为64K,而给定值为32K,那么,就会将当前存储部分再进一步划分为两个存储部分。如果进行了细分,则步骤308、或步骤309、或步骤308和步骤309要分别以每个存储部分所含的自变量为地址索引,查找相应的查找表,再将所有查找结果进行异或。
对于上述每个步骤提到的存储,都可以设置一个表进行存储,如果某两个表是从某个表中划分出来的,则这两个表可称为原表的子表。
为了方便进一步详细说明本发明中CRC的快速计算原理,下面以CRC16为例,同时结合CRC16的生成多项式和逻辑结构图作为参考。
CRC16所采用的查找表的生成过程包括以下几个步骤第一步,根据CRC16生成器的逻辑结构获取每个移位寄存器在处理每个输入比特时的状态。
CRC16的生成多项式如公式(1)所示gcrc16(D)=D16+D12+D5+1(1)CRC16的逻辑结构如图4所示,CRC16的生成器包括16个移位寄存器R1~R16,图4中的表示模2加,也就是异或。假设以R1~R16分别代表这16个移位寄存器的初始状态,并且当前的输入序列为M,Mi代表输入序列的第i比特位,本实施例中,输入序列M由8个比特位组成,即M1~M8。那么,可以根据图4得出每次处理一个输入比特时每个移位寄存器的状态更新情况,其中移位寄存器的所有状态都是由初始状态R1~R16和输入序列M表示的。每个移位寄存器每个时刻的状态具体如表一所示



表一表一中,第一列代表16个移位寄存器,第一行代表处理的输入比特Mi,相应的,第二列为处理第一输入比特M1时16个移位寄存器的当前状态;第二列为处理第二输入比特M2时16个移位寄存器的当前状态,以此类推,表中的“+”表示模2加。
上述表一的具体生成方法包括以下过程首先,将图4中16个移位寄存器的初始状态存放在表一的第一列;然后,对于每个输入比特执行根据当前输入比特,用前一时刻的移位寄存器状态和当前输入表示出当前时刻移位寄存器的状态,直至处理完8个比特。比如移位寄存器R1的当前状态应该等于移位寄存器R16的当前状态与输入序列M的异或,而移位寄存器R2的当前状态就等于移位寄存器R1的当前状态;再比如根据图4移位寄存器R6的当前状态就等于移位寄存器R5的当前状态与移位寄存器R16当前状态和输入序列M异或结果再异或,CRC16生成器中的移位寄存器状态均以此类推。
第二步,提取处理完输入序列每个比特后CRC16生成器的每个移位寄存器的状态。
表一生成后,可根据表一的最后一列获得每个移位寄存器处理完8个输入比特后的状态,分别用R’1~R’16来表示,则得到表二,表二为处理完输入序列每个比特后移位寄存器的状态列表

表二第三步,对所获得的处理完输入序列所有比特后每个移位寄存器的状态细成进行划分,并构造相应的查找表。
为了减少存储量和简化构造查找表的复杂度,将表二按照移位寄存器初始状态R1~R16和输入比特序列M1~M8分成两个子表,表三为处理完输入序列后每个移位寄存器状态与其它移位寄存器初始状态相关的部分,表四为处理完输入序列后每个移位寄存器状态与输入比特序列相关的部分。


表三

表四这里,所述构造相应的查找表就是根据表三或表四中所有自变量的不同取值,计算出对应的R’1~R’16值。以表四为例,表四中的自变量为M1~M8,由于M1~M8每个比特位均可取0或取1,所以M1~M8的取值共有256种不同组合。那么,构造查找表的具体过程是先列出M1~M8的256种取值;再根据表四中R’1~R’16与M1~M8的关系,计算出M1~M8每种不同取值所对应的R’1~R’16的值;以M1~M8为地址索引,将所有的R’1~R’16值都存储到寄存器中,每个字节的地址寻址一个字;最后形成的关于R’1~R’16的256种取值就是所需的查找表。比如M1~M8的取值为01111010时,由于R’1为M4+M8,这里M4=1,M8=0,则计算出R’1的取值为1;同样R’2为M3+M7,这里M3=1,M7=1,则计算出R’2的取值为0;其它R’i(i=3,4...16)的计算方法类似,不再赘述。如果用于处理的DSP芯片是以字为存储单元的话,就不需要特殊的处理;如果是以字节为存储单元的话,就需要对8比特宽度的M地址索引进行2倍的扩展。
表三中的自变量是R1~R16,总共有216种组合。如果直接以R1~R16为地址索引,将对应的R’1~R’16存储到存储器中,存储量就是64K字。对于64K字的存储量,可以直接采用;也可以继续将表三进行划分,以减少存储量。如果需要继续划分表三,则执行第四步。
第四步,进一步细化处理完输入序列后每个移位寄存器状态与其它移位寄存器初始状态相关的部分,也就是将表三进一步划分为两个子表,并构造每个子表相应的查找表。
将表三中的自变量R1~R16分成R1~R8和R9~R16两组,相应的,将表三分为与两组自变量对应的两个子表表五和表六。通常情况下,表五以自变量R1~R8作为地址索引,将相应的R’1~R’16值存储到存储器中,形成查找表;表六以自变量R9~R16作为地址索引,将相应的R’1~R16值存储到存储器中,形成查找表。


表五

表六在实际操作中,如果输入序列M的比特数为16、32等,同样可以将处理完输入序列后每个移位寄存器状态与输入比特序列相关的部分按上述类似的方法划分,即可将表四进一步划分为两个子表,并构造每个子表相应的查找表。这里,形成查找表的过程与第三步中所述构造查找表的过程相同。
经过以上四个步骤,本实施例中所需的查找表就构造完成了。实际上,在本实施例中,表五可以不构造查找表,只要将地址索引R1~R8进行算术移位,即可获得对应的R’1~R’16。
基于上面所构造的查找表,以CRC16进行校验时,CRC的计算过程如图5所示包括以下步骤步骤501判断当前需要处理的比特数是否小于每次能处理的比特数m,本实施例中m值取8,那么,如果剩余比特大于8,则执行步骤504;否则,执行步骤502。
步骤502~503按照一般的串行输入方法对剩余比特进行CRC计算处理,并读出移位寄存器中的值,结束当前CRC计算流程。
步骤504将图4所示的移位寄存器初始状态存储到一个16比特长的存储单元R中。这里,如果采用DSP实现,可存储到一个寄存器中;如果采用FPGA实现,可存储在一个16比特的向量中。
步骤505~506从待处理的比特流中取出m个比特存储到存储单元M中,其中m常取8、16等值,本实施例中取m=8。以M1~M8为地址索引查找表四生成的查找表,获取对应的R’1~R’16,分别存储于第i个16比特存储单元Ti中。如果M表被划分为多个子表,比如M取16、32等值时,查找每个子表对应的查找表,并将获取的R’1~R’16进行模2加后分别存储于存储单元Ti中。
步骤507以R1~R8为地址索引进行算术移位运算,将获取的R’1~R’16构成的字或向量与对应的存储单元Ti中的值进行模2加,结果再存储到对应的存储单元Ti中;再以R9~R16为地址索引,查找表六对应的查找表,将获取的R’1~R’16构成的字或向量与对应的存储单元Ti中的值进行模2加,结果存储至对应的存储单元Ti中。
如果存在更多的子表,比如CRC24、CRC32时,初始状态有24、32比特宽,这些情况下,查找所有子表对应的查找表,每次将当前所获取的表项与对应的存储单元Ti中的值进行模2加,再存储到对应的Ti中。
步骤508将存储单元T1~T16的值存入R1~R16中,作为处理完m个比特后移位寄存器Ri的状态,并作为下一阶段CRC计算移位寄存器Ri的初始状态,返回步骤501。
按照本发明方法进行CRC计算,在性能上,如果有T个子表,则需要进行T次查表操作和T-1次异或操作,可以在复杂度不增加的情况下加快CRC计算速度。在存储开销方面,在保证性能不变甚至提高的情况下,可明显降低存储开销。以3GPP中常用的8位、12位、16位和24位CRC模式为例,当m=8,即每次处理8个输入比特时,每个子表大小都为256,单位由CRC长度决定。具体存储开销如表七所示

表七以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。
权利要求
1.一种循环冗余校验的快速计算方法,其特征在于,该方法包括以下步骤a.根据当前所采用CRCn生成器的逻辑结构,获取并存储该生成器中每个移位寄存器在处理每个输入比特时的状态;b.从步骤a所获取的所有移位寄存器的全部状态中,提取出处理完输入序列每个比特后CRCn生成器中每个移位寄存器的状态;并将所提取出的每个移位寄存器状态组成中的移位寄存器初始状态表示部分和输入序列表示部分分别存储;c.以每个分别存储部分包含的自变量为地址索引,生成该存储部分对应的查找表;d.以CRCn模式进行CRC校验时,判断当前需处理的比特数是否大于每次能处理的比特数m,如果不是,则按串行方式处理;如果是,则读取m比特,分别以输入比特和移位寄存器变量为地址索引,查找输入序列表示部分对应的查找表和移位寄存器初始状态表示部分对应的查找表,然后将所有查找结果进行异或并保存异或结果;将对应每个移位寄存器的异或结果分别作为该移位寄存器的当前状态,返回步骤d。
2.根据权利要求1所述的方法,其特征在于,步骤c和步骤d之间进一步包括判断分别存储的移位寄存器初始状态表示部分或输入序列表示部分是否需要继续细分,如果需要,则按给定条件将当前的存储部分进一步划分为一个以上存储部分,并对划分后的每个存储部分分别生成对应的查找表;否则,直接执行步骤d。
3.根据权利要求2所述的方法,其特征在于,该方法进一步包括预先设置需要进行细分的条件,则所述判断是否需要细分为判断是否符合细分条件,如果符合,则需要细分;否则不需要细分。
4.根据权利要求3所述的方法,其特征在于,所述进行细分的条件为步骤b中所划分的分别存储部分的存储量大于给定存储量。
5.根据权利要求2所述的方法,其特征在于,如果将当前存储部分进一步划分为一个以上存储部分,则步骤d中所述查找输入序列表示部分对应的查找表和移位寄存器初始状态表示部分对应的查找表是分别查找至少一个输入序列表示部分对应的查找表和一个以上移位寄存器初始状态表示部分对应的查找表。
6.根据权利要求1所述的方法,其特征在于,将每个存储部分的内容分别存储在表中。
7.根据权利要求1所述的方法,其特征在于,CRCn生成器中每个移位寄存器的初始状态存储在寄存器中,或放置在向量中。
全文摘要
本发明公开了一种循环冗余校验的快速计算方法,根据当前所采用CRCn生成多项式对应的逻辑结构,预先得出在不同输入比特的处理状态下,CRCn所用到的每个移位寄存器的状态更新情况与其它移位寄存器和输入比特位之间的关系,并根据该关系生成对应的查找表;在进行CRCn校验时,直接利用预先生成的查找表获取每个移位寄存器当前状态下的输出。该方法能大大提高CRC校验的处理速度,降低CRC校验的处理时延,进而一定程度地提高业务处理能力,并且,该方法在保证快速计算速度的同时,能达到最佳的存储量/时延配置。
文档编号H03M13/09GK1633030SQ20031012244
公开日2005年6月29日 申请日期2003年12月22日 优先权日2003年12月22日
发明者赵训威, 王刚强 申请人:普天信息技术研究院
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1