Как генерировать случайные числа в VHDL
VHDL имеет встроенный генератор псевдослучайных чисел, но он может генерировать числа с плавающей запятой только в диапазоне от 0 до 1. К счастью, вы можете получить из него любой другой формат случайных данных, который вам нужен. Продолжайте читать эту статью, чтобы узнать, как создать real
. или integer
значения любого диапазона, а также случайные std_logic_vector
последовательности и time
значения.
uniform
Процедура из пакета IEEE MATH_REAL является основой алгоритмов, описанных в этой статье. Обратите внимание, что uniform
полагается на программное обеспечение для генерации случайных чисел. Следовательно, ни один из этих алгоритмов не является синтезируемым. Вы можете использовать их только на тестовых стендах.
01
В приведенном выше листинге показан прототип uniform
. процедура. Для работы ему нужны две исходные переменные, и он будет изменять их каждый раз, когда вы вызываете процедуру. Выход X — это случайное число, которое всегда имеет значение от 0 до 1.
Как и другие генераторы псевдослучайных чисел, uniform
будет генерировать ту же последовательность чисел при вызове с теми же начальными значениями. Из-за этого поведения вы можете повторно запустить тестовую среду и получить тот же результат при использовании тех же начальных значений.
Подробное описание того, как работает этот алгоритм, см. в статье Пьера Л’Экуйера «Эффективные и портативные комбинированные генераторы случайных чисел». Вы также можете просмотреть реальную реализацию алгоритма в симуляторе VHDL с открытым исходным кодом GHDL.
Тестовый пример
Во всех примерах в этой статье для обоих начальных значений используется значение 999. Мы объявляем начальные переменные, как указано ниже, в декларативной области процесса. Затем мы реализуем наши пользовательские алгоритмы рандомизации как нечистые функции в рамках того же процесса.
10пре>Вы можете загрузить полную тестовую среду, содержащую все примеры из этой статьи, используя форму ниже. Файл Zip также содержит проект ModelSim со сценарием, который компилирует и запускает моделирование для вас.
Случайное действительное значение
uniform
процедура генерирует случайныйreal
значение от 0,0 до 1,0.real
тип — это формат VHDL с плавающей запятой. Однако есть вероятность, что вы хотите, чтобы случайное число находилось в другом диапазоне.28К счастью, мы можем легко перевести вывод
uniform
путем умножения на масштаб и добавления к нему смещения. В приведенном выше коде показана функция, которая возвращает случайныйreal
. значение в пределах минимального/максимального диапазона.Случайное целочисленное значение
Чтобы сгенерировать случайный
integer
значение в указанном диапазоне, вы должны умножить на масштаб и добавить к нему смещение. Но есть ловушка, которую нужно избегать. Вы не можете просто сгенерировать случайныйreal
значение в пределах диапазона и округлить его доinteger
.
На иллюстрации выше показана проблема. В примере мы намерены сгенерировать случайный
integer
значение в диапазоне от -1 до 1. Если мы возьмем за основу нашinteger
на случайномreal
который идет точно к конечным точкам, целые числа min и max получают только половину вероятности быть выбранными. Округление до 0integer
значение происходит в половине случаев, несмотря на то, что есть три варианта числа.31В приведенном выше коде мы исправили проблему округления конечной точки, изменив случайный
real
значение, чтобы включить дополнительные 0,5 выше и ниже конечных точек.Случайный std_logic_vector
Есть много способов заполнить вектор случайными значениями, но этот метод работает с векторами любой длины. Я использую цикл for для обхода вектора и выбора случайного значения для каждого бита. В приведенном ниже коде
len
Параметр определяет длину случайногоstd_logic_vector
вернуться.40Случайное значение времени
Иногда вам нужно сгенерировать случайный
time
значение в вашем тестовом стенде. Возможно, вы хотите имитировать внешний интерфейс, который записывает пакеты данных в случайное время. Какой бы ни была причина, случайныйtime
значения легко произвести.58Для генерации случайного
time
значение в VHDL, вы должны сначала преобразовать желаемые минимальные и максимальные значения вreal
типы. Затем, после того, как формула рандомизации сделала свое волшебство, вы конвертируете результат обратно в VHDLtime
тип. Обратите внимание, что вы должны указать единицу времени моделирования, которую вы используете в симуляторе, в качестве аргумента этой функции, как показано в приведенном выше коде.Случайный пакет OSVVM
Наконец, в качестве альтернативы созданию алгоритма рандомизации вручную вы можете использовать пакет Random из библиотеки OSVVM. Он имеет несколько перегруженных функций для генерации случайных значений для всех типов типов VHDL.
Методология проверки VHDL с открытым исходным кодом (OSVVM) — это библиотека VHDL для создания структурированных тестовых стендов. Пакет Random — лишь один из многих полезных пакетов в этой библиотеке.
61Код выше показывает, как импортировать пакет OSVVM. ModelSim включает готовую библиотеку, поэтому вам не нужно загружать ее для этого симулятора. Обратитесь к файлу RandomPck.vhd из репозитория OSVVM GitHub, чтобы найти подходящую функцию рандомизации для ваших нужд.
VHDL
- Как создать список строк в VHDL
- Как остановить симуляцию в тестовом стенде VHDL
- Как создать ШИМ-контроллер на VHDL
- Как создать связанный список в VHDL
- Как использовать процедуру в процессе в VHDL
- Как использовать нечистую функцию в VHDL
- Как использовать функцию в VHDL
- Как создать конечный автомат на VHDL
- Как использовать процедуру в VHDL
- Как генерировать случайные числа в Java