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/1ps
module 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.
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)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,其下一时刻值就是其前一位的值,但是输入位的值,就需要其参与异或得到。
LFSR(线性反馈移位寄存器)相关推荐
- LFSR线性反馈移位寄存器循环码编码原理
线性反馈移位寄存器(LFSR)循环码编码原理 作为知识储备,近日在学习循环码编码的原理,教材为John G.Proakis和Masoud Salehi所著的<数字通信>第五版,循环码 ...
- LFSR线性反馈移位寄存器Verilog实现
用Verilog实现如下图所示的线性反馈移位寄存器: The reset should resetthe LFSR to 1 直接写逻辑门的代码 这种写法比较笨拙. 这里寄存器只有5 bits,数量不 ...
- 线性反馈移位寄存器(LFSR)和 Berlekamp-Massey 算法
应用密码学课上学习了 BM 算法,林老师说期末必考.做课后题时,让求解一个20长序列的 LFSR,本人算了两大页纸,还算错了两遍 (╬ ̄皿 ̄) 这里仔细研究下,谈谈我自己对它的理解. 文章目录 LFS ...
- HDLBits 系列(21)LFSR(线性反馈移位寄存器)
目录 5 bit LFSR 3 bit LFSR 32 bit LFSR 5 bit LFSR A linear feedback shift register is a shift register ...
- quartus仿真6:74194构建线性反馈移位寄存器计数器LFSR
扭环形计数器具有8个有效状态,仍然有8个无效状态.进一步提高移位寄存器构建的计数器的有效状态数,可采用线性反馈移位寄存器计数器(Linear Feedback Shift-Register Count ...
- 四类九种移位寄存器总结(循环(左、右、双向)移位寄存器、逻辑和算术移位寄存器、串并转换移位寄存器、线性反馈移位寄存器LFSR|verilog代码|Testbench|仿真结果)
移位寄存器总结 一.前言 二.简单循环左移/右移/双向移位寄存器 2.1 简单循环左移/右移/双向移位寄存器 2.2 verilog代码 2.3 Testbench 2.4 仿真结果 三.逻辑移位与算 ...
- 详解线性反馈移位寄存器(LFSR)
转载于(九)详解线性反馈移位寄存器(LFSR) 文章目录 LFSR的由来 LFSR具体内容 对LFSR的密钥流攻击 延伸 书籍推荐 LFSR的由来 1. 移位寄存器: 移位寄存器(ShiftRegis ...
- 【Verilog基础】一文搞懂线性反馈移位寄存器(LFSR)
文章目录 一.理论 1.1.LFSR 引入 1.1.1.移位寄存器 1.1.2.反馈移位寄存器 1.1.3.线性反馈移位寄存器 1.2.LFSR深入及m序列介绍 1.2.1.LFSR的反馈函数 1.2 ...
- 线性反馈移位寄存器LFSR(斐波那契LFSR(多到一型)和伽罗瓦LFSR(一到多型)|verilog代码|Testbench|仿真结果)
线性反馈移位寄存器LFSR 一.前言 二.LFSR简介 三.斐波那契LFSR和伽罗瓦LFSR 3.1 斐波那契LFSR 3.1.1 斐波那契LFSR 3.1.2 verilog代码 3.1.3 Tes ...
- LFSR(线性反馈移位寄存器, Linear-feedback shift register
1 移位寄存器 移位寄存器(Shift Register,SR)曾在SM4中提到过,是指有若干个寄存器排成一行,每个寄存器中都存储着一个二进制数(0或1).移位寄存器每次把最右端(末端)的数字输出,然 ...
最新文章
- 找回MySQL的root密码
- 【转】LINUX 手动建立SWAP文件及删除
- noip2008普及组4题题解-rLq
- a访问过后hover样式就不出现了 被点击访问过的超链接样式不再具有hover和active 解决方法...
- sentinel卫星_IKONOS卫星 遥感影像解译数据 波段
- python 中判断是不是通过break;跳出循环(一分钟读懂)
- CentOS7 安装 Mysql 服务
- 华为lab-rs-v1-2.4_OSPF提升
- go在ubuntu下安装
- 适合初学者的linux开发板
- linux运行speex,linux 用speex库压缩音频
- 合天网安《Weekly CTF》第四周
- Spring boot2.0 JpaRepository findOne的使用
- 专访李智慧:架构是最高层次的规划和难以改变的决定
- python时间序列因果检验_用python做时间序列预测8:Granger causality test(格兰杰因果检验)...
- 英文Essay写作中存在哪些门道?
- dataframe排序 pd.rank()
- 分类算法之决策树ID3详解
- matlab 图片雾化代码,雾化效果图片制作代码汇总
- SS14、SS24、SS34 区别