线性反馈移位寄存器(LFSR),是带反馈回路的时序逻辑。
反馈回路给习惯于顺序阻塞赋值描述时序逻辑的设计人员带来了麻烦。
//
module lfsrb1(q3, clk, pre_n);
output q3;
input clk, pre_n;
reg q1, q2, q3;
wire n1;
assign n1 = q1 ^ q3;
always@(posedge clk or negedge pre_n)
if(!pre_n) begin
q3 = 1'b1;
q2 = 1'b1;
q1 = 1'b1;
end
else begin
q3 = q2;
q2 = n1;
q1 = q3;
end
endmodule
module test_lfsrb1;
reg clk, pre_n;
wire q3;
lfsrb1 u1_lfsrb1(
.q3 (q3 ),
.clk (clk ),
.pre_n (pre_n )
);
always #5 clk = ~clk; // T = 10
initial begin
clk = 1'b1;
pre_n = 1'b0;
#100
pre_n = 1'b1;
end
endmodule
module test_lfsrb1;
reg clk, pre_n;
wire q3;
lfsrb1 u1_lfsrb1(
.q3 (q3 ),
.clk (clk ),
.pre_n (pre_n )
);
always #5 clk = ~clk; // T = 10
initial begin
clk = 1'b1;
pre_n = 1'b0;
#100
pre_n = 1'b1;
end
endmodule
除非使用中间暂存变量,否则上例所示的赋值是不可能实现反馈逻辑的。
mmodule lfsrb1(q3, clk, pre_n);
output q3;
input clk, pre_n;
reg q1, q2, q3;
wire n1;
assign n1 = q1 ^ q3;
always@(posedge clk or negedge pre_n)
if(!pre_n) begin
q3 <= 1'b1;
q2 <= 1'b1;
q1 <= 1'b1;
end
else begin
q3 <= q2;
q2 <= n1;
q1 <= q3;
end
endmodule