我正在尝试为模拟纸牌游戏的VHDL项目实现测试平台。
我需要计算在按下按钮时从一个不断计数的计数器中抽出卡片的游戏中获胜的几率。
为了引入随机性,我需要以随机的时间间隔向卡片绘制模块发送脉冲。我只是想知道如何实现它。
我不知道如何实现一个,所以我尝试了这个。
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 Starter。
答案 0 :(得分: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)。