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

Я хочу генерировать случайные векторы длиной 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 Ответ

0 голосов
/ 21 января 2019

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

Надеюсь, что ответит на ваш вопрос.

...