1024-битный псевдослучайный генератор в verilog для FPGA

Я хочу генерировать случайные векторы длиной 1024 в Verilog. Я посмотрел на некоторые реализации, такие как генераторы Tausworth и Mersenne Twisters. Большинство твистеров Mersenne имеют 32-битные / 64-битные выходы. Я хочу смоделировать шаблон ошибок 1024 бит с некоторой вероятностью р. Итак, я генерирую 32-битное случайное число (равномерно распределенное), используя Mersenne Twister. Поскольку у меня есть 32-битные случайные числа, это число будет в диапазоне от 0 до 2^32-1 . После этого я устанавливаю число в 1, если число, сгенерированное из этого 32-битного значения, меньше, чем p*(2^32-1) . В противном случае число отображается в 0 в моем 1023-битном векторе. По сути, каждое 32-битное число используется для генерации бита в векторе 1023 в соответствии с вероятностным распределением.

Вышеуказанный метод подразумевает, что мне нужно 1024 тактовых цикла для генерации каждого 1024-битного вектора. Есть ли другой способ, который позволяет мне сделать это быстро? Я понимаю, что мог бы использовать несколько экземпляров Mersenne Twister параллельно, используя разные начальные значения, но я боялся, что эти числа не будут действительно случайными и что будут столкновения. Есть ли что-то, что я делаю неправильно, или что-то, чего мне не хватает? Буду очень признателен за вашу помощь

1 ответ

Итак, я прочитал немного о Мерсенн Твистерс в целом из Википедии. Я принимаю, что я не получил все это, но я получил это: Учитывая начальное значение (для инициализации массива), модуль генерирует 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, это имеет тот же случай.

Надеюсь это ответит на твой вопрос.

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