300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > LFSR(线性反馈移位寄存器)

LFSR(线性反馈移位寄存器)

时间:2020-05-21 01:37:05

相关推荐

LFSR(线性反馈移位寄存器)

线性反馈移位寄存器LFSR,是移位寄存器的一种,通常用于在数字电路中产生伪随机数。寄存器中的初始值叫做种子,种子应该是非零的。LFSR的下一时刻输入为是由整个移位寄存器值的某些位做异或运算的结果。选取哪些位置 用于移位,是需要进行预先设计好的,目的是要产生一个伪随机并且尽可能长周期的数字序列。

n位LFSR,最多产生2^(n-1)种序列(全零或全一被排除,因为全零异或nor结果为0,不会产生新序列,全1同或xnor也是)。

影响下一个状态的比特位叫做抽头。移位寄存器链的多个抽头用作XOR或XNOR门的输入。 然后,此门的输出用作对移位寄存器链开始的反馈,因此用作LFSR中的反馈。

注意:当抽头使用XOR门时,全0的模式不会出现。 当抽头使用XNOR门时,全1的模式将不会出现。 此两种情况LFSR将停止运行。LFSR是伪随机的。输出模式是确定性,可以通过了解XOR门的位置以及当前模式来确定下一个状态。

怎样选取抽头可以产生最大长度的随机序列,可以参考下表;

LFSR的特征方程根据抽头位置来定:

这里可以表示为f(x)=1+c1x+c2x^(2)+c3x^(3)+...+cnx^(n)

比如,如果n=3,f(x)=1+c1x+c2x^(2)+c3x^(3),其中c1和c3为1,那么f(x)=1+x+x^3,抽头对应为a3,a2。

如果初始序列是101,

则输出为:101001110100111010011……

`timescale 1ns/1psmodule top_module ();reg clk=0;always #5 clk = ~clk; // Create clock with period=10initial `probe_start; // Start the timing diagram`probe(clk); // Probe signal "clk"// A testbenchreg set_seed;reg [2:0] seed_data;reg enable;parameter bits_num=3;initial beginset_seed=1;enable=1;seed_data=3'b101;#10 set_seed=0;#60 $finish; // Quit the simulationendLFSR #(.bits_num(bits_num)) inst1( .clk(clk),.enable(enable),.set_seed(set_seed),.seed_data(seed_data)); // Sub-modules work too.endmodulemodule LFSR #(parameter bits_num=3)(input clk,input enable, input set_seed,input [bits_num-1:0] seed_data,output [bits_num-1:0] lfsr_data,output lfsr_done//cycle done);`probe(clk);`probe(enable);`probe(set_seed);`probe(seed_data);`probe(lfsr_data);`probe(r_lfsr);reg [bits_num:1] r_lfsr;reg r_xnor;always @(posedge clk)beginif (enable == 1'b1)beginif (set_seed == 1'b1)r_lfsr <= seed_data;else begin$display("1.r_lfsr=%b,time=%g",r_lfsr,$time);r_lfsr <= {r_lfsr[bits_num-1:1],r_xnor}; $display("2.r_lfsr=%b,r_xnor=%b,time=%g",r_lfsr,r_xnor,$time);endendendalways @(*)//一开始就要有变化,所以不设置为posedge clk。begincase (bits_num)//3-323: beginr_xnor = r_lfsr[3] ^~ r_lfsr[2];end4: beginr_xnor = r_lfsr[4] ^~ r_lfsr[3];end5: beginr_xnor = r_lfsr[5] ^~ r_lfsr[3];end6: beginr_xnor = r_lfsr[6] ^~ r_lfsr[5];end7: beginr_xnor = r_lfsr[7] ^~ r_lfsr[6];end8: beginr_xnor = r_lfsr[8] ^~ r_lfsr[6] ^~ r_lfsr[5] ^~ r_lfsr[4];end9: beginr_xnor = r_lfsr[9] ^~ r_lfsr[5];end10: beginr_xnor = r_lfsr[10] ^~ r_lfsr[7];end11: beginr_xnor = r_lfsr[11] ^~ r_lfsr[9];end12: beginr_xnor = r_lfsr[12] ^~ r_lfsr[6] ^~ r_lfsr[4] ^~ r_lfsr[1];end13: beginr_xnor = r_lfsr[13] ^~ r_lfsr[4] ^~ r_lfsr[3] ^~ r_lfsr[1];end14: beginr_xnor = r_lfsr[14] ^~ r_lfsr[5] ^~ r_lfsr[3] ^~ r_lfsr[1];end15: beginr_xnor = r_lfsr[15] ^~ r_lfsr[14];end16: beginr_xnor = r_lfsr[16] ^~ r_lfsr[15] ^~ r_lfsr[13] ^~ r_lfsr[4];end17: beginr_xnor = r_lfsr[17] ^~ r_lfsr[14];end18: beginr_xnor = r_lfsr[18] ^~ r_lfsr[11];end19: beginr_xnor = r_lfsr[19] ^~ r_lfsr[6] ^~ r_lfsr[2] ^~ r_lfsr[1];end20: beginr_xnor = r_lfsr[20] ^~ r_lfsr[17];end21: beginr_xnor = r_lfsr[21] ^~ r_lfsr[19];end22: beginr_xnor = r_lfsr[22] ^~ r_lfsr[21];end23: beginr_xnor = r_lfsr[23] ^~ r_lfsr[18];end24: beginr_xnor = r_lfsr[24] ^~ r_lfsr[23] ^~ r_lfsr[22] ^~ r_lfsr[17];end25: beginr_xnor = r_lfsr[25] ^~ r_lfsr[22];end26: beginr_xnor = r_lfsr[26] ^~ r_lfsr[6] ^~ r_lfsr[2] ^~ r_lfsr[1];end27: beginr_xnor = r_lfsr[27] ^~ r_lfsr[5] ^~ r_lfsr[2] ^~ r_lfsr[1];end28: beginr_xnor = r_lfsr[28] ^~ r_lfsr[25];end29: beginr_xnor = r_lfsr[29] ^~ r_lfsr[27];end30: beginr_xnor = r_lfsr[30] ^~ r_lfsr[6] ^~ r_lfsr[4] ^~ r_lfsr[1];end31: beginr_xnor = r_lfsr[31] ^~ r_lfsr[28];end32: beginr_xnor = r_lfsr[32] ^~ r_lfsr[22] ^~ r_lfsr[2] ^~ r_lfsr[1];end endcase end assign lfsr_data = r_lfsr[bits_num:1];assign lfsr_done = (r_lfsr[bits_num:1] == seed_data) ? 1'b1 : 1'b0;endmodule

结果:

LFSR分为两种:一种是IE型的LFSR,即异或门内接的线性反馈移位寄存器,如下图第一张。另一种是异或门外接的线性反馈移位寄存器,简称EE型LFSR,如第二张。这两种类型在代码表现上是不一样的。第一种LFSR的任何一位,如果g=1,其下一时刻值就是输出位以及其前一位的异或。

第二种LFSR的任何一位,如果g=1,其下一时刻值就是其前一位的值,但是输入位的值,就需要其参与异或得到。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。