Понимание основ Vhdl-синтаксиса и структуры для начинающих

Что такое VHDL и почему его должны изучать новички?

VHDL означает VHSIC Hardware Description Language, где VHSIC сам по себе означает Очень высокоскоростную интегральную схему. Это сильно типизированный, одновременный и событийный язык, используемый для моделирования цифровых систем от алгоритмического уровня до уровня ворот. В отличие от обычных языков программного обеспечения, которые выполняют инструкции в линейной последовательности, VHDL описывает аппаратное поведение, которое работает параллельно. Это делает его важным инструментом для проектирования, моделирования и реализации цифровой логики в FPGA (Field-Programmable Gate Arrays) и ASIC (Application-Specific Integrated Circuits).

Для начинающих кривая обучения может показаться крутой, потому что синтаксис VHDL многословен по сравнению с современными языками программного обеспечения. Однако его строгая структура заставляет вас думать как разработчик оборудования - каждый сигнал, порт и процесс представляет собой реальные физические соединения и логические врата. Освоение основ синтаксиса и структуры VHDL дает вам прочную основу для создания всего: от простых комбинационных схем до сложных государственных машин и конвейерных процессоров. Эта статья проходит через каждую основную концепцию с практическими примерами и объяснениями, адаптированными для кого-то, кто только начинает.

Основной синтаксис VHDL: структурированный язык

Синтаксис VHDL в значительной степени вдохновлен Ada и Pascal. Он использует англоязычные ключевые слова и требует четкого разделения интерфейса (сущности) от реализации (архитектура). Каждый файл дизайна VHDL содержит по меньшей мере одну пару объект-архитектура. Язык нечувствителен к регистру , что означает , и рассматриваются одинаково. Однако большинство руководств по стилю рекомендуют использовать нижний регистр для сигналов и верхний регистр для констант и общих параметров для улучшения читаемости.

Зарезервированные ключевые слова и идентификаторы

VHDL определяет набор зарезервированных ключевых слов, которые не могут быть использованы в качестве идентификаторов пользователя (например, , сущности, архитектуры, сигнала, порта, начала, конца, процесса, функции, переменной, постоянной, если, то, в другом случае, для, в то время как ). Идентификаторы должны начинаться с буквы и могут содержать буквы, цифры и подчеркивания. Они не могут заканчиваться с подчеркиванием или иметь два последовательных подчеркивания. Примеры действительных идентификаторов: , , .

Комментарии

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

Заявления и семиколоны

Каждое утверждение в VHDL заканчивается полуколоном (]. Это включает в себя декларации сущности, органы архитектуры, назначения сигналов, декларации процессов и параллельные назначения сигналов. Отказ от полуколона является одной из наиболее распространенных ошибок новичка. Кроме того, VHDL использует двойные тире для комментариев и одиночные цитаты для буквалей символов (например, , ) против двойных цитат для строк (например, ).

Основные компоненты VHDL: сущность, архитектура, сигналы и процессы

Для проектирования чего-либо в VHDL необходимо понимать четыре фундаментальных строительных блока: сущности , архитектуры , сигналы и процессы . Каждый дизайн по существу представляет собой черный ящик (сущность) с подробным внутренним описанием (архитектура), который использует сигналы для соединения компонентов и процессов для описания последовательной или комбинационной логики.

Название: The Black Box Interface

сущность объявляет внешний интерфейс аппаратного компонента. указывает все порты — входы и выходы — вместе с их направлением (в, вне, вне) и типом данных. Сущность не описывает никакой внутренней логики; она только сообщает внешнему миру, как подключиться к компоненту.

entity and_gate is
 port (
 a : in std_logic;
 b : in std_logic;
 y : out std_logic
 );
end entity and_gate;

В этом примере объект имеет три порта: два входа , и один выход , все типа . Тип является стандартной девятизначной логической системой, определенной в пакете . Это наиболее часто используемый тип для цифровых сигналов, поскольку он поддерживает такие значения, как , , (высокий импеданс), (неизвестный) и многое другое.

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

Архитектура: Внутренняя реализация

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

Архитектура начинается с ключевого слова , за которым следует имя архитектуры, ключевое слово , имя сущности и . Затем идут разделы объявлений (для сигналов, констант, компонентов) и, наконец, ключевое слово , за которым следуют параллельные утверждения. Архитектура заканчивается или .

architecture behavioral of and_gate is
begin
 y <= a and b;
end architecture behavioral;

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

Сигналы: провода, которые соединяют все

Сигналы представляют собой физические провода, шины или внутренние узлы в цепи. Они объявлены в разделе декларации архитектуры (или в пакетах, объектах или блоках). Сигналы должны быть назначены оператору , который является оператором назначения сигнала (отличается от переменного назначения ). Обновление назначения сигнала после дельта-задержки, которая является концепцией VHDL, используемой для моделирования реального распространения сигналов.

signal internal_net : std_logic;
…
internal_net <= a and b; -- concurrent assignment
y <= internal_net;

Сигналы могут быть любого типа данных — , , , и т. д. Использование для автобусов распространено: . Использование против влияет на порядок битов. Большинство дизайнеров используют для крупноузловой нумерации (наиболее значимый бит при самом высоком индексе).

Процессы: описание последовательного поведения

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

Простой флип-флоп D-типа с асинхронным сбросом может быть записан как:

process (clk, rst) is
begin
 if rst = '1' then
 q <= '0';
 elsif rising_edge(clk) then
 q <= d;
 end if;
end process;

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

Образец VHDL структуры: полный дизайн

Давайте сопоставим все это с более подробным примером: мультиплексор 2-1 (MUX) с выбранной строкой. Этот дизайн показывает, как использовать объекты, архитектуры, сигналы и процессы в одном файле. MUX выбирает между двумя 8-битными входами на основе одной выбранной строки.

-- 8-bit 2-to-1 Multiplexer
library ieee;
use ieee.std_logic_1164.all;

entity mux2to1 is
 port (
 a, b : in std_logic_vector(7 downto 0);
 sel : in std_logic;
 y : out std_logic_vector(7 downto 0)
 );
end entity mux2to1;

architecture behavioral of mux2to1 is
begin
 process (a, b, sel) is
 begin
 if sel = '0' then
 y <= a;
 else
 y <= b;
 end if;
 end process;
end architecture behavioral;

Этот код вводит несколько новых понятий:

  • Библиотека и использование разделов : и требуются в верхней части каждого файла дизайна, который использует или . Библиотека определяет библиотеку дизайна, и пункт использования приводит пакет в объем.
  • Порты вектора: Входные данные и — — 8-битная шина. Выход — такая же ширина.
  • Процесс с несколькими входами: Список чувствительности включает , и , поскольку выход зависит от всех трёх.
  • Если заявление внутри процесса : является последовательным заявлением, которое может появляться только внутри процесса или подпрограммы.

Этот пример является синтезируемым (может быть превращен в реальное аппаратное обеспечение), потому что логика является чисто комбинационной. Процесс описывает MUX, который распознает каждый инструмент синтеза.

Основные правила VHDL-синтаксиса, которые должен знать каждый начинающий

Помимо основных компонентов, VHDL имеет несколько синтаксических правил, которые застают новичков врасплох. Освоение этих ранних позволит сэкономить часы отладки.

1.Сильная печатка

VHDL сильно типизирован , то есть вы не можете напрямую назначать сигнал одного типа другому, даже если они выглядят похожими (например, на ). Вы должны использовать функции преобразования типа (, и т. Д.) или явно отливать . Эта строгость предотвращает случайные несоответствия и делает конструкции более надежными.

2.Разница между и (Конкурентный против Последовательный)

Вне процесса вы можете использовать одновременное условное назначение сигнала с :

y <= a when sel = '0' else b;

Это эквивалентно предыдущему процессу на основе MUX, но не является последовательным — это одно одновременное утверждение. Новички часто путают (последовательное) с (совместное). Как правило: допускается только внутри процессов, функций и процедур; используется для одновременного назначения сигналов.

3. Назначение сигнала против переменного назначения

Внутри процесса можно объявить переменные , используя ключевое слово , и немедленно обновить переменные , что контрастирует с сигналами, которые используют и обновлять только после того, как процесс приостанавливается. Использование сигналов внутри процесса может привести к непреднамеренному поведению, если вы прочтете сигнал после назначения его в том же процессе — чтение будет видеть старое значение до следующего дельта-цикла.

process (clk) is
 variable temp : std_logic;
begin
 if rising_edge(clk) then
 temp := a and b; -- variable updates immediately
 y <= temp; -- signal updates after process suspension
 end if;
end process;

4.Идиома обнаружения торцевых часов

Для моделирования регистра (flip-flop) необходимо обнаружить восходящую или падающую кромку часов. Стандартный способ заключается в использовании или из пакета , который правильно обрабатывает значения X и Z. Никогда не используйте — он может вести себя по-разному в моделировании против синтеза.

5. Списки заявлений о ожиданиях и чувствительности

Процесс может иметь либо список чувствительности , либо содержать утверждения , но не оба. Для синтеза списки чувствительности являются нормой. Список должен включать каждый сигнал, считываемый внутри процесса (если только это не загруженный процесс, в этом случае необходимы только часы и асинхронный сброс / включение часов). Отсутствие сигнала из списка чувствительности может вызвать несоответствие между моделированием и синтезом — симулятор может не обновлять выход при изменении этого сигнала, но синтезированное оборудование все равно будет обновляться.

6. Карта портов и обоснование компонентов

При построении иерархических конструкций вы инстанцируете компоненты более низкого уровня с помощью . Синтаксис соединяет внутренние сигналы с портами объекта. Например, инстанцируя более ранний MUX:

u_mux : entity work.mux2to1
 port map (
 a => data_a,
 b => data_b,
 sel => select_line,
 y => mux_out
 );

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

Промежуточные методы для начинающих, чтобы исследовать

После того, как вы освоите основы, вы можете начать изучать дополнительные конструкции VHDL, которые делают конструкции более мощными и многоразовыми.

Использование дженериков для параметризированных конструкций

Генерии позволяют передавать константы в сущность, делая дизайн масштабируемым без переписывания кода. Например, общий N-бит MUX:

entity generic_mux is
 generic (
 WIDTH : positive := 8
 );
 port (
 a, b : in std_logic_vector(WIDTH-1 downto 0);
 sel : in std_logic;
 y : out std_logic_vector(WIDTH-1 downto 0)
 );
end entity;

При инстанциации вы можете переопределить по общей карте:

generic map (WIDTH => 16)

Понимание параллельных и последовательных заявлений

VHDL имеет две основные категории заявлений:

  • Конкурентные утверждения: Выполняют одновременно, параллельно. Они включают простые назначения сигналов (]), условные назначения сигналов (), компонентные инстанциации и генерируют утверждения.
  • Секвентивные утверждения: Выполняйте одно за другим, внутри процесса, функции или процедуры. Они включают , , , и переменное назначение.

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

Моделирование конечных государственных машин (FSM)

FSMs - классическое применение процессов VHDL. Простая машина Мура использует два процесса: один для логики следующего состояния (комбинациональный) и один для государственного регистра (последовательного). Это разделение улучшает читаемость:

architecture rtl of fsm is
 type state_type is (idle, run, done);
 signal state, next_state : state_type;
begin
 -- Sequential register
 process (clk, rst) is
 begin
 if rst = '1' then
 state <= idle;
 elsif rising_edge(clk) then
 state <= next_state;
 end if;
 end process;

 -- Next-state logic
 process (state, input) is
 begin
 next_state <= state; -- default to prevent latches
 case state is
 when idle =>
 if input = '1' then
 next_state <= run;
 end if;
 when run =>
 if input = '0' then
 next_state <= done;
 end if;
 when done =>
 next_state <= idle;
 end case;
 end process;
end architecture;

Этот шаблон чрезвычайно распространен в реальных конструкциях. Обратите внимание на назначение по умолчанию — это позволяет избежать защелкивания, гарантируя, что каждый сигнал получает значение во всех ветвях заявления о случае.

Основные ошибки начинающих и как их избежать

Даже после изучения синтаксиса новички часто путешествуют по этим вопросам. Осознание их сгладит вашу кривую обучения.

  • Забыли включить библиотеку IEEE: Без вы не сможете использовать .
  • Использование , когда или отдельные сигналы будут чище: Внутренняя обратная связь (чтение выходного порта) часто приводит к , но современный VHDL позволяет режим порта, который делает намерения более ясными.
  • Не инициализируют сигналы или переменные: В моделировании начальные значения по умолчанию являются (неинициализированы) для . Используйте явные назначения по умолчанию (например, . Для синтеза требуется логика сброса.
  • Смешивание одновременных и последовательных назначений сигналов на один и тот же сигнал: Это создает несколько драйверов. VHDL не допускает несколько драйверов сигналов, если они не будут решены (например, ), но даже тогда конфликты опасны. Используйте один драйвер на сигнал.
  • Письменность несинтезируемого кода: Многие конструкции (например, , чтение файлов, с отказом от жесткости) предназначены только для моделирования. Перед нацеливанием на FPGA убедитесь, что ваш код следует рекомендациям по синтезу.

Рекомендуемые инструменты и ресурсы для практики VHDL

Чтобы укрепить свое понимание, вам нужна практическая практика. Следующие инструменты и ресурсы удобны для начинающих:

  • Симуляторы: ModelSim/Questa (отраслевой стандарт, бесплатная версия Intel), GHDL (открытый исходный код), или Active-HDL (студенческое издание).
  • Инструменты поставщика FPGA: Xilinx Vivado, Intel Quartus Prime или Lattice Diamond. Они включают в себя симуляторы и инструменты синтеза.
  • Онлайн-редакторы: EDA Playground позволяет писать, имитировать и совместно использовать код VHDL в браузере без установки чего-либо.
  • Книги: «VHDL by Example» П. П. Чуанга, «Circuit Design with VHDL» Вольнея Педрони и «Fundamentals of Digital Logic with VHDL Design» Стивена Брауна и Звонко Вранешича.
  • Справочная документация: Стандарт IEEE 1076-2008 доступен онлайн, хотя и плотный для начинающих.Страница «Комитет по стандартам автоматизации проектирования» предоставляет бесплатный доступ к справочному руководству по языку.

Начните с небольших комбинационных схем, таких как AND-шлюзы, аддиторы и мультиплексоры, затем перейдите к последовательным схемам: флип-флопс, счетчики, регистры сдвига. Имитация каждого шага и наблюдение за формами волн. После того, как вам удобно, попробуйте реализовать простой UART-передатчик или двоичный счетчик на фактической плате FPGA (например, Terasic DE10-Lite или Digilent Basys 3).

Вывод: следующие шаги в вашем VHDL-путешествии

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

Помните, что VHDL - это дисциплина, которая вознаграждает терпение и методическую практику. Пишите код, моделируйте его, синтезируйте и отлаживайте. Посмотрите на зрителей формы волны, чтобы понять задержки дельты и обновления сигналов. Со временем синтаксис станет второй натурой, и вы начнете мыслить с точки зрения параллельного аппаратного обеспечения, а не последовательного программного обеспечения. Объедините свои навыки VHDL с твердым пониманием цифровой логики (булевая алгебра, карты Карнау, флип-флоп-тайминг), чтобы разблокировать всю мощь современного цифрового дизайна.

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