Итак, я немного почитал о Мерсеннских вихрях в целом из википедии. Я согласен, что не сразу понял все это, но я получил следующее: при заданном начальном значении (для инициализации массива) модуль генерирует 32-битные случайные числа.
Теперь, из вашего описания выше, для вычисления одного случайного числа требуется один цикл.
Таким образом, ваша проблема в основном сводится к математике, а не к verilog
как таковой.
Я постараюсь объяснить математику как можно лучше.
У вас есть 32-битное равномерно распределенное случайное число. Таким образом, вероятность того, что любой бит равен high
или low
, точно равна (ну, близка к псевдослучайной) 0.5
.
Давайте забудем, что это псевдослучайный генератор, потому что это лучшее, что вы получите (так что давайте считать это нашим идеалом).
Даже если мы сгенерируем 5 чисел одно за другим, вероятность того, что каждое из них будет каким-либо конкретным числом, по-прежнему будет равномерно распределена. Итак, если мы соединим эти пять чисел, мы получим 160-битное совершенно случайное число.
Если это все еще не ясно, подумайте об этом.
Я разберу проблему. Допустим, у нас есть 4-битный генератор случайных чисел (ГСЧ), и нам нужны 16-битные случайные числа.
Каждый выход ГСЧ будет шестнадцатеричным числом с равномерным распределением вероятностей. Таким образом, вероятность получить какую-то конкретную цифру (скажем... A) равна 1/16
. Теперь я хочу сделать 4-значный шестнадцатеричный номер (скажем... 0xA019).
Вероятность получения А в качестве старшей цифры = 1/16
Вероятность получения 0 в качестве числа 2 = 1/16
Вероятность получения 1 в качестве цифры 3 = 1/16
Вероятность получения 9 в качестве младшей значащей цифры = 1/16
Таким образом, вероятность получения 0xA019 = 1/(2^16)
. На самом деле, вероятность получения любого четырехзначного шестнадцатеричного числа будет точно такой же. Теперь распространите ту же логику на системы счисления с основанием 32 с 32-значными числами в качестве требуемого вывода, и вы получите свое решение.
Итак, мы видим, что мы могли бы сделать всего 32 повторения скручивания Мерсенна, чтобы получить 1024-битный вывод (это заняло бы 32 цикла, все еще довольно медленно). Что вы также можете сделать, так это синтезировать 32 твистера параллельно (это даст вам результат за один ход, но будет очень тяжело для fpga с точки зрения площади и ограничений по мощности).
Лучший способ сделать это — попытаться найти золотую середину (возможно, 4 параллельных скручивания, работающих за 8 циклов). На самом деле это будет вопрос конечного применения модуля и ограничений по мощности и времени, которые вам нужны для этого приложения.
Что касается предоставления различных начальных значений, большинство PRNG обычно предусматривают входные начальные значения только для увеличения случайности, из того, что я читал в Mersenne Twisters, это тот же случай.
Надеюсь это ответит на твой вопрос.
person
Parth K
schedule
21.01.2019