使用 UNIFORM 的随机生成器
Random Generator using UNIFORM
我正在尝试为一个小游戏生成一个随机数,我尝试使用包 MATH_REAL 中的 UNIFORM 函数。
我在测试我的代码时得到了一个值,但它永远不会改变。我试图让代码在每个 rising_edge 发生,但它没有改变任何东西。我找不到或想不出有效的解决方法。
我想我知道这个问题只是我的随机数只生成一次,但我想不出改变它的方法。
这是我实现的(我的时钟变化):
rand: process (count1)
variable seed1, seed2 : positive;
variable rand : real;
variable int_rand : integer range 1 to 5;
begin
if rst_i='1' then
count1 <= 1;
elsif rising_edge(clk_i) then
UNIFORM(seed1, seed2, rand);
int_rand := INTEGER(TRUNC(rand*5.0));
count1 <= int_rand;
end if;
end process;
count1 的值随后在另一个进程中使用。上面的代码给出了与简单相同的模拟结果:
rand: process (count1)
variable seed1, seed2 : positive;
variable rand : real;
variable int_rand : integer range 1 to 5;
begin
UNIFORM(seed1, seed2, rand);
int_rand := INTEGER(TRUNC(rand*5.0));
count1 <= int_rand;
end process;
有没有简单的方法可以保证不止一次生成一个随机数?
当目的是为 clk_i
的每个上升沿在 count1
上生成一个随机数时,然后将进程的敏感度列表更新为(假设由 rst_i
进行异步重置):
rand: process (rst_i, clk_i)
这将使进程在 rst_i
或 clk_i
的每次更改时重新执行,其中 count1
的敏感列表仅在 count1
更改时重新执行。
请注意 variable int_rand : integer range 1 to 5;
应为 range 0 to 4
,因为统一结果为 > 0.0 且 < 1.0。
一个有趣的行为是,对于第二个进程 rand: process (count1)
的敏感列表,如果没有 count1
上的 if
保护生成,实际上会使进程重新执行几次开始模拟,直到生成的 count1
值与之前的 count1
值相同,在这种情况下 count1
没有变化以触发流程的重新执行,然后流程是 then不再执行。
我正在尝试为一个小游戏生成一个随机数,我尝试使用包 MATH_REAL 中的 UNIFORM 函数。
我在测试我的代码时得到了一个值,但它永远不会改变。我试图让代码在每个 rising_edge 发生,但它没有改变任何东西。我找不到或想不出有效的解决方法。
我想我知道这个问题只是我的随机数只生成一次,但我想不出改变它的方法。
这是我实现的(我的时钟变化):
rand: process (count1)
variable seed1, seed2 : positive;
variable rand : real;
variable int_rand : integer range 1 to 5;
begin
if rst_i='1' then
count1 <= 1;
elsif rising_edge(clk_i) then
UNIFORM(seed1, seed2, rand);
int_rand := INTEGER(TRUNC(rand*5.0));
count1 <= int_rand;
end if;
end process;
count1 的值随后在另一个进程中使用。上面的代码给出了与简单相同的模拟结果:
rand: process (count1)
variable seed1, seed2 : positive;
variable rand : real;
variable int_rand : integer range 1 to 5;
begin
UNIFORM(seed1, seed2, rand);
int_rand := INTEGER(TRUNC(rand*5.0));
count1 <= int_rand;
end process;
有没有简单的方法可以保证不止一次生成一个随机数?
当目的是为 clk_i
的每个上升沿在 count1
上生成一个随机数时,然后将进程的敏感度列表更新为(假设由 rst_i
进行异步重置):
rand: process (rst_i, clk_i)
这将使进程在 rst_i
或 clk_i
的每次更改时重新执行,其中 count1
的敏感列表仅在 count1
更改时重新执行。
请注意 variable int_rand : integer range 1 to 5;
应为 range 0 to 4
,因为统一结果为 > 0.0 且 < 1.0。
一个有趣的行为是,对于第二个进程 rand: process (count1)
的敏感列表,如果没有 count1
上的 if
保护生成,实际上会使进程重新执行几次开始模拟,直到生成的 count1
值与之前的 count1
值相同,在这种情况下 count1
没有变化以触发流程的重新执行,然后流程是 then不再执行。