Spartan-3E FPGAで遺伝的アルゴリズムの疑似乱数を生成する必要があり、それをVerilogに実装したいと思います。これに関するポインタを教えてください。
6 に答える
もちろん、Adamによるランダムジェネレーターは合成できません!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
場所によってはザイリンクス固有のものですが(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
これがCRCVHDLコードジェネレータです。
疑似乱数ジェネレータ用のVerilogまたはVHDLコードを生成できるオンラインツールがあります。OutputLogic.comにあります
上記のOpenCoresへのポインターには、verilogフォルダーにrng.vというファイルがあります。
私はSpartan-3ANでそれを使用しました、そしてそれは素晴らしい働きをします。私のコードは、パーツをプログラムした後、乱数ジェネレーターを使用してランダムPWMを選択し、選択可能なすべてのPWMをカバーしました。
LFSRに同意します。以前に作成したことがあり、暗号化に使用されます。