3.2.3.4 5-bit LFSR
问题描述
线性反馈移位寄存器是一种移位寄存器,通常带有几个异或门来产生移位寄存器的下一个状态。伽罗瓦 LFSR 是一种特殊的安排,其中带有“抽头”的位位置与输出位进行异或运算以产生其下一个值,而没有抽头位置进行移位。如果仔细选择抽头位置,则可以将 LFSR 设置为“最大长度”。n 位的最大长度 LFSR 在重复之前循环通过 2 的n次方-1 个状态(永远不会达到全零状态)。
下图显示了一个 5 位最大长度的 Galois LFSR,在位位置 5 和 3 处具有抽头。(抽头位置通常从 1 开始编号)。请注意,为了保持一致性,我在位置 5 处绘制了 XOR 门,但 XOR 门输入之一是 0。
构建这个 LFSR。复位应将 LFSR 复位为 1 。
提示:从 1 开始的前几个状态是00001 , 10100 , 01010 , 00101 , ... LFSR 应该在返回00001之前循环通过 31 个状态。
代码:
module top_module(
input clk,
input reset, // Active-high synchronous reset to 5'h1
output [4:0] q
);
always @(posedge clk) begin
if(reset)
q<=5'b1;
else begin
q[4]<=q[0]^0;
q[2]<=q[3]^q[0];
q[3]<=q[4];
q[1]<=q[2];
q[0]<=q[1];
end
end
/* 这种写法可能更好
always @(posedge clk) begin
if(reset)
q<=5'b1;
else
begin
q<=q>>1;
q[2]<=q[0]^q[3];
q[4]<=0^q[0];
end
end
*/
endmodule
3.2.3.5 3-bit LFSR
可以联系之前的3.2.1.11 Mux and DFF看一看,在Day10
问题描述
为此时序电路编写 Verilog 代码(子模块可以,但顶层必须命名为top_module)。假设您要在 DE1-SoC 板上实现电路。将R输入连接到SW开关,将 Clock 连接到KEY[0],并将L连接到KEY[1]。将Q输出连接到红灯LEDR。
该电路是线性反馈移位寄存器(LFSR) 的一个示例。最大周期 LFSR 可用于生成伪随机数,因为它在重复之前循环通过 2 的n次方-1 个组合。全零组合不会出现在此序列中。
代码:
module top_module (
input [2:0] SW, // R
input [1:0] KEY, // L and clk
output [2:0] LEDR); // Q
always @(posedge KEY[0]) begin
LEDR<=KEY[1]? SW : {LEDR[1]^LEDR[2], LEDR[0], LEDR[2]} ;
end
endmodule
3.2.3.6 32-bit LFSR
问题描述
在位位置 32、22、2 和 1 处构建具有抽头的 32 位 Galois LFSR。
这足够长,以至于您想要使用向量,而不是 32 个 DFF 实例。
分析:和3.2.3.4 5-bit LFSR是一样的,可以试着根据3.2.3.4把图画出来
代码:
module top_module(
input clk,
input reset, // Active-high synchronous reset to 32'h1
output [31:0] q
);
always @(posedge clk) begin
if(reset)
q<=32'h1;
else begin
q[31]<=q[0]^0; // 32位
q[30:22]<=q[31:23];
q[21]<=q[22]^q[0]; // 22位
q[20:2]<=q[21:3];
q[1]<=q[0]^q[2]; // 2位
q[0]<=q[0]^q[1]; // 1位
end
end
endmodule