以8位并行数据为例确定crc-32的一般矩阵表示形式
2014-11-24 21:55
411 查看
在进行数据校验时我们会使用到crc(循环冗余校验)校验的方式,例如在以太网通信网络中会对信息进行编码和校验,生成码采用的就是33位的
crc-32:x32+x26+x23+...+x2+x+1; (104c11db7)。循环冗余校验码的计算是模2的除法运算。模2指的是运算的时候不进行借位和进位的操作。可以用下面的例子来说明。假如信息码为11011,生成码为101(2+1)则校验码的计算过程是
先把信息码左移两位(二进制),得1101100。
然后通过异或操作
1101100
101
---------
111100
101
---------
010100
101
--------
00000
这个计算结果为00
假如信信息码为1100时,余码就是01
110000
101
----
010000
101
--------
00100
101
------
001
所以根据上面的运算可以得出任何信息码的余码。
一般使用线性反馈移位寄存器LFSR或(LFSR2)来进行物理实现。这两种方式结构如下:
本篇文章我使用的是LFSR2结构,假如使用LFSR结构需要在先输入n位的0(n是冗余码的位数)。为简单起见推导过程使用的4位信息码,8位的冗余码,生成式为P={p7,p6,p5,p4,p3,p2,p1,p0},初始余码为X0={x0(7),x0(6),x0(5),x0(4),x0(3),x0(2),x0(1),x0(0)}。输入数据D={d3,d2,d1,d0};
则当输入一位d3时表达式;+表示异或
x1(7)=x0(6)+p7(x0(7)+d3)=p7x0(7)+x0(6)+p7d3;
x1(6)=x0(5)+p6(x0(7)+d3)=p6x0(7)+x0(5)+p6d3;
x1(5)=x0(4)+p5(x0(7)+d3)=p5x0(7)+x0(4)+p5d3;
x1(4)=x0(3)+p4(x0(7)+d3)=p4x0(7)+x0(3)+p4d3;
x1(3)=x0(2)+p3(x0(7)+d3)=p3x0(7)+x0(2)+p3d3;
x1(2)=x0(1)+p2(x0(7)+d3)=p2x0(7)+x0(1)+p2d3;
x1(1)=x0(0)+p1(x0(7)+d3)=p1x0(7)+x0(0)+p1d3;
x1(0)=p0(x0(7)+d3)=p0x0(7)+p0d3;
X1'=FX0'+P'd3;其中
F={ p7,1,0,0,0,0,0,0
p6,0,1,0,0,0,0,0
p5,0,0,1,0,0,0,0
p4,0,0,0,1,0,0,0
p3,0,0,0,0,1,0,0
p2,0,0,0,0,0,1,0
p1,0,0,0,0,0,0,1
p0,0,0,0,0,0,0,0}
同样可以得X2'=FX1'+P'd2;
X3'=FX2'+P'd1;
X4'=FX3'+P'd0;
进而得X4'=F*F*F*F*X0+{F*F*F*P',F*F*P',F*P',P'}*D';
所以输入四位数据时最后余码的状态与初始的状态有关。
对于任意的n位并行信息码Xn=Fn*X0+{F(n-1)p'.....p'}D'。
下面是用表格对8位信息码,32位余码,生成码为0x04c11db7;
参考Excel表格。最后的结果为(左边为低位x0~x31)
以下为在verilog中的验证代码:
modelsim 中显示结果
crc-32:x32+x26+x23+...+x2+x+1; (104c11db7)。循环冗余校验码的计算是模2的除法运算。模2指的是运算的时候不进行借位和进位的操作。可以用下面的例子来说明。假如信息码为11011,生成码为101(2+1)则校验码的计算过程是
先把信息码左移两位(二进制),得1101100。
然后通过异或操作
1101100
101
---------
111100
101
---------
010100
101
--------
00000
这个计算结果为00
假如信信息码为1100时,余码就是01
110000
101
----
010000
101
--------
00100
101
------
001
所以根据上面的运算可以得出任何信息码的余码。
一般使用线性反馈移位寄存器LFSR或(LFSR2)来进行物理实现。这两种方式结构如下:
本篇文章我使用的是LFSR2结构,假如使用LFSR结构需要在先输入n位的0(n是冗余码的位数)。为简单起见推导过程使用的4位信息码,8位的冗余码,生成式为P={p7,p6,p5,p4,p3,p2,p1,p0},初始余码为X0={x0(7),x0(6),x0(5),x0(4),x0(3),x0(2),x0(1),x0(0)}。输入数据D={d3,d2,d1,d0};
则当输入一位d3时表达式;+表示异或
x1(7)=x0(6)+p7(x0(7)+d3)=p7x0(7)+x0(6)+p7d3;
x1(6)=x0(5)+p6(x0(7)+d3)=p6x0(7)+x0(5)+p6d3;
x1(5)=x0(4)+p5(x0(7)+d3)=p5x0(7)+x0(4)+p5d3;
x1(4)=x0(3)+p4(x0(7)+d3)=p4x0(7)+x0(3)+p4d3;
x1(3)=x0(2)+p3(x0(7)+d3)=p3x0(7)+x0(2)+p3d3;
x1(2)=x0(1)+p2(x0(7)+d3)=p2x0(7)+x0(1)+p2d3;
x1(1)=x0(0)+p1(x0(7)+d3)=p1x0(7)+x0(0)+p1d3;
x1(0)=p0(x0(7)+d3)=p0x0(7)+p0d3;
X1'=FX0'+P'd3;其中
F={ p7,1,0,0,0,0,0,0
p6,0,1,0,0,0,0,0
p5,0,0,1,0,0,0,0
p4,0,0,0,1,0,0,0
p3,0,0,0,0,1,0,0
p2,0,0,0,0,0,1,0
p1,0,0,0,0,0,0,1
p0,0,0,0,0,0,0,0}
同样可以得X2'=FX1'+P'd2;
X3'=FX2'+P'd1;
X4'=FX3'+P'd0;
进而得X4'=F*F*F*F*X0+{F*F*F*P',F*F*P',F*P',P'}*D';
所以输入四位数据时最后余码的状态与初始的状态有关。
对于任意的n位并行信息码Xn=Fn*X0+{F(n-1)p'.....p'}D'。
下面是用表格对8位信息码,32位余码,生成码为0x04c11db7;
参考Excel表格。最后的结果为(左边为低位x0~x31)
以下为在verilog中的验证代码:
module arc_8(input clk,output reg [31:0] crc); reg [4:0]count=0; reg [31:0] fcs_temp,datatemp2; reg [31:0] R ; reg[2:0] step=0; reg [7:0]data_count=0; reg [2:0] num=0; reg on=1; reg [7:0] datatemp; always@(posedge clk) begin case(step) 0:begin if(on) step<=1;else step<=0;R<=0;end 1:begin if(data_count<126)begin // 主要是第一个循环0x60e84e34,验证的结果应该为0x7db9cbc8 case(num) 0:begin datatemp<=8'h60;num<=1;on<=1;end 1:begin datatemp <=8'he8;num<=2;end 2:begin datatemp<=8'h4e;num<=3;end 3:begin datatemp<=8'h34;num<=0;data_count<=data_count+1;end endcase step<=3;end else begin on<=0; step<=6;end end 3:begin step<=4; //00100000100000000000000000000000 fcs_temp[31]<=R[23]^R[29]; //10010000010000000000000000000000 fcs_temp[30]<=R[22]^ R[28]^R[31]; //11001000001000000000000000000000 fcs_temp[29]<=R[21]^ R[27]^R[30]^R[31]; //01100100000100000000000000000000 fcs_temp[28]<=R[20]^R[26]^R[29]^R[30]; //10110010000010000000000000000000 fcs_temp[27]<=R[19]^R[25]^R[28]^R[29]^R[31]; //01011001000001000000000000000000 fcs_temp[26]<= R[18]^R[24]^R[27]^ R[28]^ R[30]; //00001100000000100000000000000000 fcs_temp[25]<=R[17]^R[26]^R[27]; //10000110000000010000000000000000 fcs_temp[24]<=R[16]^R[25]^R[26]^R[31]; //01000011000000001000000000000000 fcs_temp[23]<=R[15]^R[24]^R[25]^R[30]; //00000001000000000100000000000000 fcs_temp[22]<=R[14]^R[24]; //00100000000000000010000000000000 fcs_temp[21]<=R[13]^R[29]; //00010000000000000001000000000000 fcs_temp[20]<=R[12]^ R[28]; //10001000000000000000100000000000 fcs_temp[19]<=R[11]^R[27]^ R[31]; //11000100000000000000010000000000 fcs_temp[18]<=R[10]^ R[26]^R[30]^R[31]; //01100010000000000000001000000000 fcs_temp[17]<=R[ 9]^R[25]^R[29]^R[30]; //00110001000000000000000100000000 fcs_temp[16]<=R[ 8]^R[24]^R[28]^R[29]; //10111000000000000000000010000000 fcs_temp[15]<=R[ 7]^R[27]^R[28]^R[29]^R[31]; //11011100000000000000000001000000 fcs_temp[14]<=R[ 6]^R[26]^R[27]^R[28]^R[30]^R[31]; //11101110000000000000000000100000 fcs_temp[13]<=R[ 5]^R[25]^R[26]^R[27]^ R[29]^ R[30]^ R[31]; //01110111000000000000000000010000 fcs_temp[12]<=R[ 4]^R[24]^R[25]^R[26]^R[28]^R[29]^R[30]; //00011011000000000000000000001000 fcs_temp[11]<=R[ 3]^R[24]^R[25]^R[27]^R[28]; //00101101000000000000000000000100 fcs_temp[10]<=R[ 2]^R[24]^R[26]^R[27]^R[29]; //00110110000000000000000000000010 fcs_temp[9]<=R[ 1]^R[25]^R[26]^R[28]^R[29]; //00011011000000000000000000000001 fcs_temp[8]<=R[ 0]^R[24]^R[25]^R[27]^R[28]; //10101101000000000000000000000000 fcs_temp[7]<=R[24]^R[26]^R[27]^R[29]^R[31]; //11110110000000000000000000000000 fcs_temp[6]<=R[25]^R[26]^R[28]^R[29]^R[30]^R[31]; //11111011000000000000000000000000 fcs_temp[5]<=R[24]^R[25]^R[27]^R[28]^R[29]^R[30]^R[31]; //01011101000000000000000000000000 fcs_temp[4]<=R[24]^R[26]^R[27]^R[28]^R[30]; //10001110000000000000000000000000 fcs_temp[3]<=R[25]^R[26]^R[27]^R[31]; //11000111000000000000000000000000 fcs_temp[2]<=R[24]^R[25]^R[26]^R[30]^R[31]; //11000011000000000000000000000000 fcs_temp[1]<=R[24]^R[25]^R[30]^R[31]; //01000001000000000000000000000000 fcs_temp[0]<=R[24]^R[30];end 4:begin step<=5; datatemp2[31]<=datatemp[ 5]; datatemp2[30]<=datatemp[ 4]^datatemp[ 7]; datatemp2[29]<=datatemp[ 3]^datatemp[ 6]^datatemp[ 7]; datatemp2[28]<=datatemp[ 2]^datatemp[ 5]^datatemp[ 6]; datatemp2[27]<=datatemp[ 1]^datatemp[ 4]^datatemp[ 5]^datatemp[ 7]; datatemp2[26]<=datatemp[ 0]^datatemp[ 3]^datatemp[ 4]^datatemp[ 6]; datatemp2[25]<=datatemp[ 2]^datatemp[ 3]; datatemp2[24]<=datatemp[ 1]^datatemp[ 2]^datatemp[ 7]; datatemp2[23]<=datatemp[ 0]^datatemp[ 1]^datatemp[ 6]; datatemp2[22]<=datatemp[ 0]; datatemp2[21]<=datatemp[ 5]; datatemp2[20]<=datatemp[ 4]; datatemp2[19]<=datatemp[ 3]^datatemp[ 7]; datatemp2[18]<=datatemp[ 2]^datatemp[ 6]^datatemp[ 7]; datatemp2[17]<=datatemp[ 1]^datatemp[ 5]^datatemp[ 6]; datatemp2[16]<=datatemp[ 0]^datatemp[ 4]^datatemp[ 5]; datatemp2[15]<=datatemp[ 3]^datatemp[ 4]^datatemp[ 5]^datatemp[ 7]; datatemp2[14]<=datatemp[ 2]^datatemp[ 3]^datatemp[ 4]^datatemp[ 6]^datatemp[ 7]; datatemp2[13]<=datatemp[ 1]^datatemp[ 2]^datatemp[ 3]^datatemp[ 5]^datatemp[ 6]^datatemp[ 7]; datatemp2[12]<=datatemp[ 0]^datatemp[ 1]^datatemp[ 2]^datatemp[ 4]^datatemp[ 5]^datatemp[ 6]; datatemp2[11]<=datatemp[ 0]^datatemp[ 1]^datatemp[ 3]^datatemp[ 4]; datatemp2[10]<=datatemp[ 0]^datatemp[ 2]^datatemp[ 3]^datatemp[ 5]; datatemp2[9]<=datatemp[ 1]^datatemp[ 2]^datatemp[ 4]^datatemp[ 5]; datatemp2[8]<=datatemp[ 0]^datatemp[ 1]^datatemp[ 3]^datatemp[ 4]; datatemp2[7]<=datatemp[ 0]^datatemp[ 2]^datatemp[ 3]^datatemp[ 5]^datatemp[ 7]; datatemp2[6]<=datatemp[ 1]^datatemp[ 2]^datatemp[ 4]^datatemp[ 5]^datatemp[ 6]^datatemp[ 7]; datatemp2[5]<=datatemp[ 0]^datatemp[ 1]^datatemp[ 3]^datatemp[ 4]^datatemp[ 5]^datatemp[ 6]^datatemp[ 7]; datatemp2[4]<=datatemp[ 0]^datatemp[ 2]^datatemp[ 3]^datatemp[ 4]^datatemp[ 6]; datatemp2[3]<=datatemp[ 1]^datatemp[ 2]^datatemp[ 3]^datatemp[ 7]; datatemp2[2]<=datatemp[ 0]^datatemp[ 1]^datatemp[ 2]^datatemp[ 6]^datatemp[ 7]; datatemp2[1]<=datatemp[ 0]^datatemp[ 1]^datatemp[ 6]^datatemp[ 7]; datatemp2[0]<=datatemp[ 0]^datatemp[ 6];end 5:begin R<=fcs_temp^datatemp2; step<=1;end 6:begin step<=0;crc<=~R;end endcase end endmodule
modelsim 中显示结果
相关文章推荐
- MFC学习(6)——以数组矩阵形式表示读取出来的BMP图像||将数组矩阵数据转成BMP图像
- R实战:【基本类型】数据框frame(矩阵的一般形式)
- 在Transact-SQL语句中如何用常量来表示二进制形式的数据?
- 数据在内存中始终是以二进制形式存放的,数值是以补码表示的
- 假设用一个名为text的字符串向量存放文本文件的数据,其中的元素或者是一句话或者是一个用于表示段分隔的空字符串。将text中第一段全改为大写形式
- C语言---程序的一般形式、数据类型、常量变量、运算符、表达式、格式化输入输出
- python中如何表示多维数组(即矩阵形式)
- 数据在内存中始终是以二进制形式存放的。数值是以补码表示的
- 取给定正整数的指定bit位开始的指定长度的数据 将整数拆分成bit位表示的形式
- 数据在计算机中表示形式原码、反码、补码
- ISO8601:2004 数据存储和交换形式·信息交换·日期和时间的表示方法
- rat/rats--用有理数形式表示矩阵
- 获取BMP图像的数据(以数组矩阵形式读取出来)&&将数组矩阵数据转成BMP图像
- 变换的矩阵表示形式
- 指定long型数据的字节大小表示形式
- 以三元组形式输出用十字链表表示的稀疏矩阵中非零元素及其下标的算法
- 数据结构作业稀疏矩阵三元组表示
- 一般8位的微型机系统以16位来表示地址,则该计算机系统有几个地址空间
- Python读取数据文件转存成矩阵形式
- 最小二乘法(一般形式和矩阵形式)