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

LFSR(线性反馈移位寄存器)线性反馈移位寄存器 LFSR 是移位寄存器的一种 通常用于在数字电路中产生伪随机数 寄存器中的初始值叫做种子 种子应该是非零的 LFSR 的下一时刻输入为是由整个移位寄存器值的某些位做异或运算的结果 选取哪些位置用于移位 是需要进行预先设计好的 目的是要产生一个伪随机并且尽可能长周期的数字序列 n 位 LFSR 最多产生 2 n 1 种序列 全零或全一被排除 因为全零异或 nor 结果为 0 不会产生新序列 全 1 同或 xnor 也是 影响下一个状态的比特位叫做抽头 移位寄存器链的多个抽头用作 XOR 或 XNOR 门的

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

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

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

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

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

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

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

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。

`timescale 1ns/1ps module top_module (); reg clk=0; always #5 clk = ~clk; // Create clock with period=10 initial `probe_start; // Start the timing diagram `probe(clk); // Probe signal "clk" // A testbench reg set_seed; reg [2:0] seed_data; reg enable; parameter bits_num=3; initial begin set_seed=1; enable=1; seed_data=3'b101; #10 set_seed=0; #60 $finish; // Quit the simulation end LFSR #(.bits_num(bits_num)) inst1( .clk(clk),.enable(enable),.set_seed(set_seed),.seed_data(seed_data)); // Sub-modules work too. endmodule module 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) begin if (enable == 1'b1) begin if (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); end end end always @(*)//一开始就要有变化,所以不设置为posedge clk。 begin case (bits_num)//3-32 3: begin r_xnor = r_lfsr[3] ^~ r_lfsr[2]; end 4: begin r_xnor = r_lfsr[4] ^~ r_lfsr[3]; end 5: begin r_xnor = r_lfsr[5] ^~ r_lfsr[3]; end 6: begin r_xnor = r_lfsr[6] ^~ r_lfsr[5]; end 7: begin r_xnor = r_lfsr[7] ^~ r_lfsr[6]; end 8: begin r_xnor = r_lfsr[8] ^~ r_lfsr[6] ^~ r_lfsr[5] ^~ r_lfsr[4]; end 9: begin r_xnor = r_lfsr[9] ^~ r_lfsr[5]; end 10: begin r_xnor = r_lfsr[10] ^~ r_lfsr[7]; end 11: begin r_xnor = r_lfsr[11] ^~ r_lfsr[9]; end 12: begin r_xnor = r_lfsr[12] ^~ r_lfsr[6] ^~ r_lfsr[4] ^~ r_lfsr[1]; end 13: begin r_xnor = r_lfsr[13] ^~ r_lfsr[4] ^~ r_lfsr[3] ^~ r_lfsr[1]; end 14: begin r_xnor = r_lfsr[14] ^~ r_lfsr[5] ^~ r_lfsr[3] ^~ r_lfsr[1]; end 15: begin r_xnor = r_lfsr[15] ^~ r_lfsr[14]; end 16: begin r_xnor = r_lfsr[16] ^~ r_lfsr[15] ^~ r_lfsr[13] ^~ r_lfsr[4]; end 17: begin r_xnor = r_lfsr[17] ^~ r_lfsr[14]; end 18: begin r_xnor = r_lfsr[18] ^~ r_lfsr[11]; end 19: begin r_xnor = r_lfsr[19] ^~ r_lfsr[6] ^~ r_lfsr[2] ^~ r_lfsr[1]; end 20: begin r_xnor = r_lfsr[20] ^~ r_lfsr[17]; end 21: begin r_xnor = r_lfsr[21] ^~ r_lfsr[19]; end 22: begin r_xnor = r_lfsr[22] ^~ r_lfsr[21]; end 23: begin r_xnor = r_lfsr[23] ^~ r_lfsr[18]; end 24: begin r_xnor = r_lfsr[24] ^~ r_lfsr[23] ^~ r_lfsr[22] ^~ r_lfsr[17]; end 25: begin r_xnor = r_lfsr[25] ^~ r_lfsr[22]; end 26: begin r_xnor = r_lfsr[26] ^~ r_lfsr[6] ^~ r_lfsr[2] ^~ r_lfsr[1]; end 27: begin r_xnor = r_lfsr[27] ^~ r_lfsr[5] ^~ r_lfsr[2] ^~ r_lfsr[1]; end 28: begin r_xnor = r_lfsr[28] ^~ r_lfsr[25]; end 29: begin r_xnor = r_lfsr[29] ^~ r_lfsr[27]; end 30: begin r_xnor = r_lfsr[30] ^~ r_lfsr[6] ^~ r_lfsr[4] ^~ r_lfsr[1]; end 31: begin r_xnor = r_lfsr[31] ^~ r_lfsr[28]; end 32: begin r_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(线性反馈移位寄存器)

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/229974.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午3:25
下一篇 2026年3月16日 下午3:26


相关推荐

  • 图形界面开发工具_java的开发工具有哪些

    图形界面开发工具_java的开发工具有哪些DevExpressVCLControls是Devexpress公司旗下最老牌的用户界面套包,所包含的控件有:数据录入,图表,数据分析,导航,布局等。该控件能帮助您创建优异的用户体验,提供高影响力的业务解决方案,并利用您现有的VCL技能为未来构建下一代应用程序。【适用范围】:EmbarcaderoRADStudio2010/XE/XE2/XE3/XE4/XE5…

    2026年3月4日
    3
  • System.setProperty()「建议收藏」

    System.setProperty()「建议收藏」/**设置指定键对值的系统属性*setProperty(Stringprop,Stringvalue);**參数:*prop-系统属性的名称。*value-系统属性的值。

    2022年7月4日
    47
  • float和double区别

    float和double区别float 和 double 有什么区别 float 与 double 的区别 float 和 double 的精度是由尾数的位数来决定的 浮点数在内存中是按科学计数法来存储的 其整数部分始终是一个隐含着的 1 由于它是不变的 故不能对精度造成影响 float 2 23 共七位 意味着最多能有 7 位有效数字 但绝对能保证的为 6 位 也即 float 的精度为 6 7 位有效数字 double 2 52 70496 一共 16 位 同理 double 的精度为 15

    2026年3月17日
    3
  • HTTP和HTTPS区别

    HTTP和HTTPS区别超文本传输协议 HTTP 协议被用于在 Web 浏览器和网站服务器之间传递信息 HTTP 协议以明文方式发送内容 不提供任何方式的数据加密 如果攻击者截取了 Web 浏览器和网站服务器之间的传输报文 就可以直接读懂其中的信息 因此 HTTP 协议不适合传输一些敏感信息 比如 信用卡号 密码等支付信息 为了解决 HTTP 协议的这一缺陷 需要使用另一种协议 安全套接字层超文本传输协议 HTTPS 为了数据传输的安

    2026年3月16日
    3
  • bindService调用流程

    bindService调用流程时序图源码执行流程【ContextImpl.java】@OverridepublicbooleanbindService(Intentservice,ServiceConnectionconn,intflags){warnIfCallingFromSystemProcess();retu…

    2022年6月10日
    36
  • R语言 多元方差分析|单因素方差分析

    R语言 多元方差分析|单因素方差分析研究谷物中的卡路里 脂肪和糖含量是否会因为储存架位置的不同而发生变化 其中 1 代表底层货架 2 代表中层货架 3 代表顶层货架 数据 MASS 包 Uscereallibr MASS attach UScereal head UScereal shelf factor shelf 转化为因子变量 y cbind calories fat sugars 将因变量合并成一个

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号