一、LFSR
LFSR线性反馈移位寄存器,通常由移位寄存器和异或门组成,主要用于产生伪随机序列等。
线性反馈的含义是各个寄存器的输出通过一个反馈函数连接到第一级触发器的输入;LFSR中的寄存器的个数被称为LFSR的级数。

LFSR分为两类:
-  斐波那契LFSR(多对一) 多个寄存器的输出通过反馈函数来驱动一个触发器的输入。 
-  伽罗瓦LFSR(一对多) 一个寄存器的输出通过反馈驱动多个触发器的输入。 
其中,多项式决定了反馈函数,下面将详细介绍。
二、斐波那契LFSR
我们以下面的多项式举例:
X 3 + X 2 + 1 X^3+X^2+1 X3+X2+1
其对应的电路结构如下:

即输出是第3级寄存器的输出,并且其和第2级寄存器的输出异或之后作为第1级寄存器的输入。
假设初始状态为111,则之后三级寄存器的输出(bit0、bit1、bit2)变化过程为111→011→001→100→010→101→110→111→011又回到之前的循环。
Verilog代码如下:
module LFSR(
    input clk,         
    input rst,
    output reg data_out // 伪随机信号输出
);
reg [2:0] lfsr=3'b111; // 4位线性反馈移位寄存器
always @(posedge clk or posedge  rst) begin
    if(rst)
    begin
        data_out<=1'b0;
    end
    else begin
    // LFSR 伪随机序列生成算法
    lfsr <= {lfsr[1:0], lfsr[2] ^ lfsr[1]};
    // 输出伪随机序列的最高位作为数据输出
    data_out <= lfsr[2];
end
end
endmodule
仿真结果如下:

三、伽罗瓦LFSR
我们以下面的多项式举例:
X 3 + X 2 + 1 X^3+X^2+1 X3+X2+1
其对应的电路结构如下:

即输出是第1级寄存器的输出,并且也是第3级寄存器的输入;同时第三级寄存器的输出和第1级寄存器输出异或的结果作为第2级寄存器的输入。
假设初始状态为111,则之后三级寄存器的输出(bit2、bit1、bit0)变化过程为111→101→100→010→001→110→111又回到之前的循环。
Verilog代码如下:
module LFSR(
    input clk,         
    input rst,
    output reg data_out // 伪随机信号输出
);
reg [2:0] lfsr=4'b1111; // 4位线性反馈移位寄存器
always @(posedge clk or posedge  rst) begin
    if(rst)
    begin
        data_out<=1'b0;
    end
    else begin
    // LFSR 伪随机序列生成算法
    lfsr <= {lfsr[1:0], lfsr[2] ^ lfsr[1]};
    // 输出伪随机序列的最高位作为数据输出
    data_out <= lfsr[2];
end
end
endmodule
仿真结果如下:


![[算法][数字][leetcode]2769.找出最大的可达成数字](https://img-blog.csdnimg.cn/direct/282ccc3317fa4ea697aec5bc1e37c6c0.png)

















