私はvivdを使ってvhdlで乱数を生成する方法を見つけようとしています(つまり、math_realライブラリを使うことはできません)。128ビットのシフトを縮小します。 - PRNG in vhdl
これらのランダムな値は、順番にアプリケーションのために使用されるランダムタイミングを生成しますプリスケーラがいるために実行されますカウント数を決定します。
これは値が、私は常にプリスケーラがで走る速さを微調整することができますように非常に特定の値を持っている必要はありません生成されたことを意味します。一般的に言えば、私は1000 - 10,000の間の値を探していますが、もう少し大きい値も同様です。
私は128ビットxorshiftを実装し、非常にうまく動作するようには思えない、次のコードをオンラインで見つけました。唯一の問題は、符号なし整数の最大値が2^32であるため、値が大きすぎて整数への変換が無意味であることです。
これはコードです:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity XORSHIFT_128 is
port (
CLK : in std_logic;
RESET : in std_logic;
OUTPUT : out std_logic_vector(127 downto 0)
);
end XORSHIFT_128;
architecture Behavioral of XORSHIFT_128 is
signal STATE : unsigned(127 downto 0) := to_unsigned(1, 128);
begin
OUTPUT <= std_logic_vector(STATE);
Update : process(CLK) is
variable tmp : unsigned(31 downto 0);
begin
if(rising_edge(CLK)) then
if(RESET = '1') then
STATE <= (others => '0');
end if;
tmp := (STATE(127 downto 96) xor (STATE(127 downto 96) sll 11));
STATE <= STATE(95 downto 0) &
((STATE(31 downto 0) xor (STATE(31 downto 0) srl 19)) xor (tmp xor (tmp srl 8)));
end if;
end process;
end Behavioral;
時間の過去のカップルのために、私は私が16ビットあるいは32ビットのPRNGが、毎回、再び、8ビットにPRNG xorshiftこの128ビットをダウンスケールしようとしています1サイクル後に出力が得られないか、シミュレーション(テストベンチ)がフリーズします。
私はちょうどその方法で動作する値を分割しようとしましたが、128ビットxorshiftの出力のサイズは非常に大きいため、それは状況について非常に扱いにくい方法になります。
ご意見やご指摘をお待ちしております。