Понимание основ 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 станет трамплином в продвинутые темы, такие как трубопроводное производство, высокоскоростные интерфейсы и дизайн системы на чипе.