大家好,欢迎来到IT知识分享网。
线性反馈移位寄存器(linear feedback shift register, LFSR)是指,给定前一状态的输出,将该输出的线性函数再用作输入的移位寄存器。异或运算是最常见的单比特线性函数:对寄存器的某些位进行异或操作后作为输入,再对寄存器中的各比特进行整体移位。
线性反馈移位寄存器(LFSR)是一个产生二进制位序列的机制。这个寄存器由一个初始化矢量设置的一系列信元组成,最常见的是,密钥。这个寄存器的行为被一个时钟调节。在每个定时时刻,这个寄存器信元的内容被移动到一个正确的位置,这个排外的或这个信元子集内的内容被放在最左边的信元中。输出的一个位通常来自整个更新程序。LFSRs的应用包括产生伪随机数字,伪噪声序列,快速数字计算器和灰数序列。LFSRs软件和硬件的执行是相同的。
一个n阶的LFSR由n个触发器和若干个异或门组成。在实际应用当中,主要用到两种类型的LFSR,即异或门外接线性反馈移位寄存器(IE型LFSR,图1)和异或门内接线性反馈移位寄存器(EE型LFSR,图2)。其中g0 g1 g2 gn为’0’或’1’, Q1 Q2 Q3 Qn为LFSR的输出,M(x)是输入的码字多项式,如M(x)=x4+ x1+ 1,表示输入端的输入顺序为11001,同样,LFSR的结构也可以表示为多项式G(x),称为生成多项式:
G(x)= gn*xn+ …+g1*x1+ g0;
以EE型LFSR为例来分析LFSR的工作原理以应用
以n = 3 来做个例子,具体的电路图如图3所示:
假设开始的时候(D2,D1,D0 ) = (0,0,1),那么每过一个时钟周期会进行跳变一次,可以看到具体的跳变如图4所示:
然后我们可以看到这个计数器循环起来了,无论进入那样一个状态除了0之外,都可以循环着回来,其实这里就相当于了一个3bit的伪随机数,很有意思,不是所有的多项式都有这个特性,我们现在在从数学上面来看看这个问题,其实最上面的电路是可以看成是一个除法电路,在Galois域的一个除法电路。现在假设的是R(x)是寄存器中剩余的数据,M(x)是输入的码字多项式,然后数学公式可以表示成:
然后分别计算出了M(x)的各种情况,
对于这个部分的计算我开始走进了误区,因为开始我把这的除法当作二进制除法来算了,所以一直没得到正确的结果,后来我明白了这的除法是模二的除法,在LFSR的结果中,多项式中的“+”都是模2加,就是异或运算,所以是没有进位的概念;同样,这里的除法秀的也是模2除法,即除法过程中用到的减法是模2减法,是不会产生加法进位和减法借位的运算,所以在进行模2除法时,只要部分余数首位为1,便可上商1,否则上商0,然后按照模2减法求得余数,当被除数被除完时,最后得到比除数少一位的余数。
这里用一个例子说明一下,比如M(x)=x7时,R(x)=1;模2的计算公式如下:
所以这里一定要区别模2和二进制数之间的运算的区别。
M(x)和R(x)到底是什么意义呢?
比如M(x)=1时,R(x)=1,指的就是当M(x)输入一个1时,这时的R(x)为1,即寄存器剩余的数为001,即Q1=1,Q2=0,Q3=0。
又M(x)=x时,R(x)=x,指的就是当M(x)顺序输入1,0时,这时的R(x)为x,即寄存器剩余的数为010,即Q1=0,Q2=1,Q3=0。
同理,可以知道,当M(x)=x6时,R(x)=x2+1,指的就是当M(x)顺序输入1,0,0,0,0,0,0时,这时的R(x)为x2+1,即寄存器剩余的数为010,即Q1=1,Q2=0,Q3=1。
可以看出,当第一个时钟时输入端输入一个1时,以后保持输入端为0,则随着时钟的到来,输入码字多项式就是按照1,x,x2,x3,x4,x5,x6,x7,…,xn这样的顺序发展着,观察前六个输入的R(x)分别对应的输出为:001,010,100,011,101,111,101,111,刚好为除去000的其他七个状态,当M(x)为x7时,输出又回来001,所以输出一直这样循环下去,因此LFSR可以用来BIST的伪随机测试码产生器。
线性反馈移位寄存器的实现
1、写出n阶线性反馈移位寄存器的实现过程
2、假设一个GF(2)上的5阶线性反馈移位寄存器的反馈函数为
f(x1,x2,x3,x4,x5)=x1+x5
初始状态为10011,试写出该线性反馈移位寄存器的输出序列
程序:
#include《iostream》
#include《math.h》
using namespace std;
void GF(int a,int n)
{
int b;
for(int i=1;i《32;i++)
{
cout《《(a&1);
b=a&1^((a》》4)&1);
a=a》》1^(b《《4);
}
}
int main()
{
int a=0,b;
int n;
cout《《“请输入线性移位寄存器的阶数:”;
cin》》n;
cout《《“请输入初始状态:”;
for(int i=1;i《=n;i++)
{
cin》》b;
a=a^(b《《(i-1));
}
cout《《“输出序列为:”;
GF(a,n);
cout《《endl;
return 0;
}
运行结果:
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/22654.html