CRC校验 串行 并行 长除 移位 查表 矩阵

CRC校验的几种类型:
  1. 长除法,也叫直接计算法
  2. 移位寄存器,也叫线性移位
  3. 查表法
  4. 并行算法
一些有用的网页:
CRC并行推导
 
 
 
CRC长除法和移位寄存器法的介绍,初始值设定区别
 
CRC在线校验
 
CRC并行电路生成
 
 

1、长除法

将信息码(数据)升n-k次幂后除以生成多项式,然后将所得余式放在升幂后的多项式之后。

2、移位寄存器

可由长除法推导出来

3、查表法

比如一次处理4bit,提前做好4bit的对应查找表,使用生成式与自生异或构建成新的式子,使得新的式子高4bit和待处理数据相同,则可一次处理完4bit。将4bit的所有可能整理出表格,则根据不同待处理数据的能容快速查表
使用此方法的原理:
    XOR的交换律(a XOR b) XOR c =a XOR (b XOR c)
    构建表时,需要用右移位过后,高位补零来的生成式来进行异或构建表,右移原因:除法时,被除数高位为0,除数就会右移;不能左移
 
例子:
    生成式:1010 1110 0
    待测数据:1011 0100 1101
 
 

CRC校验 串行 并行 长除 移位 查表 矩阵

CRC校验 串行 并行 长除 移位 查表 矩阵

4、并行计算

串行电路:CRC校验 串行 并行 长除 移位 查表 矩阵
 
通过串行运算的系统状态方程组进行并行处理的推导,如下为串行状态方程
CRC校验 串行 并行 长除 移位 查表 矩阵
推导出并行矩阵算法:
CRC校验 串行 并行 长除 移位 查表 矩阵,其中CRC校验 串行 并行 长除 移位 查表 矩阵,&表示与,CRC校验 串行 并行 长除 移位 查表 矩阵表示异或。
 
 
长除法和线性移位的关系:
CRC校验 串行 并行 长除 移位 查表 矩阵
 
CRC校验 串行 并行 长除 移位 查表 矩阵
 
 
项目使用CRC出现的问题:
在项目中使用的是outputlogic生成的并行CRC电路,应该是并行矩阵推导出来的。
项目相关固定:在算CRC32时候,使用的是将最后诊断字的低32bit为0来计算CRC,并把算出来的CRC赋在低32bit发送过去。
接受端接受数据并计算CRC32,将整段数据进行CRC32计算,开始觉得应该算出0,可是结果却不是
 
导致此结果原因:
CRC计算过程有长除法,线性移位法。
长处法:需要将数据抬高补零,抬高的幂由生成式决定,再将算出来CRC放在补零出,然后发送
线性移位:不需要抬高补零,直接计算。
但是线性移位寄存器需要设定初始值,线性移位的寄存器初始值意思就是默认CRC校验的初始值,类似于在长处法的数据前添加一段数据,这段数据算出来的CRC就是线性移位中的CRC校验值
故线性移位的初始值是代表一个CRC,长除法中的初始值代表一个数据
我用的outputlgic生成crc代码算出来的数据,类似是线性移位的结果,并没有在数据尾出补零,故将算出来的CRC加在原始数据之后(不是替换诊断字低32位处)再做CRC计算,即可得出0。上述错误是把 长处法的补零 和 interlaken协议中的通过低32位来携带CRC 这两件事弄混淆了
 
关于在线校验网站算的CRC和RTL计算CRC不一致问题?
开始以为是初始值设置的问题,但是测试出来不是,在线校验网站使用的类似移位校验法,故和rtl设置的初始值是一个意思,都表示一个初始crc值。
但是并行处理的算法根据并行处理数的位宽不同而不同,rtl中数据是固定位宽,故使用在线校验时,也需要将数据表示固定位宽的写法,即为0的比特位也要写出来。