CRC即循环冗余校验码(Cyclic Redundancy Check[1] )。它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制。
参数模型
这个很重要,计算CRC值时,不仅仅是生成项POLY会影响到CRC值,还有很多参数会影响到最终的CRC值! 我也是查了很久才知道,晕死,在网上找了好多算法,都不是我要的结果(和另一端校验值相等的结果,另一端是个糊涂人,也不知道参数模型,不知道从哪找的例子,copy出来就用,可惜是fpga语言,上位机不能用,可苦了我了)。
CRC计算,需要有CRC参数模型,比如CRC32的参数模型是:
Width : 32
Poly : 04C11DB7
RefIn : True
RefOut : True
XorOut : FFFFFFFF
在这里记录一下crc 32的生成代码。
-
CRC-32的预置码表
计算时要选取一个多项式作为除数,一般CRC-32选取如下三个多项式值中的一个
Polynomial representations- Normal :0x04C11DB7
- Reversed :0xEDB88320
- Reversed reciprocal :0x82608EDB
在实际数据通讯时,信息字节先传送或先接收低位字节,这时候使用翻转反转多项(这样避免翻转数据,增加运算量)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- CRC 32
余数初始值(Initial value):0xFFFFFFFF
结果异或值 (Final XOR value):0xFFFFFFFF
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
我使用的是另一种, MPEG-2的参数模型,这里先不列出来代码了。其实只是涉及到了位的反转
CRC即循环冗余校验码(Cyclic Redundancy Check[1] )。它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制。
参数模型
这个很重要,计算CRC值时,不仅仅是生成项POLY会影响到CRC值,还有很多参数会影响到最终的CRC值! 我也是查了很久才知道,晕死,在网上找了好多算法,都不是我要的结果(和另一端校验值相等的结果,另一端是个糊涂人,也不知道参数模型,不知道从哪找的例子,copy出来就用,可惜是fpga语言,上位机不能用,可苦了我了)。
CRC计算,需要有CRC参数模型,比如CRC32的参数模型是:
Width : 32
Poly : 04C11DB7
RefIn : True
RefOut : True
XorOut : FFFFFFFF
在这里记录一下crc 32的生成代码。
-
CRC-32的预置码表
计算时要选取一个多项式作为除数,一般CRC-32选取如下三个多项式值中的一个
Polynomial representations- Normal :0x04C11DB7
- Reversed :0xEDB88320
- Reversed reciprocal :0x82608EDB
在实际数据通讯时,信息字节先传送或先接收低位字节,这时候使用翻转反转多项(这样避免翻转数据,增加运算量)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- CRC 32
余数初始值(Initial value):0xFFFFFFFF
结果异或值 (Final XOR value):0xFFFFFFFF
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
我使用的是另一种, MPEG-2的参数模型,这里先不列出来代码了。其实只是涉及到了位的反转