Verilog 101: создание первых модулей описания аппаратуры
В этой статье мы изучим базовую структуру модуля Verilог, рассмотрим примеры использования типа данных «wire» и его векторной формы, и кратко затронем отличия между VHDL и Verilog.
В этой статье мы изучим базовую структуру модуля Verilog, рассмотрим примеры использования типа данных «wire» и его векторной формы, и кратко затронем отличия между VHDL и Verilog.
Verilog и VHDL — два языка, обычно используемые для описания цифровых схем. AAC имеет серию технических статей, обсуждающих базовые концепции VHDL. Эта статья служит точкой входа для нашей серии по Verilog.
Нужны ли мне и Verilog, и VHDL?
Прежде чем начать, ответим на очевидный вопрос: действительно ли нам нужно знать оба языка?
И Verilog, и VHDL — мощные инструменты для проектирования сложных цифровых схем. Хотя между этими HDL есть различия, вы можете выбрать любой для освоения и использования. Однако я считаю, что в какой-то момент вы выиграете от базового понимания обоих языков. Иногда дизайнерам нужен фрагмент кода-примера, чтобы понять, как кодировать проект. Мы часами серфим сеть и наконец находим то, что нужно, но оно непонятно — написано на совершенно незнакомом HDL. Без базового понимания языка мы можем не полностью понять техники.
Эволюция Verilog
Verilog был спроектирован в начале 1984 года компанией Gateway Design Automation (примерно за три года до того, как VHDL был инициирован Министерством обороны США). При поддержке DoD VHDL стал стандартом IEEE в 1987 году. Verilog не появился на сцене до 1995 года. Сегодня оба VHDL и Verilog — популярные HDL, и инструменты FPGA обычно поддерживают оба языка.
Слово «Verilog» — портманто из слов «verification» и «logic», потому что язык изначально предлагался как инструмент симуляции и верификации. Давайте начнем с концепций и синтаксиса Verilog.
Пример 1
В качестве первого примера напишем Verilog-код для схемы, изображенной на Рисунке 1.

Рисунок 1. Circuit_1
Есть два входа и один выход. Все порты однобитные. Функциональность схемы — выполнить AND двух входов и выдать результат на порт out1.
Один из возможных Verilog-описаний модуля Circuit_1:

Строки 1 и 8
Эти строки используют ключевые слова «module» и «endmodule», чтобы указать, что строки между ними (2–7) описывают схему с именем «Circuit_1». Это имя произвольно и позволяет ссылаться на схему позже.
Строки 2–6
Эти строки задают интерфейс «Circuit_1» с окружающей средой. Входные и выходные порты описываются ключевыми словами «input» и «output». За ними следует ключевое слово «wire» и имя порта (см. Рисунок 1). Что обозначает «wire»? «Wire» — тип данных Verilog, представляющий физический провод в дизайне. Мы обсудим типы данных Verilog подробнее в будущей статье, но пока знаем, что в нашем модуле будет три провода: a, b, out1, и так как они указаны в объявлении портов, они соответствуют интерфейсу модуля.
Строка 7
Эта строка использует побитовый оператор AND, то есть &, для описания функциональности схемы. Ключевое слово «assign» помещает a&b на выходной порт out1. Это называется непрерывным присваиванием. Оно так называется, потому что присваивание всегда активно: когда любой операнд справа меняется, a&b пересчитывается и присваивается out1. Мы можем представить непрерывное присваивание как комбинационную схему, выход которой непременно обновляется в зависимости от входов. В нашем примере эта комбинационная схема — простой элемент AND. В Verilog HDL также есть процедурные присваивания, которые будут обсуждены в будущих статьях.
Теперь мы можем использовать программный пакет вроде Xilinx ISE для проверки кода выше. Verilog-ориентированный туториал этого ПО можно найти здесь (PDF).
Сравнение примера 1 с кодом VHDL
Рисунок 2 ниже показывает Verilog и VHDL описания для модуля Circuit_1.

Рисунок 2. Сравнение Verilog и VHDL описаний для Circuit_1.
Как видите, в VHDL нужно подключать библиотеки. Они дают определения типов данных и операторов. Учитывая эти библиотеки и общий формат VHDL, мы видим, что VHDL код более вербален. Однако эта вербальность не лишена преимуществ. Например, управление библиотеками в VHDL может помочь при моделировании систем более высокого уровня. В будущих статьях мы будем иногда обсуждать плюсы и минусы этих двух HDL.
У Verilog четырехзначная система
В большинстве типов данных Verilog используются четыре базовых значения. Провода, определенные в листинге 1, могут принимать одно из следующих значений:
- 0: логический ноль или ложь
- 1: логическая единица или истина
- z: состояние высокого импеданса (может описывать выход тристатевого буфера)
- x: don't-care или неизвестное значение (когда вход не инициализирован или два и более конфликтующих выхода соединены вместе).
Тип данных VHDL std_logic может принимать девять разных значений, но обычно используются '0', '1', 'Z', и '-' ('-' обозначает don't-care).
Пример 2
В качестве другого примера напишем Verilog-код для схемы (которую назовем Circuit_2), показанной на Рисунке 3.

Рисунок 3. Circuit_2
Следующий Verilog-код описывает эту схему:

Элементы в коде похожи на Пример 1, за исключением того, что во строке 10 определяется внутренний сигнал. Ключевое слово «wire» указывает тип данных этого соединения. Как обсуждалось, тип «wire» транслируется в физический провод в дизайне.
Код также использует новые побитовые операторы Verilog: ~ для NOT и | для OR. Еще один полезный оператор — ^ для XOR. Рисунок 4 показывает оба Verilog и VHDL описания для модуля Circuit_2. Такие сравнения помогают увидеть различия и сходства между языками.

Рисунок 4. Сравнение Verilog и VHDL описаний для Circuit_2.
Пример 3
Для третьего и последнего примера дадим Verilog-код для схемы на Рисунке 5.

Рисунок 5. Схема для примера 3.
Как видите, есть определенная связь между синими входными портами и красными: соответствующие входы комбинируются оператором AND. Результат присваивается выходному порту. В таких случаях можно группировать сигналы и рассматривать их как вектор. Это делает код компактным и читаемым.
Используя концепцию векторов в Verilog, мы можем легко расширить код Листинга 1 для описания вышеуказанной схемы (см. код в Листинге 3 ниже).

Обратите внимание, что диапазон индексов векторов может быть либо возрастающим ([0:2] как выше), либо убывающим ([2:0]). Хотя выше использован возрастающий формат, обычно менее ошибочно использовать убывающий. Это связано с тем, что убывающий стиль соответствует нашему восприятию, что крайняя левая позиция бинарного числа имеет наивысший индекс. Векторы также используются в VHDL.
Рисунок 6 ниже показывает симуляцию ISE кода Листинга 3.

Рисунок 6. ISE симуляция кода примера 3.
В этой статье мы обсудили, что хорошо бы знать и VHDL, и Verilog, изучили базовую структуру модуля Verilog, ознакомились с типом данных «wire» и его векторной формой. Также кратко коснулись отличий между VHDL и Verilog. Следующая статья нашей серии по Verilog будет обсуждать проектирование комбинационных схем в Verilog.
Встроенный
- Code-Ready Containers: практическое руководство по облачно-ориентированной автоматизации процессов с Red Hat OpenShift
- Практическое руководство по керамической 3D-печати: техники, материалы и советы по дизайну
- Начало работы с TJBot: сборка, настройка и голосовое управление ИИ-роботом
- Пошаговое руководство по развертыванию LoRa-шлюза RAK 831 на Raspberry Pi 3
- Сборка LoRa-шлюза на модуле RAK831 и Raspberry Pi 3 — пошаговое руководство
- Мастерство Edge AI-инференса: практическое руководство к действительным инсайтам
- Откройте для себя Eagle Group: ваш партнер по качественному металлообработке
- Оптимизация техники Cat®: полное руководство по My.Cat.com
- Развертывание Node-RED на PLCnext с Docker: пошаговое руководство
- Создание первого Go-приложения на PLCnext: руководство для начинающих