CRC16并行计算的Matlab推导
本文使用的CRC16的生成多项式为:
x16+x15+x2+1
其对应的串行编码图如下图所示。
假设输入数据的位宽为8比特,即{I7,I6,I5,I4,I3,I2,I1,I0},I为Input的首字母。
I0表示最低比特位,I7表示最高比特位。
在串行模式下,I0先输入CRC16计算模块,于是I0输入后各个寄存器的状态变化如下:
D15′= D14+ D15+ I0
D14′= D13
D13′= D12
D12′= D11
D11′= D10
D10′= D9
D9′= D8
D8′= D7
D7′= D6
D6′= D5
D5′= D4
D 4′ = D 3 D 3′ = D 2
D 2′ = D 15+ D 1+ I0
D 1′ = D 0
D 0′ = D 15+ I0
可以将以上表达式组成矩阵乘法的形式,则有:
'0D T D S I =•+• (1)
其中,D 为0D ~15D 构成的列向量,用转置矩阵的形式表示为:
()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15T
D D D D D D D D D D D D D D D D D =同理,'D 是'0D ~'15D 构成的列向量,用转置矩阵的形式表示为:
()
''
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'0123456789101112131415T
D D D D D D D D D D D D D D D D D =
表达式(1)中的矩阵T ,表示为:
00000000000000110000000000000000100000000000001001000000000000000010000000000000000100000000000000001000000000000000010000000000000000100000000000000001000000000000000010000000000000000100000000000T =0000010000000000000000100000000000000001000000000000000011⎛⎫
⎪
⎪ ⎪
⎪
⎪ ⎪
⎪
⎪ ⎪
⎪
⎪
⎪ ⎪ ⎪
⎪
⎪ ⎪
⎪
⎪ ⎪
⎪
⎪
⎪⎝
⎭
表达式(1)中的矩阵S 也是一个列向量,表示为:
()1010000000000001T
S =
当I1输入后各个寄存器的状态为:
()()'2210001D T D S I T T D S I S I T D T S I S I =•+•=•+•+•=•+••+•
以此类推,当I7输入后各寄存器的状态为:
876543210(8)01234567
D T D T S I T S I T S I T S I T S I T S I T S I T S I •••••=+•+•+•+•+•+•+•+•••••上式中
7654321001234567
T S I T S I T S I T S I T S I T S I T S I T S I •+•+•+•+•+•+•+•••••••••可以看成两个矩阵A 和B 的相乘 A*B ,其中 A = [T 7S T 6S T 5S T 4S T 3S T 2S T 1S T 0S]
01234567000000000000000000000000000000000000000000000000000
I I I I B I I I I ⎛⎫ ⎪ ⎪ ⎪ ⎪ ⎪= ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎝
⎭
于是(8)D 可以简化为
8(8)D T D A B •=+•
而此时各个寄存器中的值就是最后要求的CRC16的值。
对应的matlab 程序如下: T8 =mod((T^8),2); %计算结果对2取模,是因为我们执行的是二进制
%加减运算
T7 =mod((T^7),2);
T6 =mod((T^6),2);
T5 =mod((T^5),2);
T4 =mod((T^4),2);
T3 =mod((T^3),2);
T2 =mod((T^2),2);
T1 =mod((T^1),2);
T0 =mod((T^0),2);
S=[1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1]';
T7S =mod((T7*S),2);
T6S =mod((T6*S),2);
T5S =mod((T5*S),2);
T4S =mod((T4*S),2);
T3S =mod((T3*S),2);
T2S =mod((T2*S),2);
T1S =mod((T1*S),2);
T0S =mod((T0*S),2);
A=[ T7S, T6S, T5S, T4S, T3S, T2S, T1S, T0S]; B=eye(8);
C=A*B;
运算结果:
所以将T8和C带入8
=+•,就能得到各个寄存器中最后的值,这也
•
(8)
D T D A B
就是CRC16的并行计算实现,最后用Verilog 写出CRC16并行计算的代码:
掌握了上面的推导过程,就能很容易的进行扩展,只要知道了输入数
据位宽以及生成多项式,我们就能很容易的用本文的方法推导出其对应的并行计算过程。