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