verilog 线性反馈移位寄存器随机
verilog Linear feedback shift register random
module do2(rst,clk,cout);
input rst,clk;
output [7:0]cout;
reg [2:0]D;
reg [19:0]count;
assign cout=out(D);
always@(posedge clk) begin
count = count+20'd1;
if(rst) begin
D<=3'b0;
end
else if(count==20'd100000)begin
D[0] <=D[1];
D[1] <=D[2];
D[2] <= D[0] ^D[2];
end
end
function [7:0]out;
input [2:0]in;
begin
case(in)
3'b000 : out =8'b11111100 ;
3'b001 : out =8'b01100000 ;
3'b010: out =8'b11011010 ;
3'b011 : out =8'b11110010 ;
3'b100 : out =8'b01100110 ;
3'b101 : out =8'b10110110 ;
3'b110 : out =8'b00111110 ;
3'b111 : out =8'b11100100 ;
endcase
end
endfunction
endmodule
我使用QuartusII 编写verilog 编程代码。
我想进行随机数生成操作。
线性反馈移位寄存器用于产生随机数。
但是,我不知道为什么随机模式是一样的。
像这样运行的结果 8 5 4 2 7 .... 8 5 4 2 7。
如何解决这些问题?
请参考您的意见。
设计中的几个错误:
您尚未初始化 count
变量。随着初始化 D
,count
必须被初始化。在count
达到20'd100000
后,必须重置或重新初始化。用于下一轮随机化。
在 always
块中,条件 if(rst)
和 else if(count..)
会导致 意外硬件 。添加 else
条件可以删除 不需要的闩锁创建 。
此外,最初,D<=3'b0
将具有 零初始种子 ,异或操作也应导致 零输出 ( D[0]^D[2] = 0^0 = 0
),所以输出应该永远不会改变。我更愿意使用 parameter seed = 3'b000
,它在实例化时很容易被 覆盖 。喜欢如下:
parameter seed = 3'b000 // Arbitrary seed value
if(rst) begin
D<= seed;
count<=20'd0;
end
// While instantiation
do2 #(5) dd(rst,clk,cout);
我在 EDAPlayground here 提供了一个测试平台,其中包含上述更改。请通过它。
编辑:
根据下面的评论,由于触发器有三位,因此最多可以有八个状态,因此输出可以包含最多八个状态(如e4 f2 da b6 60 66 3e
)。 增加触发器的数量,以及case 语句中的条件 将导致宽范围 的输出值。
请参阅 Pseudo Random Number Generation link 以获得更强大的 LFSR。
module do2(rst,clk,cout);
input rst,clk;
output [7:0]cout;
reg [2:0]D;
reg [19:0]count;
assign cout=out(D);
always@(posedge clk) begin
count = count+20'd1;
if(rst) begin
D<=3'b0;
end
else if(count==20'd100000)begin
D[0] <=D[1];
D[1] <=D[2];
D[2] <= D[0] ^D[2];
end
end
function [7:0]out;
input [2:0]in;
begin
case(in)
3'b000 : out =8'b11111100 ;
3'b001 : out =8'b01100000 ;
3'b010: out =8'b11011010 ;
3'b011 : out =8'b11110010 ;
3'b100 : out =8'b01100110 ;
3'b101 : out =8'b10110110 ;
3'b110 : out =8'b00111110 ;
3'b111 : out =8'b11100100 ;
endcase
end
endfunction
endmodule
我使用QuartusII 编写verilog 编程代码。 我想进行随机数生成操作。 线性反馈移位寄存器用于产生随机数。 但是,我不知道为什么随机模式是一样的。 像这样运行的结果 8 5 4 2 7 .... 8 5 4 2 7。 如何解决这些问题? 请参考您的意见。
设计中的几个错误:
您尚未初始化 count
变量。随着初始化 D
,count
必须被初始化。在count
达到20'd100000
后,必须重置或重新初始化。用于下一轮随机化。
在 always
块中,条件 if(rst)
和 else if(count..)
会导致 意外硬件 。添加 else
条件可以删除 不需要的闩锁创建 。
此外,最初,D<=3'b0
将具有 零初始种子 ,异或操作也应导致 零输出 ( D[0]^D[2] = 0^0 = 0
),所以输出应该永远不会改变。我更愿意使用 parameter seed = 3'b000
,它在实例化时很容易被 覆盖 。喜欢如下:
parameter seed = 3'b000 // Arbitrary seed value
if(rst) begin
D<= seed;
count<=20'd0;
end
// While instantiation
do2 #(5) dd(rst,clk,cout);
我在 EDAPlayground here 提供了一个测试平台,其中包含上述更改。请通过它。
编辑:
根据下面的评论,由于触发器有三位,因此最多可以有八个状态,因此输出可以包含最多八个状态(如e4 f2 da b6 60 66 3e
)。 增加触发器的数量,以及case 语句中的条件 将导致宽范围 的输出值。
请参阅 Pseudo Random Number Generation link 以获得更强大的 LFSR。