我需要在 Spartan-3E FPGA 上为我的遗传算法生成伪随机数,我想在 verilog 中实现它:你能给我任何指示吗?
6 回答
当然,亚当的随机发生器是不可合成的!您必须显式创建一个LFSR。
以下示例可能会有所帮助。它是一个最大 8 位的 LFSR
module lfsr(input clk, reset, en, output reg [7:0] q);
always @(posedge clk or posedge reset) begin
if (reset)
q <= 8'd1; // can be anything except zero
else if (en)
q <= {q[6:0], q[7] ^ q[5] ^ q[4] ^ q[3]}; // polynomial for maximal LFSR
end
endmodule;
您已经得到了一些很好的答案,但我只想指出 FPGA 中 LFSR 的规范指南在这里:
http://www.xilinx.com/support/documentation/application_notes/xapp052.pdf
它在某些地方有点 Xilinx 特定(这对您的 FPGA 来说没问题:),但这些原则可以转移到其他人身上。
通常你会使用IEEE.math_real统一函数
use IEEE.math_real.all;
procedure UNIFORM (variable Seed1,Seed2:inout integer; variable X:out real);
但是稍微研究一下伪随机数生成器 (PRNG),您会发现许多变体都是简单的LFSR ——它们看起来与 CRC 生成器非常相似。
如果您想从现有的、工作的 PRNG 开始自己开发,这里有几个资源:
http://www.opencores.org/?do=project&who=systemc_rng
http://verificationguild.com/modules.php?name=Downloads&d_op=viewdownload&cid=3
这是一个 CRC VHDL 代码生成器:
有一个在线工具可以为伪随机数生成器生成 Verilog 或 VHDL 代码。它在OutputLogic.com上
上面指向 OpenCores 的指针在 verilog 文件夹中有一个文件,名为:rng.v
我在 Spartan-3AN 中使用过它,效果很好。在我对部件进行编程后,我的代码使用随机数生成器来选择一个随机 PWM,它涵盖了所有可选的 PWM。
我同意 LFSR。我之前做过一个,它是用来加密的。