Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> VHDL

Как генерировать случайные числа в 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 получают только половину вероятности быть выбранными. Округление до 0 integer значение происходит в половине случаев, несмотря на то, что есть три варианта числа.

31

В приведенном выше коде мы исправили проблему округления конечной точки, изменив случайный real значение, чтобы включить дополнительные 0,5 выше и ниже конечных точек.

Случайный std_logic_vector

Есть много способов заполнить вектор случайными значениями, но этот метод работает с векторами любой длины. Я использую цикл for для обхода вектора и выбора случайного значения для каждого бита. В приведенном ниже коде len Параметр определяет длину случайного std_logic_vector вернуться.

40

Случайное значение времени

Иногда вам нужно сгенерировать случайный time значение в вашем тестовом стенде. Возможно, вы хотите имитировать внешний интерфейс, который записывает пакеты данных в случайное время. Какой бы ни была причина, случайный time значения легко произвести.

58

Для генерации случайного time значение в VHDL, вы должны сначала преобразовать желаемые минимальные и максимальные значения в real типы. Затем, после того, как формула рандомизации сделала свое волшебство, вы конвертируете результат обратно в VHDL time тип. Обратите внимание, что вы должны указать единицу времени моделирования, которую вы используете в симуляторе, в качестве аргумента этой функции, как показано в приведенном выше коде.

Случайный пакет OSVVM

Наконец, в качестве альтернативы созданию алгоритма рандомизации вручную вы можете использовать пакет Random из библиотеки OSVVM. Он имеет несколько перегруженных функций для генерации случайных значений для всех типов типов VHDL.

Методология проверки VHDL с открытым исходным кодом (OSVVM) — это библиотека VHDL для создания структурированных тестовых стендов. Пакет Random — лишь один из многих полезных пакетов в этой библиотеке.

61

Код выше показывает, как импортировать пакет OSVVM. ModelSim включает готовую библиотеку, поэтому вам не нужно загружать ее для этого симулятора. Обратитесь к файлу RandomPck.vhd из репозитория OSVVM GitHub, чтобы найти подходящую функцию рандомизации для ваших нужд.


VHDL

  1. Как создать список строк в VHDL
  2. Как остановить симуляцию в тестовом стенде VHDL
  3. Как создать ШИМ-контроллер на VHDL
  4. Как создать связанный список в VHDL
  5. Как использовать процедуру в процессе в VHDL
  6. Как использовать нечистую функцию в VHDL
  7. Как использовать функцию в VHDL
  8. Как создать конечный автомат на VHDL
  9. Как использовать процедуру в VHDL
  10. Как генерировать случайные числа в Java