CRC即循环冗余校验,是一种数据传输的校验算法。校验算法是在传输数据中按照某种规律产生校验码,与传输数据一起传输到接收端,接收端按照同样的规律解析,并通过比对结果判断传输数据是否发生错误。
CRC利用模二除法的原理校验数据,用除法的余数作为校验码。
校验过程中收发双方事先约定好多项式(以下称Poly多项式),冗余码(校验码)的宽度是Poly多项式的宽度减1。
发送端首先将发送数据后拼接冗余码宽度个0,然后将拼接后的数据与Poly多项式作模二除操作,最后的余数作为冗余码拼接在传输数据后。
例如:用Poly多项式计算,数据101001的冗余码,如下图所示,最后余数是1,CRC校验要求冗余码不足的部分用0补充,所以冗余码取001,在实际传输中传输的数据为101001001
GF[2]上有定理:
那么:%=[%] [%]
对于F(x)可以表示为如下形式:
...
F(x)等价于:
............
所以F(x)%g(x)等于:
...0%...0%......%...%
对于不为0,则参与整体异或运算,为0则不参与整体异或运算。
例如F(x)为8bit,CRC码为4bit,则有如下表:
CRC | |
1000 0000 | 1110 |
0100 000 | 0111 |
0010 0000 | 1010 |
0001 0000 | 0101 |
0000 1000 | 1011 |
0000 0100 | 1100 |
0000 0010 | 0110 |
0000 0001 | 0011 |
从上表可以看出CRC的bit3由异或结果确定(对应CRC bit3为1的项),其余bit可以同理推出。
crc[3]=data[7]^data[5]^data[3]^data[2];
crc[2]=data[7]^data[6]^data[4]^data[2]^data[1];
crc[1]=data[7]^data[6]^data[5]^data[3]^data[1]^data[0];
crc[0]=data[6]^data[4]^data[3]^data[0];
网址 https://gitee.com/jszhanghit/CRC_parallel_polynomial/tree/master 可以获取crc并行计算verilog代码的生成脚本。