2014-02-13 137 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)