génération de nombres aléatoires sur Spartan-3E
Question
Je dois générer des nombres pseudo-aléatoires pour mon algorithme génétique sur un Spartan-3E FPGA et je veux la mettre en œuvre dans Verilog: pourriez-vous me donner des indications sur ce
La solution
En général, vous devriez utiliser la fonction IEEE.math_real uniforme
use IEEE.math_real.all;
procedure UNIFORM (variable Seed1,Seed2:inout integer; variable X:out real);
Mais faire un petit peu une recherche sur des générateurs de nombres pseudo-aléatoires (PRNG) et vous trouverez de nombreuses variantes qui sont simples LFSR l ' -. qui semblent remarquablement similaires aux générateurs CRC
Voici plusieurs ressources si vous voulez rouler votre propre départ à partir existants, PRNGs de travail:
http://www.opencores.org/?do=project&who=systemc_rng
http://verificationguild.com/modules.php?name=Downloads&d_op = viewdownload & cid = 3
Voici un générateur de code CRC VHDL:
Autres conseils
Bien sûr, le générateur aléatoire par Adam n'est pas synthétisable! Vous devez créer explicitement LFSR .
L'exemple suivant peut aider. Il est un LFSR maximal de 8 bits
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;
Vous avez déjà quelques bonnes réponses, mais je vais simplement signaler le guide canonique LFSRs dans les FPGA est ici:
http://www.xilinx.com/support/documentation/application_notes /xapp052.pdf
Il est un peu Xilinx spécifique dans des endroits (ce qui est correct pour votre FPGA :) mais les principes sont transférables à d'autres.
Il est un outil en ligne qui peut générer Verilog ou code VHDL pour un générateur de nombres pseudo-aléatoires. Il est sur OutputLogic.com
Je suis d'accord avec le LFSR. Je l'ai fait un avant et il est utilisé pour le chiffrement.
Le pointeur ci-dessus pour OpenCores a un fichier dans le dossier appelé Verilog: rng.v
Je l'ai utilisé dans un Spartan-3AN et il fonctionne très bien. Mon code utilisé le générateur de nombres aléatoires pour sélectionner un PWM aléatoire après avoir programmé la pièce et il couvre tous les PWMs sélectionnables.