2016-12-29 7 views
0

私は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の出力のサイズは非常に大きいため、それは状況について非常に扱いにくい方法になります。

ご意見やご指摘をお待ちしております。

答えて

1

RNGの範囲を2つの範囲のうち小さい方に減らすには、一部のビットを無視します。私はそれがOUTPUT(15 downto 0)のようなものだと思うが、私はVHDLをまったく知らない。

残りのビットはジェネレータの動作状態を表し、使用しない場合でもデザインから削除することはできません。

ジェネレータが多すぎるゲートを使用している場合は、別のアルゴリズムを見つける必要があります。 WikipediaはC言語でexample 32-bit xorshift generatorを提供しています。

関連する問題