Язык описания оборудования VHSIC ( VHDL ) — это язык описания аппаратного обеспечения (HDL), который может моделировать поведение и структуру цифровых систем на нескольких уровнях абстракции , начиная от уровня системы и заканчивая уровнем логических элементов , для ввода проекта, документации, и целей проверки. С 1987 года VHDL стандартизирован Институтом инженеров по электротехнике и электронике (IEEE) как IEEE Std 1076 ; последней версией которого является IEEE Std 1076-2019 . Для моделирования аналоговых систем и систем смешанных сигналов был разработан стандартизированный IEEE HDL на основе VHDL под названием VHDL-AMS (официально IEEE 1076.1).
VHDL назван в честь программы Министерства обороны США , которая его создала, — Программы сверхвысокоскоростных интегральных схем (VHSIC). В начале 1980-х годов программа VHSIC искала новый HDL для использования при проектировании интегральных схем, которые она намеревалась разработать. Результатом этих усилий стала версия VHDL 7.2, выпущенная в 1985 году. Попытки стандартизировать ее как стандарт IEEE начались в следующем году.
В 1983 году VHDL был первоначально разработан по указанию Министерства обороны США для документирования поведения ASIC , которые компании-поставщики включали в оборудование. Стандарт MIL-STD-454N [2] в Требовании 64 раздела 4.5.1 «Документация ASIC в VHDL» явно требует документации «Микроэлектронных устройств» в VHDL.
Идея моделирования ASIC на основе информации, содержащейся в этой документации, была настолько привлекательна, что были разработаны логические симуляторы , способные читать файлы VHDL. Следующим шагом стала разработка инструментов логического синтеза , которые считывают VHDL и выдают определение физической реализации схемы.
Поскольку Министерство обороны требует, чтобы как можно большая часть синтаксиса была основана на Ada, чтобы избежать повторного изобретения концепций, которые уже были тщательно проверены при разработке Ada, VHDL в значительной степени заимствован из Ada . язык программирования как в концепции, так и в синтаксисе .
Первоначальная версия VHDL, разработанная в соответствии со стандартом IEEE IEEE 1076-1987, [3] включала широкий диапазон типов данных, включая числовые ( целочисленные и вещественные ) , логические ( битовые и логические ), символьные и временные , а также массивы вызываемых bit
и bit_vector
вызываемой строки . character
_
Однако проблема, не решенная в этом издании, заключалась в «многозначной логике», где также учитываются сила сигнала (нет, слабый или сильный) и неизвестные значения. Для этого потребовался стандарт IEEE 1164 , который определял 9-значные типы логики: скалярную std_logic
и ее векторную версию std_logic_vector
. Будучи разрешенным подтипом своего std_Ulogic
родительского типа, std_logic
-типизированные сигналы допускают многократное управление для моделирования структур шины, в результате чего функция связанного разрешения адекватно обрабатывает конфликтующие назначения.
Обновленный стандарт IEEE 1076 в 1993 году сделал синтаксис более согласованным, обеспечил большую гибкость в именовании, расширил тип, character
чтобы разрешить печатные символы ISO-8859-1xnor
, добавил оператор и т. д. [ укажите ]
Незначительные изменения в стандарте (2000 и 2002 гг.) добавили идею защищенных типов (аналогично концепции класса в C++ ) и удалили некоторые ограничения из правил сопоставления портов.
Помимо стандарта IEEE 1164, было введено несколько дочерних стандартов для расширения функциональности языка. В стандарте IEEE 1076.2 улучшена обработка реальных и сложных типов данных. Стандарт IEEE 1076.3 ввел знаковые и беззнаковые типы для облегчения арифметических операций с векторами. Стандарт IEEE 1076.1 (известный как VHDL-AMS ) предоставил расширения для проектирования аналоговых схем и схем смешанных сигналов.
Некоторые другие стандарты поддерживают более широкое использование VHDL, в частности VITAL (VHDL Initiative Towards ASIC Libraries) и расширения проектирования микроволновых схем.
В июне 2006 года Технический комитет VHDL компании Accellera (командированный IEEE для работы над следующим обновлением стандарта) утвердил так называемый проект 3.0 VHDL-2006. При сохранении полной совместимости со старыми версиями предлагаемый стандарт предоставляет многочисленные расширения, которые упрощают написание кода VHDL и управление им. Ключевые изменения включают включение дочерних стандартов (1164, 1076.2, 1076.3) в основной стандарт 1076, расширенный набор операторов, более гибкий синтаксис операторов регистра и генерации , включение VHPI (процедурный интерфейс VHDL) (интерфейс к языкам C/C++). ) и подмножество PSL ( язык спецификации свойств ). Эти изменения должны улучшить качество синтезируемого кода VHDL, сделать тестовые стенды более гибкими и позволить более широко использовать VHDL для описаний на уровне системы.
В феврале 2008 года Accellera утвердила VHDL 4.0, также неофициально известный как VHDL 2008, который устраняет более 90 проблем, обнаруженных во время пробного периода версии 3.0, и включает расширенные универсальные типы. В 2008 году Accellera представила IEEE VHDL 4.0 для голосования за включение в IEEE 1076-2008. Стандарт VHDL IEEE 1076-2008 [4] был опубликован в январе 2009 года.
Стандарт IEEE 1076 определяет язык описания оборудования VHSIC или VHDL. Первоначально он был разработан в рамках контракта F33615-83-C-1003 с ВВС США , заключенного в 1983 году с командой Intermetrics, Inc. в качестве языковых экспертов и генерального подрядчика, Texas Instruments в качестве экспертов по проектированию микросхем и IBM в качестве разработчиков компьютерных систем. эксперты. Язык претерпел многочисленные изменения и имеет множество связанных с ним подстандартов, которые существенно дополняют или расширяют его.
1076 был и остается важной вехой в разработке электронных систем. [5]
VHDL обычно используется для написания текстовых моделей, описывающих логическую схему. Такая модель обрабатывается программой синтеза только в том случае, если она является частью логического проекта. Программа моделирования используется для тестирования логического проекта с использованием имитационных моделей для представления логических схем, которые взаимодействуют с проектом. Эту коллекцию имитационных моделей обычно называют испытательным стендом .
Симулятор VHDL обычно представляет собой симулятор, управляемый событиями. [13] Это означает, что каждая транзакция добавляется в очередь событий на определенное запланированное время. Например, если назначение сигнала должно произойти через 1 наносекунду, событие добавляется в очередь на время +1 нс. Нулевая задержка также допускается, но ее все равно необходимо запланировать: для этих случаев используется дельта-задержка , которая представляет собой бесконечно малый шаг по времени. Моделирование переключается между двумя режимами: выполнение операторов, при котором оцениваются запущенные операторы, и обработка событий, при которых обрабатываются события в очереди.
В VHDL есть конструкции для управления параллелизмом, свойственным аппаратным проектам, но эти конструкции ( процессы ) отличаются по синтаксису от параллельных конструкций в Ada ( задач ). Как и Ada, VHDL строго типизирован и не чувствителен к регистру . Для непосредственного представления операций, распространенных в аппаратном обеспечении, существует множество функций VHDL, которых нет в Ada, например расширенный набор логических операторов, включая nand и nor .
VHDL имеет возможности ввода и вывода файлов и может использоваться в качестве языка общего назначения для обработки текста, но файлы чаще используются испытательными стендами для моделирования для стимулов или проверочных данных. Существуют некоторые компиляторы VHDL, которые создают исполняемые двоичные файлы. В этом случае можно было бы использовать VHDL для написания тестового стенда для проверки функциональности конструкции с использованием файлов на главном компьютере для определения стимулов, взаимодействия с пользователем и сравнения результатов с ожидаемыми. Однако большинство дизайнеров оставляют эту работу симулятору.
Неопытному разработчику относительно легко создать код, который успешно моделируется, но не может быть синтезирован в реальном устройстве или слишком велик, чтобы его можно было использовать на практике. Особой ловушкой является случайное использование в качестве элементов хранения прозрачных защелок , а не триггеров D-типа . [14]
Можно спроектировать аппаратное обеспечение в VHDL IDE (для реализации FPGA, такой как Xilinx ISE, Altera Quartus, Synopsys Synplify или Mentor Graphics HDL Designer) для создания схемы RTL нужной схемы. После этого созданную схему можно проверить с помощью программного обеспечения для моделирования, которое показывает формы входных и выходных сигналов схемы после создания соответствующего испытательного стенда. Чтобы создать подходящий испытательный стенд для конкретной схемы или кода VHDL, необходимо правильно определить входные данные. Например, для ввода тактового сигнала требуется циклический процесс или итеративный оператор. [15]
И последний момент: когда модель VHDL преобразуется в «вентили и провода», которые отображаются на программируемом логическом устройстве, таком как CPLD или FPGA , тогда настраивается фактическое оборудование, а не «исполняется» код VHDL. «как будто на каком-то процессорном чипе.
Ключевое преимущество VHDL при использовании для проектирования систем заключается в том, что он позволяет описывать (моделировать) и проверять (моделировать) поведение требуемой системы до того, как инструменты синтеза преобразуют проект в реальное оборудование (вентили и провода).
Еще одним преимуществом является то, что VHDL позволяет описывать параллельную систему . VHDL — это язык потоков данных , в котором каждый оператор рассматривается для одновременного выполнения, в отличие от процедурных языков вычислений, таких как BASIC, C и ассемблерный код, где последовательность операторов выполняется последовательно, по одной инструкции за раз.
Проект VHDL является многоцелевым. Будучи созданным один раз, расчетный блок может использоваться во многих других проектах. Однако многие формационные и функциональные параметры блока могут быть настроены (параметры емкости, объем памяти, элементная база, состав блоков и структура взаимосвязей).
Проект VHDL является переносимым. Будучи созданным для одной элементной базы, проект вычислительного устройства может быть портирован на другую элементную базу, например СБИС с различными технологиями.
Большим преимуществом VHDL по сравнению с оригинальным Verilog является то, что VHDL имеет систему полного типа . Дизайнеры могут использовать систему типов для написания гораздо более структурированного кода (особенно путем объявления типов записей ). [16]
В VHDL проект состоит как минимум из объекта , описывающего интерфейс, и архитектуры , содержащей фактическую реализацию. Кроме того, большинство проектов импортируют библиотечные модули. Некоторые проекты также содержат несколько архитектур и конфигураций .
Простой логический элемент И в VHDL будет выглядеть примерно так:
-- (это комментарий VHDL) / * это комментарий блока ( VHDL - 2008 ) */ -- импортируем std_logic из библиотеки IEEE Library IEEE ; используйте IEEE.std_logic_1164. все ; -- это сущность сущности ANDGATE - это порт ( I1 : в std_logic ; I2 : в std_logic ; O : вне std_logic ); конечный объект ANDGATE ; -- это архитектура RTL ANDGATE : начало O < = I1 и I2 ; конечная архитектура RTL ;
(Обратите внимание, что это RTL
означает проектирование уровня передачи регистров .) Хотя приведенный выше пример может показаться многословным новичкам в HDL, многие его части либо необязательны, либо их нужно написать только один раз. Обычно такие простые функции являются частью более крупного поведенческого модуля, а не имеют отдельный модуль для чего-то столь простого. Кроме того, использование таких элементов, как std_logic
тип, на первый взгляд может показаться излишним. Можно легко использовать встроенный bit
тип и избежать импорта библиотеки вначале. Однако использование формы многозначной логики , в частности 9-значной логики ( U
, X
, 0
, 1
, Z
, W
, H
, L
, -
), вместо простых битов (0,1), предлагает разработчику очень мощный инструмент моделирования и отладки, который в настоящее время позволяет не существует ни в одном другом ЛПВП.
В следующих примерах вы увидите, что код VHDL можно записать в очень компактной форме. Однако более опытные дизайнеры обычно избегают этих компактных форм и используют более подробный стиль кодирования ради удобства чтения и сопровождения.
VHDL часто используется для двух разных целей: моделирования электронных конструкций и синтеза таких конструкций. Синтез — это процесс, в котором VHDL компилируется и отображается в технологию реализации, такую как FPGA или ASIC.
Не все конструкции VHDL подходят для синтеза. Например, большинство конструкций, которые явно связаны со временем, например, wait for 10 ns;
не поддаются синтезу, несмотря на то, что они действительны для моделирования. Хотя разные инструменты синтеза имеют разные возможности, существует общее синтезируемое подмножество VHDL, которое определяет, какие языковые конструкции и идиомы отображаются в общее оборудование для многих инструментов синтеза. IEEE 1076.6 определяет подмножество языка, которое считается официальным подмножеством синтеза. Обычно считается «лучшей практикой» писать очень идиоматический код для синтеза, поскольку результаты могут быть неправильными или неоптимальными для нестандартных конструкций.
Мультиплексор , или «MUX», как его обычно называют, представляет собой простую конструкцию, очень распространенную при проектировании аппаратного обеспечения. В приведенном ниже примере показан простой мультиплексор «два к одному» со входами A
и B
, селектором S
и выходом X
. Обратите внимание, что существует множество других способов выразить тот же MUX на VHDL. [17]
X <= A , когда S = '1' else B ;
Более сложный пример мультиплексора с входами 4x2 и 2-битным селектором:
библиотека IEEE ; используйте IEEE.std_logic_1164. все ; объектный мультиплексор4 — это порт ( a1 : в std_logic_vector ( от 2 до 0 ); a2 : в std_logic_vector ( от 2 до 0 ); a3 : в std_logic_vector ( от 2 до 0 ); a4 : в std_logic_vector ( от 2 до 0 ); sel : в std_logic_vector ( 1 до 0 ); b : out std_logic_vector ( 2 до 0 ) ); конец мультиплексора4 ; архитектура rtl mux4 - декларативная часть: пусто начало p_mux : процесс ( a1 , a2 , a3 , a4 , sel ) начало случая sel - это When "00" => b <= a1 ; когда «01» => b <= a2 ; когда «10» => b <= a3 ; когда другие => b <= a4 ; конец дела ; завершить процесс p_mux ; конец ртл ;
Прозрачная защелка — это, по сути, один бит памяти, который обновляется при подаче сигнала разрешения. Опять же, есть много других способов выразить это на VHDL.
-- шаблон фиксации 1: Q <= D if Enable = '1' else Q ; -- шаблон блокировки 2: процесс ( все ) начинается Q <= D , когда ( Включить ); завершить процесс ;
Триггер D-типа производит выборку входящего сигнала по нарастающему (или падающему) фронту тактового сигнала. В этом примере имеется асинхронный сброс с активным высоким уровнем и выборка по нарастающему фронту тактовой частоты.
DFF : процесс ( все ) начинается , если RST , то Q <= '0' ; elsif Rising_edge ( CLK ), затем Q <= D ; конец, если ; завершить процесс DFF ;
Другой распространенный способ записи поведения, запускаемого по фронту, в VHDL — использование атрибута сигнала «событие». Между именем сигнала и именем атрибута должен быть написан один апостроф.
DFF : процесс ( RST , CLK ) начинается , если RST , то Q <= '0' ; elsif CLK 'event и CLK = '1' then Q <= D ; конец , если ; завершить процесс DFF ;
VHDL также подходит для «острых строк», таких как
DFF : Q <= '0' , когда RST = '1' , иначе D , когда нарастающий_фронт ( clk );
или
DFF : процесс ( все ) начинается , если нарастающий_фронт ( CLK ), затем Q <= D ; конец, если ; если RST , то Q <= '0' ; конец, если ; завершить процесс DFF ;
или:
библиотека IEEE ; ИСПОЛЬЗУЙТЕ IEEE.Std_logic_1164. все ; сущность RisingEdge_DFlipFlop_SyncReset — это порт ( Q : out std_logic ; Clk : in std_logic ; sync_reset : in std_logic ; D : in std_logic ); конец RisingEdge_DFlipFlop_SyncReset ; Архитектура Поведение RisingEdge_DFlipFlop_SyncReset — начало процесса ( Clk ) Begin if ( rising_edge ( Clk )) then if ( sync_reset = ' 1' ) then Q <= '0' ; иначе Q <= D ; конец , если ; конец , если ; завершить процесс ; конец Поведенческий ;
Это может быть полезно, если не все сигналы (регистры), управляемые этим процессом, должны быть сброшены.
Следующий пример представляет собой повышающий счетчик с асинхронным сбросом, параллельной загрузкой и настраиваемой шириной. Он демонстрирует использование типа unsigned, преобразования типов между unsigned и std_logic_vector, а также дженерики VHDL . Обобщенные шаблоны очень близки к аргументам или шаблонам в других традиционных языках программирования, таких как C++. Пример приведен на языке VHDL 2008.
библиотека IEEE ; используйте IEEE.std_logic_1164. все ; используйте IEEE.numeric_std. все ; -- для беззнакового типа объект COUNTER является универсальным ( WIDTH : в натуральном виде := 32 ); порт ( RST : в std_logic ; CLK : в std_logic ; LOAD : в std_logic ; DATA : в std_logic_vector ( WIDTH - 1 до 0 ); Q : out std_logic_vector ( WIDTH - 1 до 0 )); конечный объект COUNTER ; архитектура RTL COUNTER - это начинать процесс ( все ) начинается , если RST , то Q <= ( others => '0' ) ; elsifising_edge ( CLK ) , то если LOAD = '1' , то Q <= DATA ; иначе Q <= std_logic_vector ( беззнаковый ( Q ) + 1 ); конец , если ; конец, если ; завершить процесс ; конечная архитектура RTL ;
В более сложные счетчики могут добавляться операторы if/then/else для rising_edge(CLK) elsif
добавления других функций, таких как разрешение счетчика, остановка или пролонгация при определенном значении счетчика, генерация выходных сигналов, таких как сигналы счетчика терминалов, и т. д. Необходимо соблюдать осторожность при упорядочивании и вложение таких элементов управления, если они используются вместе, для создания желаемых приоритетов и минимизации количества необходимых логических уровней.
Большую часть VHDL невозможно преобразовать в аппаратное обеспечение. Это подмножество известно как несинтезируемое или предназначенное только для моделирования подмножество VHDL и может использоваться только для прототипирования, моделирования и отладки. Например, следующий код сгенерирует тактовый сигнал с частотой 50 МГц. Его можно, например, использовать для управления тактовым входом в проекте во время моделирования. Однако это конструкция, предназначенная только для моделирования, и ее нельзя реализовать аппаратно. В реальном оборудовании часы генерируются извне; его можно уменьшить внутренне с помощью пользовательской логики или специального оборудования.
начало процесса CLK <= '1' ; подождите 10 нс ; _ CLK <= '0' ; подождите 10 нс ; _ завершить процесс ;
Конструкции, предназначенные только для моделирования, можно использовать для построения сигналов сложной формы за очень короткое время. Подобную форму сигнала можно использовать, например, в качестве тестовых векторов для сложной конструкции или в качестве прототипа некоторой логики синтезатора, которая будет реализована в будущем.
начало процесса , ожидание START = '1' ; -- дождитесь, пока START не станет высоким для i в цикле от 1 до 10 -- затем подождите несколько периодов такта... подождите, пока Rising_edge ( CLK ); конец цикла ; for i в цикле от 1 до 10 — записываем числа от 1 до 10 в DATA, 1 в каждом цикле DATA <= to_unsigned ( i , 8 ); дождаться повышения_границы ( CLK ) ; конец цикла ; -- дождаться изменения вывода wait on RESULT ; -- теперь повышаем ACK для тактового периода ACK <= '1' ; дождаться повышения_границы ( CLK ) ; ПОДТВЕРЖДЕНИЕ <= '0' ; -- и так далее... завершить процесс ;
библиотека ieee ; используйте ieee.std_logic_1164. все ; сущность bfm — конечная сущность ; архитектура bfm — это сигнал en : std_logic ; _ начало - вставьте сюда реализацию конец архитектуры ; // ------------------------------------------ библиотека ieee ; используйте ieee.std_logic_1164. все ; объект test1 — конечный объект ; Архитектура теста test1 начинается _ _ ibfm : сущность работает . бфм ; -- Псевдоним процесса testbench Probe_en равен << signal . тест1 . ИБФМ . ru : std_logic >> ; начать зонд_ен <= '1' ; подождите 100 нс ; _ зонд_ен <= '0' ; подождите 100 нс ; _ зонд_en <= '1' ; подождите 100 нс ; _ std.env . стоп ( 0 ); завершить процесс ; конечная архитектура ;
Также называются стандартными пакетами.
Стандартный пакет IEEE включает следующее: [18]
Коммерческий:
Другой:
{{cite journal}}
: Требуется цитировать журнал |journal=
( помощь ){{cite journal}}
: Требуется цитировать журнал |journal=
( помощь )