CRC基本原理和计算方式-FPGA常见问题社区-FPGA CPLD-ChipDebug

CRC基本原理和计算方式

循环冗余校验(CRC) 
背景

循环冗余校验码(CRC) 是在数字数据的生成、传输、处理或存储过程中用于错误检测的最广泛使用的代码之一。简单来说,CRC 码在传输、处理和数据静止期间保持数据的完整性。为了使用 CRC 进行错误检测,输入流除以标准多项式,称为特定 CRC 标准的“生成多项式”。此除法过程中的余数称为输入数据的 CRC 码。在传输或存储数据之前,该剩余部分与原始数据相连。在接收器处,传输的数据(原始数据及其 CRC)再次除以相同的生成多项式。如果在传输或存储期间没有引入错误,则该除法的余数应为零。循环冗余码最常用于检测突发错误。CRC 经常使用,因为它们易于设计并且能够检测大量错误。特定 CRC 代码能够检测到的错误类型取决于其生成多项式 。可以使用循环冗余校验码检测以下类型的错误:所有单位或两位错误。所有奇数位错误。所有突发错误,其中突发大小小于或等于生成多项式的次数。

 

CRC 数学原理

 

宏观的角度看一下校验过程,如下图所示,带有CRC校验的数据格式为数据+添加项,我们把发送的总数据位记作N,消息位(Message bits)记作k,添加项位数(Appended bits)记作n,即N-k=n,也就是常说的二进制 (N, k) CRC 码。

图片[1]-CRC基本原理和计算方式-FPGA常见问题社区-FPGA CPLD-ChipDebug

若用多项式表示,如下:

 

图片[2]-CRC基本原理和计算方式-FPGA常见问题社区-FPGA CPLD-ChipDebug

 

图片[3]-CRC基本原理和计算方式-FPGA常见问题社区-FPGA CPLD-ChipDebug

 

图片[4]-CRC基本原理和计算方式-FPGA常见问题社区-FPGA CPLD-ChipDebug

 

根据上面描述的CRC code bits 的计算方式,消息位(Message bits)也就是你要发的实际数据位是已知的,所需要计算的就是添加项(即多项式R(x)),这就需要n阶生成多项式g(x)(用二进制表示是n+1位)

 

图片[5]-CRC基本原理和计算方式-FPGA常见问题社区-FPGA CPLD-ChipDebug

 

图片[6]-CRC基本原理和计算方式-FPGA常见问题社区-FPGA CPLD-ChipDebug除以 g(X)(模 2 除法)得到余数,即 R(X),注意R(x)是n-1阶,用二进制表示是n位数据。之所以要把m(x)乘以X的n阶,是为了把要发的数据向左移n位,给计算的添加项“挪位置”。因为本身的n位二进制添加项是要加到消息(Message)后面的。

图片[7]-CRC基本原理和计算方式-FPGA常见问题社区-FPGA CPLD-ChipDebug

计算R(X)举例:

图片[8]-CRC基本原理和计算方式-FPGA常见问题社区-FPGA CPLD-ChipDebug

 

图片[9]-CRC基本原理和计算方式-FPGA常见问题社区-FPGA CPLD-ChipDebug

 

那么,图片[10]-CRC基本原理和计算方式-FPGA常见问题社区-FPGA CPLD-ChipDebug,添加项为0110(n=4),即发送的数据为:111001100110

校验正确举例:

接收码字的多项式 T(X) 除以生成多项式 g(X)

图片[11]-CRC基本原理和计算方式-FPGA常见问题社区-FPGA CPLD-ChipDebug

图片[12]-CRC基本原理和计算方式-FPGA常见问题社区-FPGA CPLD-ChipDebug 接收端接收到的带CRC的据111001100110

图片[13]-CRC基本原理和计算方式-FPGA常见问题社区-FPGA CPLD-ChipDebug

即T(X)除以g(x)余项为0,所以校验正确

校验错误举例

图片[14]-CRC基本原理和计算方式-FPGA常见问题社区-FPGA CPLD-ChipDebug

传输的带有CRC校验的数据:111001100110

接收的带有CRC校验的数据:110011100110

 

图片[15]-CRC基本原理和计算方式-FPGA常见问题社区-FPGA CPLD-ChipDebug

 

可得余项为x,即添加项为0010不为0000,校验出错,证明接收的数据有误。

CRC (7, 4) 的向量形式示例1

注:Divisor是n阶g(x)的二进制表示,二进制位数为n+1位,remainder是n-1阶R(x),二进制为n位,在接收到带有CRC校验的数据时,计算出的syndrome不为0,即出现错误。下面的例子有按照多项式的计算也有二进制的计算。

图片[16]-CRC基本原理和计算方式-FPGA常见问题社区-FPGA CPLD-ChipDebug

 

CRC (7, 4) 的向量形式示例2

图片[17]-CRC基本原理和计算方式-FPGA常见问题社区-FPGA CPLD-ChipDebug

 

CRC (7, 4) 的向量形式示例3

图片[18]-CRC基本原理和计算方式-FPGA常见问题社区-FPGA CPLD-ChipDebug

 

CRC (7, 4) 的向量形式示例4

图片[19]-CRC基本原理和计算方式-FPGA常见问题社区-FPGA CPLD-ChipDebug

常见CRC

图片[20]-CRC基本原理和计算方式-FPGA常见问题社区-FPGA CPLD-ChipDebug

 

总结:本文主要使用简单的CRC来讲解基础的原理,各种生成项的行列式校验能力是不一样的,用的场合也不同,根据需求选择。

 

参考文献:ELEC 7073 Digital Communications III, Dept. of E.E.E., HKU

 

请登录后发表评论

    没有回复内容