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 变量。随着初始化 Dcount 必须被初始化。在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。