【问题标题】:verilog Linear feedback shift register randomverilog 线性反馈移位寄存器随机
【发布时间】:2015-12-01 08:36:12
【问题描述】:
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。 如何解决这些问题? 请参考您的意见。

【问题讨论】:

标签: random verilog fpga intel-fpga


【解决方案1】:

设计中的几个错误:

您还没有在此处初始化 count 变量。除了初始化D,还必须初始化count。在count 达到20'd100000 之后,必须重置或重新初始化。用于下一轮随机化。

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

另外,最初,D&lt;=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 提供了一个测试平台,并进行了上述更改。请通过它。

编辑:

根据下面的评论,由于触发器有 3 位,因此最多可能有 8 个 状态,因此 输出 可以包含最多八个状态(如e4 f2 da b6 60 66 3e)。 增加触发器的数量,以及case语句中的条件将导致输出值的宽范围

有关更强大的 LFSR,请参阅 Pseudo Random Number Generation 链接。

【讨论】:

  • @e19293001 哦,我忘了说重点。感谢您的输入,这是由于只有三个触发器(最多 8 个状态)和 8 位 cout。这个问题是由于较少数量的翻转状态导致的。我在上面编辑了我的答案。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多