CRC校验原理

CRC校验三个关键流程:
1、选取一个除数。
2、需要校验的数据为被除数。
3、模2除法的余数为校验结果。

一、模二除法

定义:二进制数据的异或运算。
备注:异或运算“相同为零,不同为1”。

二、选择除数(CRC生成多项式)

二进制可表示成多项式的形式,比如二进制1001表示为: x3+x0;0011表示为:x1+x0。
生成多项式的选取是有一定标准的,该多项式可以是任何数学多项式(没有任何系数),但是它的最高指数不能超过CRC的位数。
比如我们要生成一个8位CRC(CRC-8),那么多项式的最高指数也必须是8,比如:x8+x2+x+1。
选择除数,需要考虑两个方面:随机错误检测精度、突发错误检测精度。

(1)随机错误检测精度

随机错误是指在数据中随机出现的错误。例如,在传输数据时,单个比特被翻转,或者在传输过程中丢失几个比特。根据我们使用的CRC的位大小,我们可以检测到大多数这些随机错误。然而,对于CRC-n来说,这些错误的1/2^n。
CRC 不可检测错误 百分比
CRC-8 1/2^8 0.39
CRC-16 1/2^16 0.0015
CRC-32 1/2^32 0.00000002
CRC-64 1/2^64 5.4*10^(-20)

(2)突发错误检测精度

数据传输中的错误通常不是随机的,而是连续的出现几个位的错误,这种错误称为突发错误,它是数据通信中最常见的错误。CRC-n可以检测最大长度为n位的单突发错误。

CRC 不可检测错误
CRC-8 至少出现一个连续的错误突发,但这个长度≤8位
CRC-16 至少出现一个连续的错误突发,但这个长度≤16位
CRC-32 至少出现一个连续的错误突发,但这个长度≤32位
CRC-64 至少出现一个连续的错误突发,但这个长度≤64位

(3)标准的CRC生成多项式

名称   	生成多项式	简记式
CRC-4	x4+x+1	0x03
CRC-8	x8+x5+x4+1	0x31
CRC-8	x8+x2+x1+1 	0x07
CRC-8	x8+x6+x4+x3+x2+x1	0x5E
CRC-12	x12+x11+x3+x+1	0x080F
CRC-16	x16+x15+x2+1 	0x8005
CRC16-CCITT	x16+x12+x5+1	0x1021
CRC-32	x32+x26+x23+...+x2+x+1	0x04C11DB7

三、被除数处理

1、需要在被除数后加n-1个比特位0

具体加几个0是根据除数的位数决定的,比如除数为CRC-8,那么A后面加7个0;如果除数为CRC-16,则A后面加15个0。

2、模2除法具有下列三个性质:

当最后余数得位数小于除数位数时,除法停止;
当被除数得位数小于除数位数时,则商数为0,被除数就是余数;
只要被除数或部分余数得位数与除数一样多,且最高位为1,不管其他位是什么数,皆可商1;

3、实例

给定一组数据A:10110011(二进制),选取除数B:11001。
首先需要在被除数A后加4个比特位0(具体加几个0是根据除数B的位数决定的,比如这里B是5位,那么A后面加4个0;如果B选6位,则A后面加5个0,总之加的0的个数比除数B的个数少1位。后面还会提到怎么添加)。
进行模2除法运算。注意每次都是模2运算,即异或。
最后得到余数C就是CRC校验值。注意余数位数必须比除数少1位,如果不够前面加0补齐。运算如下图所示
在这里插入图片描述

四、实际的CRC计算过程

1、四个概念:余数初始值、结果异或值、输入数据反转、输出数据反转。

余数初始值:即在计算开始前,先给变量CRC赋的初值。
输入数据反转:即在计算开始前,将需要校验的数据反转,如数据位1011,反转后为1101。
结果异或值:即在计算结束后,得到的变量CRC与这个值进行异或操作,就得到了最终的校验值。
输出数据反转:即在计算结束后,与结果异或值异或之前,计算值反转,如计算结果为1011,反转后为1101。
2、CRC参数模型
在这里插入图片描述

2、CRC-16/IBM校验实例

预置1个16位的变量CRC,存放校验值,首先根据表3-1赋初值0x0000;
将第1个字节按照表3-1看是否需要反转,若需要,则按反转,若不需要,直接进入第3步。这里需要反转;
把第1个字节按照步骤2处理后,与16位的变量CRC的高8位相异或,把结果放于变量CRC,低8位数据不变;
把变量CRC的内容左移1位(朝高位)用0填补最低位,并检查左移后的移出位;
如果移出位为0:重复第4步(再次左移一位);如果移出位为1,变量CRC与多项式8005(1000 0000 0000 0101)进行异或;
重复步骤4和5,直到左移8次,这样整个8位数据全部进行了处理;
重复步骤2到步骤6,进行通讯信息帧下一个字节的处理;
将该通讯信息帧所有字节按上述步骤计算完成后,将得到的16位变量CRC按照表3-1看是否需要反转,这里需要反转;
最后,与结果异或值异或,得到的变量CRC即为CRC校验值;

/*****************************************************************************
*function name:crc16
*function: CRC校验,校验值为16位
*input:addr-数据首地址;num-数据长度(字节);type-CRC16的算法类型
*output:16位校验值
******************************************************************************/
u16 crc16(u8 *addr, int num,CRC_16 type)  
{  
    u8 data;
    u16 crc = type.InitValue;					//初始值
    int i;  
    for (; num > 0; num--)               
    {  
        data = *addr++;
        if(type.InputReverse == TRUE)
            data = reverse8(data);				//字节反转
        crc = crc ^ (data<<8) ;					//与crc初始值高8位异或 
        for (i = 0; i < 8; i++)					//循环8位 
        {  
            if (crc & 0x8000)					//左移移出的位为1,左移后与多项式异或
                crc = (crc << 1) ^ type.poly;    
            else		                        //否则直接左移
                crc <<= 1;                  
        }
    }
    if(type.OutputReverse == TRUE)              //满足条件,反转
        crc = reverse16(crc);
    crc = crc^type.xor;	                        //最后返与结果异或值异或
    return(crc);                                //返回最终校验值
}
  • 12
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: FPGA CRC校验原理是使用循环冗余校验算法对数据进行校验。CRC校验通常用于数据传输或存储时,以防止数据在传输或存储过程中被破坏或篡改。在FPGA中,CRC校验器通常是由硬件实现的模块,可以通过FPGA的可编程逻辑进行设计。 CRC校验原理是将需要校验的数据分成一定大小的数据块,每个数据块都传送时进行校验。校验数据块时,FPGA会计算数据块的CRC码,然后与数据传输或存储设备中存储的CRC码进行比较。 在FPGA中,校验数据块的过程通常由硬件实现的模块完成。该模块会输入需要校验的数据块和预定义的CRC码种子,然后按照预定义的算法进行计算。计算完成后,该模块会输出新的CRC码,然后FPGA会与存储或传输设备中的CRC码进行比较,以确定数据块是否正确。 总的来说,FPGA CRC校验是一种用于数据传输或存储过程中数据校验的方法。在硬件实现中,FPGA会根据预定义的算法对数据进行计算,并与存储或传输设备中存储的CRC码进行比较,以确保数据传输或存储的可靠性。 ### 回答2: FPGA CRC校验是一种基于硬件的数据校验方法,它通过将待校验的数据流和预定的校验码值一起输入到FPGA芯片中,利用硬件电路实现CRC计算。CRC校验是一种能够检测数据传输过程中是否发生了错误的技术,它可以检测到单比特错、双比特错甚至更多比特的错。 具体来说,FPGA CRC校验的实现原理是通过将输入的数据流和预定义的CRC校验码一同送入CRC电路中,经过一系列的移位、异或和反转操作得到校验结果,然后将校验值与输出的校验结果比较,如果出现差错,则表示数据包出现错误。FPGA CRC校验是一种高效、稳定的校验方法,它广泛应用于数字通信、网络传输、存储设备等领域。 总之,FPGA CRC校验是一种依靠硬件实现的数据完整性校验方式,它通过预定义的校验算法计算出数据包的校验值,并与实际校验结果进行比较,从而检测数据传输过程中是否发生了差错,保证数据在传输过程中的安全可靠。 ### 回答3: FPGA作为一种灵活可编程的集成电路,可以灵活地实现各种数字电子系统中的处理、控制、通信、计算等功能,其中CRC校验是一种应用比较广泛的数据校验协议。其原理是在传输数据的时候,通过添加一个校验码到数据后面,接收端可以通过对数据和校验码进行计算来验证数据的准确性。 在FPGA中实现CRC校验,通常采用硬件的实现方式,首先通过CRC算法计算生成CRC校验码表,然后将该表存储在FPGA中。在数据传输过程中,FPGA通过对数据和CRC校验码表进行异或运算,得到计算结果,并将该计算结果加到原始数据的末尾,然后将数据和校验码一起发送。接收端接收数据后,同样对数据和CRC校验码表进行异或计算,并将其与接收到的校验码进行比较,如果相同则表明数据传输正确,否则需要重新传输。 FPGA实现CRC校验具有高速、低功耗、可靠性强等优点,特别适合高速数据传输领域,如网络通信、存储设备、无线通信等领域。此外,FPGA还具有可编程性强、适应性广泛等优点,可以根据不同应用需求进行优化设计,提高数据的可靠性和传输速率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值