Генератор случайных чисел с использованием 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
инициировать повторное выполнение процесса, и тогда процесс больше не выполняется.