线性反馈移位寄存器LFSR和循环冗馀码CRC 0前导码1数学基础1.1异或1.2模式乘除和模式2除法2线性反馈移位寄存器LFSR2.1抽头和特性多项式2.2阶线性反馈移位寄存器示例3循环冗馀码CRC3.1 CRC的原理3.2

0前言

线性反馈移位寄存器(Linear Feedback Shift Register,LFSR )和循环冗馀码(Cyclic Redundancy Check,CRC )是微控制器常用的基础原理。

LFSR被用于生成伪随机数,后者被用于生成检错码。 他们的数学原理都是一样的。

1数学基础1.1异或运算用符号或nor表示,真值表如下

F=A B

ABF000011101110异或运算有以下三种理解方法。

1是1,不同的是0

二进制加法只留下模型2的馀数,舍弃进位(模型2的加法) ) )。

三进制减法、数量减少、无借位(模型2的减法) ) ) ) ) ) ) ) )。

1.2模式2乘法和模式2除法的二进制模式2乘法是指,在乘法立式运算中需要进行加法运算的地方使用异或运算

模2乘法1010 * 101=100010,下图红框中101=0,无进位

二进制2级除法是指,在除法的立式运算中需要减法运算的地方使用异或运算

2除法10000/101=101余1,下图红框中,01=1,无借位

2线性反馈移位寄存器LFSR以斐波那契(外部LFSR )为例,有n个二进制寄存器R0-Rn-1,各自寄存器值为0或1

在k阶段中,在寄存器中存在初始值,(Rn-1,… R1,R0 ),被称为seed

在k 1阶段,寄存器的值如下。

k 1阶段Rn-1=rn-2rn-2=rn-3…R0=f(R1,R2,…,rn-1 ) () rn-1*gn ) ((Rn-2*gn-1 ) ) ) )

线性反馈移位寄存器总是假设g0、gn为1,否则(Rn-1,… R1,R0 )在n个周期之后总是为0。

2.1抽头和特征多项式f(rn-1,… R1,R0 ) ()=(Rn-1*gn ) )(Rn-2*gn-1 )R0*G1 ) G0可以用多项式表示。

g(x )=gnxn gn-1xn-1 … g1x g0

g(x )被称为LFSR的特征多项式

影响线性反馈寄存器以下状态的gi=0或1称为抽头,抽头的设置决定了存储在线性反馈寄存器中的结果(Rn-1,… R1,R0 )的变化规律。

通常n位的线性反馈寄存器最多有2N个不同的状态。 但是,初始值为n个0时,线性反馈寄存器陷入死循环,因此排除。 因此,能够生成n位线性反馈寄存器的最长的不重复序列是2N-1。

抽头的位置会影响LSFR的最大输出状态数量

例如,如果3位抽头是(g3、g2、g1、g0 )=(1、1、0、1 ) ),则出现7种状态)多项式对应于g(x )=x3 x2 1 () )。

抽头为(g3、g2、g1、g0 ) 1、0、1、1 )时,会出现两种状态(多项式对应于x3 x 1)。

将最大输出序列长度为2N-1的不可约多项式称为LFSR的本原多项式,基于本原多项式的寄存器序列为m序列。

在n的位上,本原多项式不唯一。 下表是不同位下的本原多项式。

2.2三阶线性反馈移位寄存器示例

上图为三阶线性反馈移位寄存器

抽头是(g3、g2、g1、g0 )=(1、1、0、1 ) )

多项式对应于g(x )=x3 x2 1

线性反馈函数R0=F(R2,R1,R0 )=R1R2

初始值为seed=(r2、R1、R0 )=(1、0、1 ) )

3阶线性反馈移位寄存器的周期为7 :

k周期(R2,R1,R0 )0(1,0,1 )1) 0,1,1,1 )2) 1,1,0,0 )5) 0,0,1 )6) 0,1

3循环冗馀码CRC的现实通信链路是不理想的。 也就是说,位在传输过程中可能会发生错误。 1可能为0,0可能为1。 这称为位错误。

因此,为了保证数据传输的可靠性,在计算机网络上传输数据时,需要采取各种各样的错误检测对策。

目前,循环冗馀校验CRC的校验技术在数据链路层得到广泛应用

3.1 CRC原理CRC运算现实

际上就是在数据长为k的后面添加供差错检测用的n位冗余码,然后构成帧k+n位发送出去。

选择一个生成多项式,作为对接收的帧进行除法运算时的除数,生成多项式可以写为二进制形式;生成多项式的要求:
①最高位和最低位必须为1;
②当CRC码的任何一位发生错误时,新帧除生成多项式后余数不为0;
③不同位发生错误时,余数应该是不同的;

计算n位冗余码
现假定待传输的数据M = 101001(k = 6),除数p = 1101 (n = 3,p比n多一位)
这n位冗余码可以用下面的方法得出。
(1)用二进制的模2运算进行(2^n)乘M的运算,相当于在M后面添加n个0。
即M后面添加3个0
(2)现在得到M = 101001000(k+n = 9)位的数除以除数p(n = 3)位,
得到要减肥的小甜瓜 =001(n位),R就是冗余码FCS

现在加上CRC后发送的帧是101001001

在接收端把接收到的数据M = 101001001以帧为单位进行CRC检验:把收到的每一个帧都除以相同的除数p(模2运算),然后检查得到的要减肥的小甜瓜。
如果在传输过程中没有差错,那么经过检验后得到要减肥的小甜瓜肯定是0。
(读者可以自己检验下,被除数现在是M = 101001001,除数P= 1101,看余数是否为0)
总之,在接收端对接收到的每一个帧经过CRC检验后,有两种情况:
(1)要减肥的小甜瓜 = 0,则判断这个帧没有问题,就接受
(2)要减肥的小甜瓜 != 0,则判断这个帧有差错,就丢弃。

3.2 CRC的实例

假设CRC生成多项式G(X)=X5+X4+X+1,要发送的二进制数据帧为100101110,求CRC校验码:

①把生成多项式转换为二进制数:110011;

②由生成多项式的位数为6可知,CRC校验码的位数为5,所以在数据帧后加5个0,变为10010111000000,将这个数使用模2除法除以生成多项式110011,得到余数即CRC校验码11010;

③用得到的CRC校验码替换掉数据帧中的5个0,形成新的帧10010111011010,将这个新帧发送给接收端;

④接收端收到新帧后,用新帧除以上面的多项式110011(模2除法),如果余数为0,该数据帧在传输过程中没有出错,否则出错;(经验证余数为0)