CRC10原理与实现CRC10原理与实现牋牋犆孛?请输入文档编号2020-06-01版权所有,侵权必究第2页,共10页修订记录日期修订版本描述作者CRC10原理与实现牋牋犆孛?请输入文档编号2020-06-01版权所有,侵权必究第3页,共10页目录1CRC基本原理:41.1生成原理:41)将待传输帧(定长比特串)看作一个多项式,将比特串41.2模2多项式除法原理:42模块设计与实现:52.1结构:52.2接口信号(时序)描述62.3串行算法:62.4并行设计63参考程序:83.1程序举例:83.2综合结果:8CRC10原理与实现牋牋犆孛?请输入文档编号2020-06-01版权所有,侵权必究第4页,共10页CRC10原理与实现牋牋犆孛?请输入文档编号2020-06-01版权所有,侵权必究第5页,共10页CRC10校验模块关键词:CRCCRC10摘要:本文以CRC10为例,简要介绍了CRC的工作原理(多项式除法)、生成方法的,并介绍了一种简单高效的串行设计方法,以及由这种串行算法派生出的高速并行算法,并提供了Verilog代码的程序范例,作为参考。缩略语清单:CRC(CyclicRedundancyCheck)循环冗余校验,参考资料清单名称作者编号发布日期查阅地点或渠道数据通信与网络教程WilliamA.Shay1999ITU-TI.363.508/961CRC基本原理:CRC是一种通过多项式除法检测错误的方法,是一种非常高效又可靠的检测帧错误的方法。1.1生成原理:1)将待传输帧(定长比特串)看作一个多项式,将比特串bn-1bn-2bn-3……b4b3b2b1b0解释成多项式:bn1xn1bn2xn2bn3xn3…b4x4b3x3b2x2b1x1b0x0比如:我们要传输比特串10010101110,将其解释成x10x7x5x3x2x1-参数为0项忽略。2)事先约定一个生成多项式G(x)(GeneratorPolynomial),如:11001=x4x313)将待测比特串尾部追加几个0,0的个数与G(x)的最高次项次数相同,产生一个多项式,定义为B(x),将B(x)除以G(x),求出余式R(x)。4)定义T(x)=B(x)-R(x),则T(x)/G(x)余数为0,而我们将上面追加0的位置用R(x)对应的比特串来代替,而T(x)前部分即为所要传输的内容。5)传输与T(x)对应的比特串T。6)接收方将收到的的比特串T'对应的多项式T'(x)除以G(x),若余数为0,则认为正确,否则认为错误。CRC10原理与实现牋牋犆孛?请输入文档编号2020-06-01版权所有,侵权必究第6页,共10页.11.2模2多项式除法原理:设T(x)x10x9x7x5x4;G(x)x4x31;计算:T(x)/G(x)x4x31 x600x30x x10x90x70x5x4 x10x900x6 x7x6x5x4 x7x600x3 x5x4x3 x5x400x余数: x30x与代数多项式除法不同的是模2运算,规则如下:0+0=00-0=01+0=11-0=10+1=10-1=11+1=01-1=01模块设计与实现:CRC10在此处用于对OAM信元进行校验.1.1结构:1Data_in[31:0]CLKEnableReset0235678941除11000110011求余[31:0]Data_out[9:0]EndcrcCRC10原理与实现牋牋犆孛?请输入文档编号2020-06-01版权所有,侵权必究第7页,共10页48Byte=32bit×12拍=除数(32+10)÷多项式11000110011求余=结果10bit校验结果为0.{I[41:32]+D0[31:0]}/H[9:0]~{R0[41:32]+D1[31:0]}/H[9:0]~···~{Rt-1[41:32]+Dt[31:0]}/H[9:0]~···~{R10[41:32]+D11[31:0]}/H[9:0]~R_crc[9:0]1.1接口信号(时序)描述Data_in对应于被除数,Data_out对应于余数remainder(下面的r[i]代表相应位)1.21.3串行算法:本次设计基于下面的串行算法,因此作以介绍:这里介绍一个简单高效采用循环移位的CRC算法:明确了输入数据和生成多项式后,核心任务便是求余电路的设计以CRC10为例:其生成多项式:G(x)x10x9x5x4x1对应的b10…b0为:11000110011建立步骤:1、建立10个(与多项式最高次次数一致)寄存器,自左而右,对应b9到b0,(生成多项式的最高次数位系数肯定是1)2、异或电路位于对应的bi值为1的寄存器的右边。3、比特串从最右边进入寄存器电路,一次一位。4、每下一个比特位进入时,寄存器中的比特位左移一位。经过异或电路的,异或后进入下一位。5、最左边的寄存器发送比特位到各异或电路,作为第二个操作数。6、初始时寄存器全为0,到达的数据串从第一位进入开始到最后一位进入寄存器结束(即进入b0位),此时寄存器b9…b0中的内容即为余数。1.1CLKData_inEnableResetData_outEndcrc000000000D0D1D2D3D4D5D6D7D8D9D10D11CRC10原理与实现牋牋犆孛?请输入文档编号2020-06-01版权所有,侵权必究第8页,共10页只要来一个时钟进行一次r0=r9⊕D_in;r1=r9⊕r0;r2=r1;r3=r2;r4=r9⊕r3;r5=r9⊕r4;r6=r5;r7=r6;r8=r7;r9=r9⊕r8;1.1并行设计将串行迭代转变为并行迭代:r0(n+1)=r9n⊕D_in(n+1);r1(n+1)=r9n⊕r0n;r2(n+1)=r1n;r3(n+1)=r2n;r4(n+1)=r9n⊕r3n;r5(n+1)=r9n⊕r4n;r6(n+1)=r5n;r7(n+1)=r6n;r8(n+1)=r7n;r9(n+1)=r9n⊕r8n;在硬件描述语言中一个简单的循环语句即可完成,在速度要求很高时,可采用将迭代式展开成r[i]对应于输入的32位和上一拍10位余数的逻辑变换.参考程序详见下页.r9r8r7r6r5r4r3r2r1r0初始r[9:0]=10'b0,数据按bit进入,到最后一位进入时,R[9:0]=r[9:0]D_in2020-06-01版权所有,侵权必究第9页,共10页3参考程序:3.1程序举例:moduleP_CRC10(CLK,Data_in,Enable,Reset,Data_out,Endcrc);inputCLK,Enable,Reset;input[31:0]Data_in;//输入32bit每拍outputEndcrc;output[9:0]Data_out;//输出10bit每拍,第12拍为最终结果regEndcrc,crctemp;reg[9:0]Data_out,R_temp;integeri;always@(CLK)beginif(Reset)beginEndcrc=1'b0;crctemp=1'b0;Data_out=10'b0;R_temp=10'b0;//初始化为0endelseif(Enable)beginEndcrc=1'b0;//迭代for(i=31;i=0;i=i-1)begincrctemp=R_temp[9];R_temp[9]=R_temp[8]^crctemp;R_temp[8]=R_temp[7];R_temp[7]=R_temp[6];R_temp[6]=R_temp[5];R_temp[5]=R_temp[4]^crctemp;R_temp[4]=R_temp[3]^crctemp;R_temp[3]=R_temp[2];R_temp[2]=R_temp[1];R_temp[1]=R_temp[0]^crctemp;R_temp[0]=Data_in[i]^crctemp;endData_out=R_temp;endelseEndcrc=1'b1;endendmodule3.2综合结果:器件:XCV1000e-6-fg680Slices:42outof122881%2020-06-01版权所有,侵权必究第10页,共10页SliceFlipFlops:214inputLUTs:71BondedIOBs:45outof5088%Designstatistics:Minimumperiod:18.982nsMaximumfrequence:52.681MHz