2014-02-13 179 views
1

我正在嘗試爲模擬紙牌遊戲的VHDL項目實現測試臺。vhdl testbench的紙牌遊戲?

我需要計算遊戲中獲勝的機率,在按下按鈕時從持續計數的計數器中抽取卡。

爲了引入隨機性,我需要以隨機時間間隔向卡片繪製模塊發送一個脈衝。我只是想知道如何實現它。

我不知道如何實現一個,所以我試了這個。

tb: process 
    VARIABLE seed1, seed2: positive; 
    VARIABLE rand: real; 
    VARIABLE int_rand: integer; 
    variable time_var1, time_var2: time ; 
    begin 
     uniform(seed1, seed2,rand); 
     int_rand := INTEGER(trunc(rand*4096.0)); 
     int_rand := to_integer((to_unsigned(int_rand, 14))); 
     time_var2 := (10 ms + (int_rand*1 us)); 
end process; 

然後,我發送郵件使用

key1 <= '1'; 
wait for time_var2; 
key1 <= '0'; 
wait for 2ns; 
and repeat... 

我使用的ModelSim啓動脈衝。

回答

0

math_real.uniform是一個良好的開端,然後你可以創建一個 試驗檯的過程與在每次調用給出了一個隨機時間的函數,用於 例如:

process is -- Test bench process 

    variable seed1 : natural := 1; -- Random seed1 for rnd_time function 
    variable seed2 : natural := 1; -- Random seed2 --||-- 

    impure function rnd_time return time is -- Random time at each call 
    variable rnd_real : real;  -- In range [0.0 .. 1.0] 
    variable rnd_pos : positive; -- In range [0 .. 20] 
    begin 
    math_real.uniform(seed1, seed2, rnd_real); -- Random real [0.0 .. 1.0[ 
    rnd_pos := positive(rnd_real * 21.0); -- Scaling to [0 .. 20] steps 
    return 50 ns + 10 ns * rnd_pos; -- Minimum and step values 
    end function; 

begin 
    while TRUE loop 
    rnd_sig <= '0'; 
    wait for rnd_time; 
    rnd_sig <= '1'; 
    wait for 10 ns; 
    end loop; 
end process; 

對於更高級的隨機代,你可以看看Open Source VHDL Verification Methodology (OS-VVM)