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

Я считаю, что эти проблемы возникают из-за предположений, которые люди делают на основе номенклатуры вещей, поскольку не все в VHDL работает так же, как вещи, которые могут выглядеть или называться одинаково.

Здесь, в этой статье, я пытаюсь обрисовать некоторые распространенные проблемы, с которыми сталкиваются некоторые люди, и попытаться провести более подходящую аналогию.

Организация объявления компонентов VHDL

Эта диаграмма используется для объяснения в следующих разделах.

Цикл выполнения

Код VHDL НЕ выполняется последовательно. Исключительно для понимания, вы можете рассматривать каждую строку или блок кода как что-то, что будет выполняться параллельно. Таким образом, каждый оператор, вызов функции, процесс будут выполняться одновременно.

Вы можете сделать части выполнения последовательными, заставив выполнение ждать сигналов, это часто можно увидеть, когда мы проверяем нарастающий фронт тактового сигнала.

Компоненты

Компонент — это оболочка, которая может содержать процессы, функции и т. д. для реализации желаемого поведения. Это похоже на класс в объектно-ориентированном программировании, как вы можете видеть на рисунке 1.

Чтобы использовать класс/компонент, вы создаете его экземпляр в нужном месте, а затем даете ему указанные входные и выходные параметры.

В отличие от традиционного класса и объекта здесь компонент изменяет выходной параметр во время выполнения, как передача по ссылке, вместо того, чтобы возвращать значение после выполнения.

Порты/Параметры

Порты ввода/вывода — это интерфейс к компоненту.

Входные порты совпадают с входными параметрами, заданными для функции.

Выходные порты НЕ совпадают с возвращаемыми значениями функции, но подобны значению, переданному по ссылке в функцию, которая изменяется. Здесь важно отметить, что это значение может измениться в любой момент выполнения и может измениться несколько раз, поскольку это не возвращаемое значение, которое возвращается после завершения выполнения.

Процессы

Это методология написания кода, который должен выполняться последовательно, процессы могут взаимодействовать со всеми связями, сигналами, функциями и т. д., присутствующими в компоненте.

Компонент может иметь несколько процессов, которые будут выполняться одновременно.

Процессы не имеют портов, параметров или возвращаемых значений; вы можете использовать их для изменения сигналов в соответствии с желаемыми операциями.

Функции

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

Пример кода и перевод на аппаратное обеспечение