线性反馈移位寄存器原理与实现

存储技术

606人已加入

描述

  线性反馈移位寄存器(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;

  }

  运行结果:

  寄存器

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分