Генератор случайных чисел с использованием UNIFORM

Я пытаюсь сгенерировать случайное число для маленькой игры и пытался использовать функцию UNIFORM из пакета MATH_REAL.

Когда я тестирую свой код, я получаю значение, но оно никогда не меняется. Я пытался заставить код происходить на каждом восходящем крае, но это ничего не изменило. Я не мог найти или придумать эффективное решение.

Мне кажется, я знаю, что проблема в том, что мое случайное число генерируется только один раз, но я не мог найти способ изменить это.

Вот что я реализовал (мой вариант с часами):

    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;

Есть ли простой способ убедиться, что случайное число генерируется более одного раза?

1 ответ

Решение

Когда целью является генерация случайного числа на count1 за каждый передний край clk_iзатем обновите список чувствительности процесса до (при условии, что асинхронный сброс 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) что касается второго процесса, без if охрана поколения на count1, фактически заставит процесс повторно выполнить несколько раз начало симуляции, пока не будет сгенерирован count1 значение идентично предыдущему count1 значение, в этом случае без изменений на count1 инициировать повторное выполнение процесса, и тогда процесс больше не выполняется.

Другие вопросы по тегам