stringtranslate.com

VHDL

Исходный код VHDL для знакового сумматора

VHDL ( VHSIC Hardware Description Language) — язык описания оборудования , который может моделировать поведение и структуру цифровых систем на нескольких уровнях абстракции, от системного уровня до уровня логических вентилей , для целей ввода проекта, документирования и проверки. Язык был разработан для военной программы США VHSIC в 1980-х годах и был стандартизирован Институтом инженеров по электротехнике и электронике (IEEE) как IEEE Std 1076 ; последняя версия которого — IEEE Std 1076-2019 . Для моделирования аналоговых и смешанных сигнальных систем был разработан стандартизированный IEEE HDL на основе VHDL, называемый VHDL-AMS (официально IEEE 1076.1).

История

В 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_vectorcharacter

Однако проблема, не решенная в этом издании, была «многозначной логикой», где также учитывались сила сигнала (отсутствует, слабый или сильный) и неизвестные значения. Для этого требовался стандарт IEEE 1164 , который определял типы логики с 9 значениями: скалярную std_logicи ее векторную версию std_logic_vector. Будучи разрешенным подтипом своего std_Ulogicродительского типа, std_logic-типизированные сигналы допускают множественное управление для моделирования шинных структур, посредством чего связанная функция разрешения адекватно обрабатывает конфликтующие назначения.

Обновленный стандарт IEEE 1076 , выпущенный в 1993 году, сделал синтаксис более последовательным, обеспечил большую гибкость в именовании, расширил тип, characterчтобы разрешить печатные символы ISO-8859-1 , добавил xnorоператор и т. д. [ указать ]

Незначительные изменения в стандарте (2000 и 2002 гг.) добавили идею защищенных типов (аналогичную концепции класса в C++ ) и сняли некоторые ограничения из правил сопоставления портов.

В дополнение к стандарту IEEE 1164 было введено несколько дочерних стандартов для расширения функциональности языка. Стандарт IEEE 1076.2 добавил лучшую обработку действительных и комплексных типов данных. Стандарт IEEE 1076.3 ввел знаковые и беззнаковые типы для упрощения арифметических операций с векторами. Стандарт IEEE 1076.1 (известный как VHDL-AMS ) предоставил расширения для проектирования аналоговых и смешанных схем.

Некоторые другие стандарты поддерживают более широкое использование VHDL, в частности VITAL (Инициатива VHDL в отношении библиотек ASIC) и расширения проектирования СВЧ- схем.

В июне 2006 года Технический комитет VHDL Accellera (делегированный IEEE для работы над следующим обновлением стандарта) одобрил так называемый Проект 3.0 VHDL-2006. Сохраняя полную совместимость со старыми версиями, этот предлагаемый стандарт предоставляет многочисленные расширения, которые упрощают написание и управление кодом VHDL. Ключевые изменения включают включение дочерних стандартов (1164, 1076.2, 1076.3) в основной стандарт 1076, расширенный набор операторов, более гибкий синтаксис операторов case и generate , включение VHPI (VHDL Procedural Interface) (интерфейс к языкам C/C++) и подмножества PSL ( Property Specification Language ). Эти изменения должны улучшить качество синтезируемого кода VHDL, сделать тестовые стенды более гибкими и разрешить более широкое использование VHDL для описаний на уровне системы.

В феврале 2008 года Accellera одобрила VHDL 4.0, также неофициально известный как VHDL 2008, который решил более 90 проблем, обнаруженных в течение пробного периода для версии 3.0, и включает улучшенные общие типы. В 2008 году Accellera выпустила VHDL 4.0 в IEEE для голосования по включению в 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. all ;        -- это сущность entity ANDGATE is port ( I1 : in std_logic ; I2 : in std_logic ; O : out std_logic ); конец сущности ANDGATE ;                   -- это архитектура RTL архитектуры ANDGATE : начало O < = I1 и I2 ; конец архитектуры RTL ;           

(Обратите внимание, что RTLозначает Register transfer level design.) Хотя приведенный выше пример может показаться многословным для новичков в HDL, многие части либо необязательны, либо должны быть написаны только один раз. Обычно простые функции, подобные этой, являются частью более крупного поведенческого модуля, а не имеют отдельного модуля для чего-то столь простого. Кроме того, использование таких элементов, как тип, std_logicможет на первый взгляд показаться излишним. Можно было бы легко использовать встроенный bitтип и избежать импорта библиотеки в начале. Однако использование формы многозначной логики , в частности 9-значной логики ( U, X, 0, 1, Z, W, H, L, -), вместо простых битов (0,1) предлагает проектировщику очень мощный инструмент моделирования и отладки, которого в настоящее время нет ни в одном другом HDL.

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

Синтезируемые конструкции и шаблоны VHDL

VHDL часто используется для двух различных целей: моделирования электронных конструкций и синтеза таких конструкций. Синтез — это процесс, в котором VHDL компилируется и отображается в технологию реализации, такую ​​как FPGA или ASIC.

Не все конструкции в VHDL подходят для синтеза. Например, большинство конструкций, которые явно имеют дело с синхронизацией, такие как , wait for 10 ns;не синтезируются, несмотря на то, что являются допустимыми для моделирования. Хотя разные инструменты синтеза имеют разные возможности, существует общее синтезируемое подмножество VHDL, которое определяет, какие языковые конструкции и идиомы отображаются в общее оборудование для многих инструментов синтеза. IEEE 1076.6 определяет подмножество языка, которое считается официальным подмножеством синтеза. Обычно считается «лучшей практикой» писать очень идиоматический код для синтеза, поскольку результаты могут быть неверными или неоптимальными для нестандартных конструкций.

Шаблон MUX

Мультиплексор , или «MUX», как его обычно называют, — это простая конструкция , очень распространенная в проектировании оборудования. Пример ниже демонстрирует простой MUX два в один, с входами Aи B, селектором Sи выходом X. Обратите внимание, что существует много других способов выразить тот же MUX в VHDL. [17]

X <= A, когда S = '1', иначе B ;        

Более сложный пример MUX с 4x2 входами и 2-битным селектором:

библиотека IEEE ; использовать IEEE.std_logic_1164. all ; сущность mux4 - это порт ( a1 : in std_logic_vector ( 2 downto 0 ); a2 : in std_logic_vector ( 2 downto 0 ); a3 : in std_logic_vector ( 2 downto 0 ); a4 : in std_logic_vector ( 2 downto 0 ); sel : in std_logic_vector ( 1 downto 0 ); b : out std_logic_vector ( 2 downto 0 ) ); end mux4 ; архитектура rtl mux4 - это -- декларативная часть: пустая begin p_mux : process ( a1 , a2 , a3 , a4 , sel ) begin case sel is when "00" => b < = a1 ; когда "01" => b <= a2 ; когда "10" => b <= a3 ; когда другие => b <= a4 ; конец случая ; конец процесса p_mux ; конец rtl ;                                                                                         

Шаблон защелки

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

-- шаблон защелки 1: Q <= D когда Enable = '1' иначе Q ;        -- шаблон защелки 2: процесс ( все ) начало Q <= D когда ( Включить ); конец процесса ;     

Триггеры D-типа

Триггер типа D производит выборку входящего сигнала на переднем (или заднем) фронте тактового сигнала. Этот пример имеет асинхронный, активно-высокий сброс и выборку на переднем фронте тактового сигнала.

DFF : процесс ( все ) начинается , если RST , то Q <= '0' ; elsif rising_edge ( CLK ) , то Q <= D ; конец , если ; конец процесса DFF ;                   

Другой распространенный способ записи поведения, запускаемого фронтом, в VHDL — с помощью атрибута сигнала 'event'. Между именем сигнала и именем атрибута необходимо написать один апостроф.

DFF : процесс ( RST , CLK ) начинается , если RST , то Q <= '0' ; иначе, если CLK 'событие и CLK = '1' , то Q <= D ; конец, если ; конец процесса DFF ;                        

VHDL также подходит для «однострочных» выражений, таких как

DFF : Q <= '0', когда RST = '1', иначе D при rising_edge ( clk );            

или

DFF : процесс ( все ) начинается , если rising_edge ( CLK ) then Q <= D ; конец, если ; если RST then 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 следующее: begin process ( Clk ) begin if ( rising_edge ( Clk )) then if ( sync_reset = '1' ) then Q <= '0' ; else Q < = D ; end if ; end if ; end process ; end Поведенческие ;                                

Что может быть полезно, если не все сигналы (регистры), управляемые этим процессом, должны быть сброшены.

Пример: счетчик

Следующий пример — счетчик с асинхронным сбросом, параллельной загрузкой и настраиваемой шириной. Он демонстрирует использование типа 'unsigned', преобразование типов между 'unsigned' и 'std_logic_vector' и универсальные типы VHDL . Универсальные типы очень близки к аргументам или шаблонам в других традиционных языках программирования, таких как C++. Пример на языке VHDL 2008.

библиотека IEEE ; использовать IEEE.std_logic_1164. all ; использовать IEEE.numeric_std. all ; -- для беззнакового типа    сущность COUNTER является общей ( WIDTH : in natural := 32 ); порт ( RST : in std_logic ; CLK : in std_logic ; LOAD : in std_logic ; DATA : in std_logic_vector ( WIDTH - 1 downto 0 ); Q : буфер std_logic_vector ( WIDTH - 1 downto 0 )); конец сущности COUNTER ;                                      Архитектура RTL COUNTER - это    начинать процесс ( все ) начинается , если RST , то Q <= ( другие => '0' ); elsif rising_edge ( CLK ) тогда , если LOAD = '1' , то Q <= DATA ; иначе Q <= std_logic_vector ( unsigned ( 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 in 1 to 10 loop -- записываем числа от 1 до 10 в DATA, 1 каждый цикл DATA <= to_unsigned ( i , 8 ); ждем , пока rising_edge ( CLK ); конец цикла ;                 -- ждем, пока не изменится выход, ждем RESULT ; -- теперь поднимаем ACK на период синхронизации ACK <= '1' ; ждем , пока rising_edge ( CLK ); ACK <= '0' ;               -- и так далее... завершение процесса ; 

Особенности VHDL-2008

Иерархические псевдонимы

библиотека ieee ; использовать ieee.std_logic_1164. все ;  сущность bfm - конечная сущность ; архитектура beh bfm - сигнал en : std_logic ; начало - вставить реализацию здесь конец архитектуры ;             // ------------------------------------------ библиотека ieee ; использовать ieee.std_logic_1164. all ;  сущность test1 является конечной сущностью ; архитектура beh test1 является начальной         ibfm : entity work . bfm ; -- Псевдоним процесса тестового стенда probe_en равен << signal . test1 . ibfm . en : std_logic >> ; begin probe_en <= '1' ; wait for 100 ns ; probe_en <= '0' ; wait for 100 ns ; probe_en <= '1' ; wait for 100 ns ; std.env . stop ( 0 ); end process ; end architecture ;                                     

Стандартные библиотеки

Также называются стандартными пакетами.

Стандартный пакет IEEE

Стандартный пакет IEEE включает в себя следующее: [18]

Симуляторы VHDL

Коммерческий:

Другой:

Смотрите также

Ссылки

  1. ^ Дэвид Р. Коэльо (30 июня 1989 г.). Справочник VHDL. Springer Science & Business Media. ISBN 978-0-7923-9031-2.
  2. ^ Министерство обороны (1992). Военный стандарт, Стандартные общие требования к электронному оборудованию . Получено 15 ноября 2017 г.
  3. ^ ab 1076-1987 – Справочное руководство по стандарту языка VHDL IEEE . 1988. doi :10.1109/IEEESTD.1988.122645. ISBN 0-7381-4324-3.
  4. ^ 1076-2008 – Справочное руководство по стандарту IEEE VHDL Language . 2009. doi :10.1109/IEEESTD.2009.4772740. ISBN 978-0-7381-6854-8.
  5. ^ Рабочая группа IEEE P1076 Группа анализа и стандартизации VHDL (VASG)
  6. ^ 1076-1993 – Справочное руководство по стандарту языка VHDL IEEE . 1994. doi :10.1109/IEEESTD.1994.121433. ISBN 0-7381-0986-X.
  7. ^ 1076-2000 – Справочное руководство по стандарту IEEE VHDL Language . 2000. doi :10.1109/IEEESTD.2000.92297. ISBN 0-7381-1948-2.
  8. ^ 1076-2002 – Справочное руководство по стандарту IEEE VHDL Language . 2002. doi :10.1109/IEEESTD.2002.93614. ISBN 0-7381-3247-0.
  9. ^ IEC 61691-1-1 Первое издание 2004-10; IEEE 1076 — IEC/IEEE Behavioural Languages ​​– Часть 1-1: Справочное руководство по языку VHDL (Принятие стандарта IEEE 1076-2002) . 2004. doi :10.1109/IEEESTD.2004.95752. ISBN 2-8318-7691-5.
  10. ^ 1076c-2007 – Справочное руководство по стандарту IEEE VHDL Language, поправка 1: Интерфейс приложений процедурного языка . 2007. doi :10.1109/IEEESTD.2007.4299594. ISBN 978-0-7381-5523-4.
  11. ^ 61691-1-1-2011 — Поведенческие языки – Часть 1-1: Справочное руководство по языку VHDL . 2011. doi :10.1109/IEEESTD.2011.5967868. ISBN 978-0-7381-6605-6.
  12. ^ «IEEE 1076.6-2004 — Стандарт IEEE для синтеза уровня передачи регистров VHDL (RTL)».
  13. ^ "ELEC3017 - Моделирование" (PDF) . Университет Саутгемптона. Архивировано (PDF) из оригинала 2017-02-23 . Получено 23 февраля 2017 .
  14. ^ "Почему меня должны волновать прозрачные защелки?". Doulos . Получено 22 декабря 2012 г.
  15. ^ "Clock Generation". Doulos . Получено 22 декабря 2012 г.
  16. ^ Иржи Гайслер. "Метод структурированного проектирования VHDL" (PDF) . Архивировано (PDF) из оригинала 2022-10-10 . Получено 15 ноября 2017 .
  17. ^ "VHDL Logical Operators and Signal Assignments for Combinatoric Logic". FPGAtutorial . 16 мая 2020 г. Получено 23 августа 2020 г.
  18. ^ Кьюзано, Сильвия (5 апреля 2011 г.). "Типы данных и операторы VHDL, доступные в стандартных пакетах IEEE" (PDF) . Политехнический университет Турина . Архивировано (PDF) из оригинала 2022-10-10.
  19. ^ "VCS: самое высокопроизводительное в отрасли решение для моделирования". synopsis.com .
  20. ^ "Авторские права | Лицензии". Документация GHDL -- Документация GHDL 0.36-dev . readthedocs.io.
  21. ^ Гассон, Ник (5 ноября 2011 г.). «Написание компилятора VHDL».
  22. ^ Гассон, Ник (22 июля 2023 г.). "NVC - VHDL Compiler and Simulator" . Получено 23 июля 2023 г. .
  23. ^ "freehdl: By Thread". Архивировано из оригинала 10 февраля 2002 г.
Примечания

Дальнейшее чтение

Внешние ссылки