verilog线性反馈移位寄存器随机

0 random verilog fpga intel-fpga

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 
Run Code Online (Sandbox Code Playgroud)

快照

我使用QuartusII编写verilog编程代码.我想做一个随机数生成操作.线性反馈移位寄存器用于生成随机数.但是,我不知道为什么随机模式是相同的.这样的操作结果如8 5 4 2 7 .... 8 5 4 2 7.如何解决这些问题?请参考您的意见.

sha*_*111 5

设计中的几个错误:

你没有在这里初始化 count变量.随着初始化D,count必须初始化.之后count到达20'd100000,它必须重置或重新初始化.用于下一轮随机化.

always块中,条件if(rst)else if(count..)可能导致成无意硬件.添加else条件可以删除不需要的锁存器创建.

此外,最初,初始种子D<=3'b0为零,并且xoring操作也将导致零输出(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);
Run Code Online (Sandbox Code Playgroud)

我在EDAPlayground提供了一个测试平台,上面提到了这些更改.请仔细阅读.

编辑:

从下面的注释,由于触发器有三个位,最多可能有八个状态,因此输出最多可包含八个状态(as e4 f2 da b6 60 66 3e).增加触发器的数量case语句中的条件将导致宽范围的输出值.

有关更强大的LFSR,请参阅伪随机数生成链接.