FPGA之CRC校验

CRC校验原理

 

 

  1. 求解CRC-8的编码电路和CRC校验的原理

G(X) = X8+H7*X7+H6*X6+H5*X5+H4*X4+H3*X3+H2*X2+H1*X1+X0

 

生成多项式

G(X)=9‘b1_0000_0111

信息位(需要发送的数据)

16’b=1100_1101_0010_1110

 

1100_1101_0010_1110__0000_0000(待编码的数据)

1000_0011_1(二进制除法做异或运算)

0100_1110_10

 100_0001_11

 000_1111_0110_1

     1000_0011_1

     0111_0101_01

100_0001_11

011_0110_101

10_0000_111

01_0110_0100

 1_0000_0111

 0_0110_0011_00

    100_0001_11

    010_0010_110

     10_0000_111

     00_0010_0010_000

          10_0000_111

               10_1110

最后得到的是我们信息位的校验位,用于接收端对帧数据是否出错进行判断的冗余位。

编码后的数据为:

1100_1101_0010_1110__0010_1110

 

解码过程:

1100_1101_0010_1110__0010_1110

1000_0011_1(二进制除法做异或运算)

0100_1100_1

………………………..

        0_0110_0011__00

           100_0001__11

                    010_0010__111

10_0000__111

00_0010__0000_111

     10_0000__111

     00_0000__0000

 

 

 
 


生成多项式的除法电路:

图中编号为1,2……78寄存器对应R[0]R[7]

推导出两位并行输入的数据的CRC-8的算法

D[1:0]//数据的输入

R[7:0]//除法电路的寄存器

移入一比特时各个寄存器的状态为:(移入的数据比特指D[0])

第一个寄存器:D[0]^R[7]

第二个寄存器: D[0]^R[7]^R[0]

第三个寄存器: D[0]^R[7]^R[1]

第四个寄存器:R[2]

第五个寄存器: R[3]

第六个寄存器: R[4]

第七个寄存器: R[5]

第八个寄存器: R[6]

移入第二个数据比特时各个寄存器的状态为: (移入的第二个数据比特指D[1])

第一个寄存器:D[1]^R[6]

第二个寄存器: D[1]^R[6]^ D[0]^R[7]

第三个寄存器: D[1]^R[6]^ D[0]^R[7]^R[0]

第四个寄存器: D[0]^R[7]^R[1]

第五个寄存器: R[2]

第六个寄存器: R[3]

第七个寄存器: R[4]

第八个寄存器: R[5]

按照这个个推导方式可以推导出8位除法电路。同样32位CRC冗余校验也是这样的操作方法,32位运算起来太麻烦了,一般某项技术标准中会有直接的结论不需要自己再推,我们要做的是用FPGA把这些算法实现起来。

猜你喜欢

转载自blog.csdn.net/qq_41754003/article/details/107599407