I need to generate pseudo-random numbers for my genetic algorithm on a Spartan-3E FPGA and i want to implement it in verilog: could you give me any pointers on this?
Of course the random generator by Adam is not synthesizable! You have to explicitly create an LFSR.
Following example might help. It is an 8-bit maximal 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;
You've already got some good answers, but I'll just point out the canonical guide to LFSRs in FPGAs is here:
http://www.xilinx.com/support/documentation/application_notes/xapp052.pdf
It's a bit Xilinx specific in places (which is OK for your FPGA :) but the principles are transferable to others.
Typically you'd use the IEEE.math_real uniform function
use IEEE.math_real.all;
procedure UNIFORM (variable Seed1,Seed2:inout integer; variable X:out real);
But do a tiny bit a research on pseudo random number generators (PRNGs) and you'll find many variants that are simple LFSR's - which look remarkably similar to CRC generators.
Here are several resources if you want to roll your own starting from existing, working PRNGs:
http://www.opencores.org/?do=project&who=systemc_rng
http://verificationguild.com/modules.php?name=Downloads&d_op=viewdownload&cid=3
Here's a CRC VHDL code generator:
http://www.easics.be/webtools/crctool
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With