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

时间:2015-12-01 08:36:12

标签: 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 

Snapshot

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

1 个答案:

答案 0 :(得分:5)

设计中的一些错误:

您这里没有初始化 count变量。在初始化D时,必须初始化countcount到达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链接。