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。 如何解决这些问题? 请参考你的意见。
答案 0 :(得分: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);
我在EDAPlayground here提供了一个测试平台,并进行了上述更改。请仔细阅读。
修改强>
从下面的评论中,由于触发器有三位,因此最多可以包含八个状态,因此输出可以包含最多八个州(如e4 f2 da b6 60 66 3e
)。 增加触发器的数量,条件语句中的条件将导致宽范围的输出值。
有关更强大的LFSR,请参阅Pseudo Random Number Generation链接。