使用 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_iclk_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不再执行。