48
V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language) Стандарт VHDL-87, Стандарт VHDL-93, Стандарт VHDL-AMS Язык VHDL используется для: - описания поведения цифровых устройств во времени и при изменении входных воздействий; - описания структуры цифровых устройств с различной степенью детализации (на системном и блочном уровнях, на уровне регистровых передач, на уровне вентилей); - моделирования цифровых устройств; - описания тестовых воздействий при моделировании устройств; - автоматизации преобразования исходного описания схемы в описание на более низком уровне (вплоть до вентильного уровня). Стили описания: - поведенческий стиль , при котором для описания проекта используются причинно-следственные связи между событиями на входах устройства и событиями на его выходах (без уточнения структуры); - структурный стиль описания , при котором устройство представляется в виде иерархии взаимосвязанных простых устройств (подобно стилю, принятому в схемотехнике); - потоковый стиль описания устройства основан на использовании логических уравнений, каждое из которых преобразует один или несколько входных информационных потоков в выходные потоки. 1

V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

  • Upload
    others

  • View
    38

  • Download
    0

Embed Size (px)

Citation preview

Page 1: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Стандарт VHDL-87, Стандарт VHDL-93, Стандарт VHDL-AMS

Язык VHDL используется для:- описания поведения цифровых устройств во времени и при изменении

входных воздействий;- описания структуры цифровых устройств с различной степенью детализации

(на системном и блочном уровнях, на уровне регистровых передач, на уровне вентилей);

- моделирования цифровых устройств;- описания тестовых воздействий при моделировании устройств;- автоматизации преобразования исходного описания схемы в описание на

более низком уровне (вплоть до вентильного уровня).

Стили описания: - поведенческий стиль, при котором для описания проекта используются

причинно-следственные связи между событиями на входах устройства и событиями на его выходах (без уточнения структуры);

- структурный стиль описания, при котором устройство представляется в виде иерархии взаимосвязанных простых устройств (подобно стилю, принятому в схемотехнике);

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

Page 2: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Объекты VHDL и их типы

<Тип>::= <Тип>::= TYPETYPE <Идентификатор> <Идентификатор> ISIS <Описание типа> ; <Описание типа> ;<Подтип>::= <Подтип>::= SUBTYPESUBTYPE <Идентификатор> <Идентификатор> ISIS <Описание подтипа> ; <Описание подтипа> ;

TYPETYPE Multi_Level_Logic Multi_Level_Logic ISIS (LOW, HIGH, RISING, FALLING, AMBIGUOUS); (LOW, HIGH, RISING, FALLING, AMBIGUOUS);TYPETYPE BIT BIT ISIS ('0','1') ; ('0','1') ;TYPETYPE BYTE_LENGTH_INTEGER BYTE_LENGTH_INTEGER ISIS RANGERANGE 0 TO 255; 0 TO 255;TYPETYPE WORD_INDEX IS WORD_INDEX IS RANGERANGE 31 31 DOWNTODOWNTO 0; 0;SUBTYPESUBTYPE HIGH_BIT_LOW HIGH_BIT_LOW ISIS BYTE_LENGTH_INTEGER BYTE_LENGTH_INTEGER RANGERANGE 0 0 TOTO 127; 127;TYPETYPE MY_WORD MY_WORD ISIS ARRAY (0 ARRAY (0 TOTO 31) 31) OFOF BIT ; BIT ;TYPETYPE STATE_TYPE STATE_TYPE ISIS (s0,s1,s2,s3); (s0,s1,s2,s3);

Объекты могут относится к следующим категориям: •константы; •сигналы; •переменные; •файлы.

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

Упрощенный синтаксис описания типа и подтипа:

2

Page 3: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Базовые типы данных, описанные в библиотеке STANDARD (автоматически подключается для всех проектов во всех САПР)

Тип Значения/Диапазон

Перечислимые типы

BOOLEAN TRUE,FALSE

BIT ‘0’,’1’

BIT_VECTOR Массив элементов BIT с индексами от 0 до +2147483647

SEVERITY_LEVEL NOTE, WARNING, ERROR, FAILURE

FILE_OPEN_KIND READ_MODE, WRITE_MODE, APPEND_MODE

FILE_OPEN_STATUS OPEN_OK, STATUS_ERROR, NAME_ERROR, MODE_ERROR

Целочисленные типы

INTEGER –2147483647 … +2147483647

POSITIV 1…… +2147483647

NATURAL 0…… +2147483647

Типы чисел с плавающей запятой

REAL –1.0E38 … +1.0E38

Символьные типы

CHARACTER Nul,..,’0’,…,’9’,’@’,’:’,’;’,…,’A’,…’Z’,’a’,…,’z’,DEL

STRING Массив элементов CHARACTER с индексами от 1 до +2147483647

Физические типы

TIME –2147483647 … +2147483647

DELAY_LENGTH 0…+21474836473

Page 4: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Объявление атрибута:

<Объявление Атрибута> ::=<Объявление Атрибута> ::=ATTRIBUTEATTRIBUTE <Идентификатор>: <Тип>; <Идентификатор>: <Тип>;

Спецификация атрибута:

<Спецификация атрибута> ::=<Спецификация атрибута> ::=ATTRIBUTEATTRIBUTE <Идентификатор<Идентификатор>> of of <Описание> : <Класс<Описание> : <Класс>> ISIS <Выражение>; <Выражение>;<Описание> ::=<Описание> ::= < <ИмяИмя> [ { , <> [ { , <ИмяИмя> } ] | > } ] | OTHERSOTHERS | | ALLALL<<КлассКласс> ::= > ::= ENTITYENTITY | | ARCHITECTUREARCHITECTURE | | CONFIGURATIONCONFIGURATION| | PROCEDUREPROCEDURE | | FUNCTIONFUNCTION | | PACKAGEPACKAGE| | TYPETYPE | | SUBTYPESUBTYPE | | CONSTANTCONSTANT| | SIGNALSIGNAL | | VARIABLEVARIABLE | | COMPONENTCOMPONENT| | LABELLABEL | | LITERALLITERAL | | UNITSUNITS| | GROUPGROUP | | FILEFILE<Имя> ::= <Имя> ::= <<Таг> [ <СигнатураТаг> [ <Сигнатура>> ] ]<Таг> ::= <Идентификатор> | <Символьный литера> | <Символ оператора><Таг> ::= <Идентификатор> | <Символьный литера> | <Символ оператора>

ATTRIBUTEATTRIBUTE state state__vectorvector : : stringstring;; ATTRIBUTEATTRIBUTE state_vector state_vector OFOF fsm : fsm : ARCHITECTUREARCHITECTURE ISIS "current_state"; "current_state";

АтрибутыАтрибуты

4

Page 5: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Константы и сигналы Константы и сигналы

<Константа> ::=CONSTANTCONSTANT <Список идентификаторов> : <Тип> [ := <Выражение> ]<Список идентификаторов> : <Тип> [ := <Выражение> ]

CONSTANT ACONSTANT A: : TIME TIME := 30:= 30nsns;;

Сигналы – это объекты, обладающие историей изменения (прошлым состоянием и текущим состоянием)

<Сигнал> ::=<Сигнал> ::=SIGNALSIGNAL <Список идентификаторов> : <Тип> [ <Вид> ] [ := <Выражение> ] ; <Список идентификаторов> : <Тип> [ <Вид> ] [ := <Выражение> ] ;<Вид сигнала> ::= <Вид сигнала> ::= REGISTERREGISTER | | BUSBUS

Для каждого сигнала предопределены следующие атрибуты, поддерживаемые программами синтеза (на примере сигнала s):

- s’stable[(T)] – атрибут равен значению true, если за время T сигнал не изменял своего состояния.

- s’transaction – атрибут типа bit, изменяющий состояние на противоположное при каждом присваивании нового значения сигналу s.

- s’event – атрибут, равный true, если в данном цикле моделирования произошло изменение сигнала s.

- s’active – атрибут равен true, если в данном цикле моделирования произошло присваивание нового значения сигналу s.

- s’last_value - атрибут, равный сигналу s до момента его последнего изменения.5

Page 6: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Пример декларации и инициализации сигнала:

SIGNALSIGNAL B B:: BIT_VECTORBIT_VECTOR(3(3 DOWNTO DOWNTO 0):=”0000”; 0):=”0000”;

Пример присвоения значения сигналу:

BB<=”0001”;<=”0001”;

Пример использования атрибутов сигнала:

IFIF CLK’ CLK’eventevent ANDAND CLK=’1’ CLK=’1’ THENTHEN BB<=<=DD; --Изменить значение по фронту синхросигнала; --Изменить значение по фронту синхросигналаENDEND IFIF;;

ПеременныеПеременные

<<ППеременная> ::=еременная> ::=[ [ SHAREDSHARED ] ] VARIABLEVARIABLE <Список идентификаторов> : <Тип> [ := <Выражение> ] ; <Список идентификаторов> : <Тип> [ := <Выражение> ] ;

Пример декларации переменной:

VARIABLE C: INTEGER := 100;

Пример присвоения значения переменной:

B:=200; 6

Page 7: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Сигнал типа STD_LOGIC Сигнал типа STD_LOGIC 'U' – не инициализировано; 'X' – неизвестное значение (сильное);'0' – логический 0 (сильное);'1' - логическая 1 (сильное);'Z' – третье состояние;'W' - неизвестное значение (слабое);'L' - логический 0 (слабое);'H' - логическая 1 (слабое);'-' – Неопределенное значение.

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

?

&

&

CONSTANT resolution_table : stdlogic_table := ( -- --------------------------------------------------------- -- | U X 0 1 Z W L H - | | -- --------------------------------------------------------- ( 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U' ), -- | U | ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), -- | X | ( 'U', 'X', '0', 'X', '0', '0', '0', '0', 'X' ), -- | 0 | ( 'U', 'X', 'X', '1', '1', '1', '1', '1', 'X' ), -- | 1 | ( 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', 'X' ), -- | Z | ( 'U', 'X', '0', '1', 'W', 'W', 'W', 'W', 'X' ), -- | W | ( 'U', 'X', '0', '1', 'L', 'W', 'L', 'W', 'X' ), -- | L | ( 'U', 'X', '0', '1', 'H', 'W', 'W', 'H', 'X' ), -- | H | ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ) -- | - | ); 7

Page 8: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

•‘U’ – цепь не инициализирована, используется при моделировании. Например если мы попытаемся прочитать ячейку память в которою до этого не было записи то получим такое значение.

•‘X’ – неизвестное значение. Отражает ситуацию подключения к одной и той же цепи двух драйверов, причем один выдает ‘1’, а другой ‘0’.

•‘0’, ‘1’ – логический ‘0’ или ‘1’ соответственно.

•‘Z’ – высокий импеданс.

•‘L’ – цепь подключена к терминальному резистору уровня ‘0’. Например мы имеем тристабильный буфер, выход которого подключен через резистор к земле, притом сам буфер выключен.

•‘H’ – цепь подключена к терминальному резистору уровня ‘1’. Например мы имеем тристабильный буфер, выход которого подключен через резистор к питанию, притом сам буфер выключен.

•‘W’ – цепь одновременно подключена к терминальному резистору уровня ‘0’ и терминальному резистору уровня ‘1’.

•‘-‘ – не имеет значения (безразлично). Используется при описании устройств, в которых значение на выходе схемы в некоторых случаях не зависит от значения на входе, например, шифратора. (В картах Карно такие значения обозначались как α )

Сигнал типа STD_LOGIC Сигнал типа STD_LOGIC

8

Page 9: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Операции Операции VHDLVHDL Тип операций Обозначения Комментарий

Логические АNDORNANDNORXORXNOR

Логическое ИЛогическое ИЛИЛогическое И-НЕЛогическое ИЛИ-НЕИсключающее ИЛИЭквивалентность

Сравнения =/=<><=>=

РавенствоНеравенствоМеньшеБольшеМеньше или равноБольше или равно

Сдвига SLLSRLSLASRAROLROR

Сдвиг влево логическийСдвиг вправо логическийСдвиг влево арифметическийСдвиг вправо арифметическийСдвиг влево циклическийСдвиг вправо циклический

Знака и сложения

+-&

Сложение (знак +)Вычитание (знак -)Конкатенация

Умножения */MODREM

УмножениеДеление (синтезируются ограничено)Модуль (синтезируются ограничено)Остаток (синтезируются ограничено)

Смешанные ABSNOT**

Абсолютное значениеОтрицаниеСтепень

9

Page 10: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Примеры выполнения операций над объектами:

resultresult <= <= a a ++ bb;--сумматор (поведенческий стиль);--сумматор (поведенческий стиль)sumsum <= ( <= (a a XORXOR b b) ) XORXOR cin cin;--сумматор;--сумматор ( (потоковый или структурный стильпотоковый или структурный стиль))cout <= (a cout <= (a ANDAND b) b) OROR (a (a ANDAND cin) cin) OROR (b (b ANDAND cin); cin);equal <= '1' equal <= '1' WHENWHEN a = b a = b ELSEELSE '0'; --компаратор '0'; --компараторoutp <= "00000001" outp <= "00000001" SLLSLL conv_integer(inp); --дешифратор conv_integer(inp); --дешифратор (поведенческий стиль) (поведенческий стиль)

10

Page 11: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Интерфейс и архитектура устройств Интерфейс и архитектура устройств <Интерфейс> ::= <Интерфейс> ::= ENTITYENTITY < <Идентификатор>Идентификатор> ISIS[[GENERICSGENERICS <Список настроечных констант>] <Список настроечных констант>][[PORTPORT <Список портов>] <Список портов>]

<Декларативная часть><Декларативная часть>[ [ BEGINBEGIN

<Пассивные конструкции языка><Пассивные конструкции языка> ] ]ENDEND [ [ ENTITYENTITY ] [ ] [ <Идентификатор><Идентификатор>] ;] ;

Упрощенный синтаксис декларации порта

<Описание портов>::=<Описание портов>::=PORTPORT(<Описание порта> {;<Описание порта>});(<Описание порта> {;<Описание порта>});<Описание порта>::= <Список идентификаторов> : <Режим> <Тип><Описание порта>::= <Список идентификаторов> : <Режим> <Тип><Режим> ::= <Режим> ::= BUFFERBUFFER||ININ||OUTOUT||INOUTINOUT||LINKAGELINKAGE

Пример конструкции ENTITY:

ENTITYENTITY Decoder Decoder ISISPORTPORT ( ( inp: inp: ININ std_logic_vector(2 std_logic_vector(2 DOWNTODOWNTO 0); 0);

outp: outp: OUTOUT std_logic_vector(7 std_logic_vector(7 DOWNTODOWNTO 0)); 0));ENDEND Decoder; Decoder; 11

Page 12: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Упрощенный синтаксис конструкции ARCHITECTURE:

<Архитектура> ::= <Архитектура> ::= ARCHITECTUREARCHITECTURE < <Идентификатор> Идентификатор> OFOF <Интерфейс> <Интерфейс> ISIS

<Декларативная часть><Декларативная часть>BEGINBEGIN

<Параллельные операторы><Параллельные операторы>END [ ARCHITECTURE ]END [ ARCHITECTURE ] [<Идентификатор>] ; [<Идентификатор>] ;

Пример описания устройства:

-- Комментарий: Интерфейс полного сумматора -- Комментарий: Интерфейс полного сумматора ENTITY ENTITY FullFull__Adder Adder ISISPORT PORT (( X, Y, Cin:X, Y, Cin:IN IN Bit; Bit;

Cout, Sum:Cout, Sum:OUT OUT Bit) ;Bit) ;END END Full_Adder ;Full_Adder ;-- Комментарий: Архитектура 1 полного сумматора (потоковый -- Комментарий: Архитектура 1 полного сумматора (потоковый стиль)стиль)ARCHITECTURE ARCHITECTURE DataFlow1 DataFlow1 OF OF Full_Adder Full_Adder ISISSIGNAL SIGNAL A,B: Bit;A,B: Bit;

12

Page 13: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

BEGINBEGINA <= X A <= X XOR XOR Y;Y;B <= A B <= A AND AND Cin;Cin;Sum <= A Sum <= A XOR XOR Cin;Cin;Cout <= B Cout <= B OR OR (X (X AND AND Y);Y);

END ARCHITECTURE END ARCHITECTURE DataFlow1 ;DataFlow1 ;-- Комментарий: Архитектура 2 полного сумматора (потоковый стиль)-- Комментарий: Архитектура 2 полного сумматора (потоковый стиль)ARCHITECTURE ARCHITECTURE DataFlow2DataFlow2 OF OF Full_AdderFull_Adder IS ISBEGINBEGIN Sum <= (XSum <= (X XOR XOR Y) Y) XOR XOR Cin;Cin; Cout <= (XCout <= (X AND AND Y) or (XY) or (X AND AND Cin) Cin) OROR (Y (Y AND AND Cin);Cin);END END DataFlowDataFlow2;2;

13

Page 14: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Пакеты и библиотеки Пакеты и библиотеки

<Интерфейс пакета> ::=<Интерфейс пакета> ::=PACKAGEPACKAGE <Имя пакета> <Имя пакета> isis

<Декларативная часть><Декларативная часть>ENDEND [ [ PACKAGEPACKAGE ] [ <Имя> ] ; ] [ <Имя> ] ;<Тело пакета> ::=<Тело пакета> ::=PACKAGEPACKAGE BODYBODY <Имя пакета> <Имя пакета> isis

<Декларативная часть><Декларативная часть>ENDEND [ [ PACKAGEPACKAGE ] [ <Имя пакета> ] ; ] [ <Имя пакета> ] ;

<Подключение библиотеки> ::= <Подключение библиотеки> ::= LIBRARYLIBRARY <Имя библиотеки> { , <Имя библиотеки> }; <Имя библиотеки> { , <Имя библиотеки> };<Использование Пакета>::=<Использование Пакета>::=<Имя библиотеки>.<Имя пакета>.<Символьное имя> | <Идентификатор> | <Имя библиотеки>.<Имя пакета>.<Символьное имя> | <Идентификатор> | ALLALL;;

Пакеты объединяются в библиотеки (LIBRARY)

Декларация пакета состоит из описания интерфейса и описания тела.

14

Page 15: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

PACKAGEPACKAGE TriState TriState ISISTYPETYPE Tri IS ('0', '1', 'Z', 'E'); Tri IS ('0', '1', 'Z', 'E');FUNCTIONFUNCTION BitVal (Value: Tri) BitVal (Value: Tri) RETURNRETURN Bit ; Bit ;FUNCTIONFUNCTION TriVal (Value: Bit) TriVal (Value: Bit) RERETURN Tri;TURN Tri;TYPETYPE TriVector TriVector ISIS ARRAYARRAY (Natural (Natural RANGERANGE <>) <>) OFOF Tri ; Tri ;FUNCTIONFUNCTION Resolve (Sources: TriVector) Resolve (Sources: TriVector) RETURNRETURN Tri ; Tri ;

ENDEND PACKAGEPACKAGE TriState ; TriState ;PACKAGEPACKAGE BODYBODY TriState TriState ISIS

FUNCTIONFUNCTION BitVal (Value: Tri) BitVal (Value: Tri) RETURNRETURN Bit Bit ISISCONSTANTCONSTANT Bits : Bit_Vector := "0100"; Bits : Bit_Vector := "0100";

BEGINBEGINRETURNRETURN Bits(Tri'Pos(Value)); Bits(Tri'Pos(Value));

ENDEND;;FUNCTIONFUNCTION TriVal (Value: Bit) TriVal (Value: Bit) RETURNRETURN Tri Tri ISISBEGINBEGIN

RETURNRETURN Tri'Val(Bit'Pos(Value)); Tri'Val(Bit'Pos(Value));ENDEND;;

15

Page 16: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

FUNCTIONFUNCTION Resolve (Sources: TriVector) Resolve (Sources: TriVector) RETURNRETURN Tri Tri ISISVARIABLEVARIABLE V: Tri := 'Z'; V: Tri := 'Z';

BEGINBEGINFORFOR i i ININ Sources'Range Sources'Range LOOPLOOP

IFIF Sources(i) /= 'Z' Sources(i) /= 'Z' THENTHENIFIF V = 'Z' V = 'Z' THENTHEN

V := Sources(i);V := Sources(i);ELSEELSE

RETURNRETURN 'E'; 'E';ENDEND IFIF;;

END IF;END IF;END LOOP;END LOOP;RETURNRETURN V; V;

ENDEND;;END PACKAGE BODYEND PACKAGE BODY TriState ; TriState ;

16

Page 17: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Параллельные операторы Операторы данной группы описывают параллельно функционирующие части устройства. К таким операторам относятся:

•Блоки (BLOCK);•Процессы (PROCESS);•Параллельные вызовы процедур;•Параллельные присваивания сигналов (<=); •Параллельные операторы – ловушки (ASSERT);•Экземпляры компонентов (COMPONENT);

Оператор BLOCK позволяет описать группу параллельных операторов:

<Блок> ::= <Блок> ::= [<Метка>] : [<Метка>] : BLOCKBLOCK [( <Охранное выражение> )] [[( <Охранное выражение> )] [ISIS]] [[GENERICGENERIC (<Объявление настроечных констант>); (<Объявление настроечных констант>);]] [[GENERIC MAPGENERIC MAP ( Список связывания настроечных констант );] ( Список связывания настроечных констант );] [[PORTPORT (<Объявление портов>);] (<Объявление портов>);] [[PORT MAPPORT MAP ( <Список Связывания портов> )] ( <Список Связывания портов> )] <Декларативная часть><Декларативная часть> BEGINBEGIN <Параллельные операторы><Параллельные операторы> END BLOCKEND BLOCK [<Метка>];[<Метка>];

Оператор Оператор BLOCKBLOCK

17

Page 18: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Пример описания устройства с использованием иерархии блоков:

C: C: BLOCKBLOCK BEGINBEGIN

X: X: BLOCKBLOCK PORTPORT (P1, P2: (P1, P2: INOUTINOUT BIT); --объявление портов BIT); --объявление портовPORTPORT MAPMAP (P1 => S1, P2 => S2); --связывание портов (P1 => S1, P2 => S2); --связывание портовCONSTANTCONSTANT Delay: DELAY_LENGTH := 1 ms; --декларации Delay: DELAY_LENGTH := 1 ms; --декларацииSIGNALSIGNAL P3: BIT; P3: BIT; BEGINBEGIN

P3 <= P1 P3 <= P1 AFTERAFTER Delay; --Присвоение Delay; --Присвоение••B: B: BLOCKBLOCK••BEGINBEGIN

••END END BLOCKBLOCK B; B;

END END BLOCKBLOCK X; X;END END BLOCKBLOCK C; C;

18

Page 19: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Оператор PROCESS описывает независимые группы последовательных операторов в виде параллельных процессов. Упрощенный синтаксис оператора PROCESS:

<Процесс>::= <Процесс>::= [[<Метка><Метка>:]:][[POSTPONEDPOSTPONED] ] PROCESSPROCESS (<Список чувствительности>) [ (<Список чувствительности>) [ISIS]]

<Декларативная часть> <Декларативная часть> BEGINBEGIN

<Последовательные операторы><Последовательные операторы>END END [[POSTPONEDPOSTPONED] ] PROCESSPROCESS [[<Метка><Метка>]] ; ;

Пример описания динамического триггера с использованием процесса:

FF: FF: PROCESSPROCESS (CLK,RST,WE) (CLK,RST,WE)BEGINBEGIN IFIF RST='1' RST='1' THENTHEN D<='0';D<='0'; ELSIF ELSIF ((CLK='1') ((CLK='1') AND AND (CLK'(CLK'eventevent)) )) THENTHEN IFIF (WE='1') (WE='1') THENTHEN D<=D_IN;D<=D_IN; END IF;END IF; END IF;END IF;END PROCESS;END PROCESS;

Оператор PROCESSОператор PROCESS

19

Page 20: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Оператор параллельного присваивания сигнала эквивалентен процессу, в котором, при определенных условиях, происходит присваивание сигналу нового значения

<Параллельное присваивание сигнала>::=<Параллельное присваивание сигнала>::=[ <Метка> : ] [ [ <Метка> : ] [ POSTPONEDPOSTPONED ] <Условное присваивание сигнала>] <Условное присваивание сигнала>| [ <Метка> : ] [ | [ <Метка> : ] [ POSTPONEDPOSTPONED ] <Присваивание сигнала>] <Присваивание сигнала>

<Условное присваивание сигнала> ::=<Условное присваивание сигнала> ::=<Сигнал><Сигнал><=<= <Опции> { <Образец> <Опции> { <Образец> WHENWHEN <Условие> <Условие> ELSEELSE }}<Образец> [ <Образец> [ WHENWHEN <Условие> ]; <Условие> ];

<Присваивание сигнала> ::=<Присваивание сигнала> ::=WITHWITH <Выражение> <Выражение> SELECTSELECT<Сигнал> <Сигнал> <=<= <Опции> { <Образец> <Опции> { <Образец> WHENWHEN <Значение>, } <Значение>, }<Образец> <Образец> WHENWHEN <Значение>; <Значение>;

<Опции> ::= [ <Опции> ::= [ GUARDEDGUARDED ] [ <Способ задержки> ] ] [ <Способ задержки> ]

<Образец> ::=<Образец> ::=<Выражение> [ <Выражение> [ AFTERAFTER <Время> ]| <Время> ]| NULLNULL [ [ AFTERAFTER <Время> ] <Время> ]

Оператор параллельного присваивания сигналаОператор параллельного присваивания сигнала

20

Page 21: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Динамический триггер:

ENTITYENTITY ff IS ff IS PORTPORT (RST,CLK,WE: (RST,CLK,WE: ININ std_logic; std_logic; D_IN: D_IN: ININ std_logic; std_logic; D: D: OUTOUT std_logic); std_logic);ENDEND ff; ff;ARCHITECTUREARCHITECTURE DataFlow DataFlow OFOF ff IS ff ISBEGINBEGIND<=D<= '0' '0' WHENWHEN RST='1' RST='1' ELSEELSE

D_IN D_IN WHENWHEN (CLK='1') (CLK='1') ANDAND (CLK' (CLK'eventevent) ) ANDAND (WE='1'); (WE='1'); END END DataFlowDataFlow;;

Дешифратор:

LIBRARYLIBRARY ieee; ieee; --Описание подключаемых библиотек --Описание подключаемых библиотекUSEUSE ieee.std_logic_1164. ieee.std_logic_1164.ALLALL;;ENTITYENTITY decoder decoder ISIS

PORTPORT ( inp: ( inp: ININ std_logic_vector(2 std_logic_vector(2 DOWNTODOWNTO 0); 0); outp: outp: OUTOUT std_logic_vector(7 std_logic_vector(7 DOWNTODOWNTO 0)); 0));ENDEND decoder; decoder;

21

Page 22: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

ARCHITECTUREARCHITECTURE DataFlow DataFlow OFOF decoder decoder ISISBEGINBEGIN

outp(0) <= '1' outp(0) <= '1' WHENWHEN inp = "000" inp = "000" ELSEELSE '0'; '0';outp(1) <= '1' outp(1) <= '1' WHENWHEN inp = "001" inp = "001" ELSEELSE '0'; '0';outp(2) <= '1' outp(2) <= '1' WHENWHEN inp = "010" inp = "010" ELSEELSE '0'; '0';outp(3) <= '1' outp(3) <= '1' WHENWHEN inp = "011" inp = "011" ELSEELSE '0'; '0';outp(4) <= '1' outp(4) <= '1' WHENWHEN inp = "100" inp = "100" ELSEELSE '0'; '0';outp(5) <= '1' outp(5) <= '1' WHENWHEN inp = "101" inp = "101" ELSEELSE '0'; '0';outp(6) <= '1' outp(6) <= '1' WHENWHEN inp = "110" inp = "110" ELSEELSE '0'; '0';outp(7) <= '1' outp(7) <= '1' WHENWHEN inp = "111" inp = "111" ELSEELSE '0'; '0';

ENDEND DataFlow; DataFlow;

22

Page 23: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Другим способом группировки последовательных действий являются процедуры и функции:

<Процедура> ::=<Процедура> ::=PROCEDUREPROCEDURE < <Имя> [ ( <Список формальных параметров >) ]Имя> [ ( <Список формальных параметров >) ]|[|[PUREPURE||IMPUREIMPURE] ] FUNCTIONFUNCTION < <Имя> [(< Список формальных параметров> ) ]Имя> [(< Список формальных параметров> ) ]RETURN RETURN <Тип><Тип>

Пример объявления и параллельного вызова процедуры:

ENTITYENTITY sort4 IS sort4 IS GENERICGENERIC (top : integer :=3); (top : integer :=3); PORTPORT ( ( a, b, c, d : a, b, c, d : ININ bit_vector(0 bit_vector(0 TOTO top); top); ra, rb, rc, rd : ra, rb, rc, rd : OUTOUT bit_vector(0 bit_vector(0 TOTO top) top) ););ENDEND sort4; sort4;ARCHITECTUREARCHITECTURE muxes muxes OFOF sort4 sort4 ISIS PROCEDUREPROCEDURE sort2( sort2(SIGNALSIGNAL x, y : x, y : ININ bit_vector(0 bit_vector(0 TOTO top); top); SIGNALSIGNAL g, l : g, l : OUTOUT bit_vector(0 bit_vector(0 TOTO top) top) ) ) ISIS BEGINBEGIN

Процедуры и функцииПроцедуры и функции

23

Page 24: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

IFIF x > y x > y THENTHEN g <= x;g <= x; l <= y;l <= y; ELSEELSE l <= x;l <= x; g <= y;g <= y;ENDEND IFIF;; ENDEND sort2; sort2;SIGNALSIGNAL v1,v2,v3,v4,v5,v6,v7,v8,v9,v10 : bit_vector(0 v1,v2,v3,v4,v5,v6,v7,v8,v9,v10 : bit_vector(0 TOTO top); top); BEGINBEGIN--Параллельные вызовы процедуры--Параллельные вызовы процедуры

sortsort2(2(aa, , cc, , vv1, 1, vv2); 2); sort2(b, d, v3, v4);sort2(b, d, v3, v4);sort2(v1, v3, v5, v6); sort2(v1, v3, v5, v6); sort2(v2, v4, v7, v8);sort2(v2, v4, v7, v8);sortsort2(2(vv6, 6, vv7, 7, vv9, 9, vv10);10);

-- Параллельные присваивания сигналов-- Параллельные присваивания сигналовra <= v8; ra <= v8;

rb <= v10; rb <= v10; rc <= v9; rc <= v9; rd <= v5; rd <= v5; ENDEND muxes; muxes; 24

Page 25: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

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

<<СообщениеСообщение> ::=> ::=[<[<МеткаМетка> :] [> :] [POSTPONEDPOSTPONED] ] ASSERTASSERT < <ВыражениеВыражение> [> [REPORTREPORT < <СообщениеСообщение>] >] [[SEVERITYSEVERITY < <ТипТип сообщениясообщения>];>];

Пример сообщения:

ASSERTASSERT D =’1’ D =’1’REPORTREPORT “Ошибка, “Ошибка, D D не равно 1”;не равно 1”;

Для использования устройства в виде компонента другого устройства необходимо объявить его в декларативной части конструкции ARCHITECTURE:

Оператор - ловушка Оператор - ловушка ASSERTASSERT

25

Page 26: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Использования компонентовИспользования компонентов

После этого можно создать экземпляр компонента в описательной части ARCHITECTURE при помощи конструкции использования:

Для использования устройства в виде компонента другого устройства необходимо объявить его в декларативной части конструкции ARCHITECTURE:

<ЭКЗЕМПЛЯР компонента><ЭКЗЕМПЛЯР компонента> ::= ::=<Метка экземпляра>: <Имя компонента> <Метка экземпляра>: <Имя компонента> GENERIC MAP GENERIC MAP ( <Значения настроечных констант> )( <Значения настроечных констант> )PORT MAP PORT MAP ( <Список соответствий сигналов> );( <Список соответствий сигналов> );

<Объявление компонента> ::= <Объявление компонента> ::= COMPONENTCOMPONENT <Имя компонента> <Имя компонента>GENERICGENERIC <Список настроечных параметров>;<Список настроечных параметров>;PORTPORT <<СписокСписок портовпортов>;>;END COMPONENTEND COMPONENT;;

26

Page 27: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

-- Пример использования компонент-- Пример использования компонентLIBRARYLIBRARY ieee; ieee;USEUSE ieee.std_logic_1164.all; ieee.std_logic_1164.all;USEUSE ieee.std_logic_arith.all; ieee.std_logic_arith.all;USEUSE ieee.std_logic_unsigned. ieee.std_logic_unsigned.ALLALL;;ENTITYENTITY adder adder ISIS GENERICGENERIC ( n: ( n: INTEGERINTEGER:=16);:=16); PORTPORT ( ( a,b: a,b: ININ std_logic_vector (n-1 std_logic_vector (n-1 DOWNTODOWNTO 0); 0); result: result: OUTOUT std_logic_vector(n-1 std_logic_vector(n-1 DOWNTODOWNTO 0)); 0));ENDEND adder; adder;ARCHITECTUREARCHITECTURE behave behave OFOF adder adder ISISBEGINBEGIN result <= a + b;result <= a + b;ENDEND;;LIBRARYLIBRARY ieee; ieee;USEUSE ieee.std_logic_1164. ieee.std_logic_1164.allall;;USEUSE ieee.std_logic_arith.all; ieee.std_logic_arith.all;USEUSE ieee.std_logic_unsigned. ieee.std_logic_unsigned.ALLALL;;ENTITYENTITY adders adders ISIS GENERICGENERIC(( op_n: op_n: INTEGERINTEGER := 16; := 16; sum_n:sum_n: INTEGERINTEGER :=16); :=16); 27

Page 28: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

PORTPORT(( a,b,c: a,b,c: ININ std_logic_vector(op_n-1 std_logic_vector(op_n-1 DOWNTODOWNTO 0); 0); result: result: OUTOUT std_logic_vector(sum_n-1 std_logic_vector(sum_n-1 DOWNTODOWNTO 0)); 0));ENDEND adders; adders;ARCHITECTUREARCHITECTURE behave behave OFOF adders adders ISIS COMPONENTCOMPONENT adder adder

GENERICGENERIC ( n: ( n:INTEGERINTEGER:=op_n);:=op_n); PORTPORT ( a,b: ( a,b: ININ std_logic_vector(n-1 std_logic_vector(n-1 DOWNTODOWNTO 0); 0); result: result: OUTOUT std_logic_vector(n-1 std_logic_vector(n-1 DOWNTODOWNTO 0)); 0)); ENDEND COMPONENTCOMPONENT; ; SIGNALSIGNAL rez: std_logic_vector(sum_n-1 rez: std_logic_vector(sum_n-1 DOWNTODOWNTO 0); 0);BEGIN BEGIN a1:addera1:adder PORTPORT MAPMAP ( ( a => a, b=>b, result=>rez);a => a, b=>b, result=>rez); a2:addera2:adder PORTPORT MAPMAP ( ( a=>rez,a=>rez,

b=>c,b=>c, result => result);result => result);ENDEND behave; behave;

28

Page 29: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Оператор GENERATE обеспечивает возможность итеративного или условного повторения деклараций и операторов.

<<ГенерацияГенерация> > ::= ::= [<Метка>[<Метка>::]<Способ генерации> ]<Способ генерации> GENERATEGENERATE

[<Декларации>[<Декларации> BEGINBEGIN]] [<Параллельные операторы>][<Параллельные операторы>]ENDEND GENERATE GENERATE [<Метка>];[<Метка>];<Способ генерации> ::= <Способ генерации> ::= FORFOR <идентификатор> <идентификатор> ININ <диапазон> | <диапазон> | IFIF <условие><условие>

Пример конструкции GENERATE:

Gen: Gen: BLOCK --BLOCK --двоичное дереводвоичное деревоBEGINBEGIN

L1: CELL L1: CELL PORTPORT MAPMAP (Top, Bus(1), Bus(2)) ; (Top, Bus(1), Bus(2)) ; -- --Top,Left,RightTop,Left,RightL2: L2: FORFOR I IN 1 to 7 I IN 1 to 7 GENERATEGENERATE

L3: L3: FORFOR J J ININ 0 TO 2**I-1 0 TO 2**I-1 GENERATEGENERATEL5: CELL L5: CELL PORTPORT MAP MAP (Bus(2**I+J-1), Bus((2**I+J)*2-1), Bus(2**I+J)*2);(Bus(2**I+J-1), Bus((2**I+J)*2-1), Bus(2**I+J)*2);ENDEND GENERATEGENERATE ; ;

ENDEND GENERATEGENERATE ; ;ENDEND BLOCKBLOCK Gen; Gen;

Оператор GENERATEОператор GENERATE

29

Page 30: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Последовательные операторы Последовательные операторы используются для описания алгоритма функционирования параллельных процессов и подпрограмм. Их исполнение происходит в той последовательности, в которой они описаны в программе. Последовательными операторами являются:

•оператор WAIT;•оператор – ловушка ASSERT;•оператор сообщения REPORT;•оператор присваивания сигнала и оператор условного присваивания сигнала;•оператор присваивания переменной;•вызов процедуры;•оператор IF;•оператор CASE;•оператор цикла LOOP;•оператор NEXT;•оператор EXIT;•оператор RETURN;•пустой оператор NULL.

30

Page 31: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Оператор ожидания WAIT позволяет приостановить исполнение процесса или подпрограммы.

<Ожидание> ::=<Ожидание> ::=[ <Метка :] [ <Метка :] WAITWAIT [ [ONON <Список чувствительности> ] [ <Список чувствительности> ] [UNTILUNTIL <Условие> ] [ <Условие> ] [FORFOR <Задержка> ];<Задержка> ];

Пример использования оператора WAIT:

WAIT ON Clk;

<Ловушка> ::=<Ловушка> ::=[<Метка> :] [<Метка> :] ASSERTASSERT <Выражение> [ <Выражение> [REPORTREPORT <Сообщение>] [<Сообщение>] [SEVERITYSEVERITY <Тип <Тип соосбщения>];соосбщения>];

Пример использования ASSERT и REPORT:

ASSERTASSERT (IRDY (IRDY__N = '0')N = '0')REPORTREPORT "Target device: FRAME signal deassertion error. IRDY is not asserted." "Target device: FRAME signal deassertion error. IRDY is not asserted."SEVERITYSEVERITY ERRORERROR;;

Оператор ожидания Оператор ожидания WAITWAIT

ОператорОператор--ловушка ловушка ASSERTASSERT

31

Page 32: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

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

<Присваивание сигнала> ::=<Присваивание сигнала> ::=[ <метка> :] <сигнал> <= [ <способ задержки> ] <образец> ;[ <метка> :] <сигнал> <= [ <способ задержки> ] <образец> ;<способ задержки> ::= <способ задержки> ::= TRANSPORTTRANSPORT|[|[REJECTREJECT <время> ] <время> ] INERTIALINERTIAL<образец> ::=<образец> ::=<выражение> [ <выражение> [ AFTERAFTER <время> ]| <время> ]| NULLNULL [ [ AFTERAFTER <время> ] <время> ]

Пример присваивания сигнала:

PP3 <= 3 <= PP1 1 AFTERAFTER Delay Delay; ; OutputOutput__pinpin <= <= TRANSPORTTRANSPORT Input Input__pin pin AFTERAFTER 10 10 nsns;;

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

32

Page 33: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Присваивание значения переменной подобно операторам присваивания в языках программирования. Синтаксис оператора присваивания переменной:

<Присваивание переменной> ::=<Присваивание переменной> ::=[ <метка> :] <Переменная> := <Выражение>;[ <метка> :] <Переменная> := <Выражение>;

Пример присваивания переменной:

i := i - 1;

Оператор вызова подпрограммы служит для исполнения алгоритма, описанного в процедуре или функции:

<Вызов подпрограммы> ::= <Вызов подпрограммы> ::= [ <Метка> : ] <Имя процедуры или функции> [ ( <Список формальных [ <Метка> : ] <Имя процедуры или функции> [ ( <Список формальных параметров>) ];параметров>) ];

Присваивание значения переменнойПрисваивание значения переменной

Оператор вызова подпрограммыОператор вызова подпрограммы

33

Page 34: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Условный оператор IF позволяет описать устройство, в алгоритме работы которого по результатам проверки заданных условий разрешается исполнение одной (или нуля) групп последовательных операторов. Выполнение последовательных операторов разрешается, если заданное условие истинно.

<Условный оператор> ::=<Условный оператор> ::=[ <Метка> :] [ <Метка> :] IFIF <Условие> <Условие> THENTHEN

<Последовательные операторы><Последовательные операторы>{ { ELSIFELSIF <Условие> <Условие> THENTHEN

<Последовательные операторы>}<Последовательные операторы>}[ [ ELSEELSE

<Последовательные операторы>]<Последовательные операторы>]END IFEND IF [ <Метка> ]; [ <Метка> ];

Условный оператор Условный оператор IFIF

34

Page 35: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Пример описания шифратора с помощью условного оператора:

ENTITYENTITY encoder encoder ISISPORTPORT ( in1 : ( in1 :ININ std_logic_vector(7 std_logic_vector(7 DOWNTODOWNTO 0); 0); out1 :out1 :OUTOUT std_logic_vector(2 std_logic_vector(2 DOWNTODOWNTO 0)); 0));

ENDEND encoder; encoder;ARCHITECTUREARCHITECTURE behave behave OFOF encoder encoder ISISBEGINBEGIN PROCESSPROCESS (in1) (in1) BEGINBEGIN IFIF in1(7) = '1' in1(7) = '1' THEN THEN out1 <= "111";out1 <= "111"; ELSIFELSIF in1(6) = '1' in1(6) = '1' THENTHEN out1 <= "110"; out1 <= "110"; ELSIFELSIF in1(5) = '1' in1(5) = '1' THENTHEN out1 <= "101"; out1 <= "101"; ELSIFELSIF in1(4) = '1' in1(4) = '1' THEN THEN out1 <= "100";out1 <= "100"; ELSIFELSIF in1(3) = '1' in1(3) = '1' THENTHEN out1 <= "011"; out1 <= "011"; ELSIFELSIF in1(2) = '1' in1(2) = '1' THENTHEN out1 <= "010"; out1 <= "010"; ELSIFELSIF in1(1) = '1' in1(1) = '1' THEN THEN out1 <= "001";out1 <= "001"; ELSIFELSIF in1(0) = '1' in1(0) = '1' THENTHEN out1 <= "000"; out1 <= "000"; ELSE ELSE out1 <= "XXX";out1 <= "XXX";

END IF;END IF; END PROCESS;END PROCESS;ENDEND behave; behave;

35

Page 36: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Оператор выбора CASE разрешает исполнение одного из многих альтернативных блоков последовательных операторов. Выбор блока среди альтернатив выполняется при совпадении значения выражения с образцом.

<Выбор> ::=<Выбор> ::=[ <метка> : ][ <метка> : ]casecase <выражение> <выражение> isiswhenwhen <образец> => <последовательные операторы> <образец> => <последовательные операторы>{ { whenwhen <образец> => <последовательные операторы>} <образец> => <последовательные операторы>}endend casecase [ <метка> ] ; [ <метка> ] ;

Пример использования оператора выбора при описании дешифратора:

LIBRARYLIBRARY ieee ieee;;USEUSE ieee.std_logic_1164. ieee.std_logic_1164.ALLALL;;ENTITYENTITY decoder decoder ISIS

PORTPORT ( inp: ( inp: ININ std_logic_vector(2 std_logic_vector(2 DOWNTODOWNTO 0); 0); outp: outp: OUTOUT std_logic_vector(7 std_logic_vector(7 DOWNTODOWNTO 0)); 0));ENDEND decoder; decoder;

Оператор выбора CASEОператор выбора CASE

36

Page 37: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

ARCHITECTUREARCHITECTURE behave behave OFOF decoder decoder ISIS BEGINBEGIN PROCESSPROCESS (inp) (inp) BEGINBEGIN

CASECASE inp inp ISIS WHENWHEN "000" => outp <= "00000001"; "000" => outp <= "00000001";WHENWHEN "001" => outp <= "00000010"; "001" => outp <= "00000010";WHENWHEN "010" => outp <= "00000100"; "010" => outp <= "00000100";WHENWHEN "011" => outp <= "00001000"; "011" => outp <= "00001000";WHENWHEN "100" => outp <= "00010000"; "100" => outp <= "00010000";WHENWHEN "101" => outp <= "00100000"; "101" => outp <= "00100000";WHENWHEN "110" => outp <= "01000000"; "110" => outp <= "01000000";WHENWHEN "111" => outp <= "10000000"; "111" => outp <= "10000000";WHENWHEN OTHERSOTHERS => outp <= "XXXXXXXX"; => outp <= "XXXXXXXX";

ENDEND CASECASE;; ENDEND PROCESSPROCESS;;ENDEND behave; behave;

37

Page 38: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

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

<Цикл> ::=<Цикл> ::=[ <Метка> : ][ <Метка> : ][ [ WHILEWHILE <Условие> | <Условие> | FORFOR <Идентификатор> <Идентификатор> ININ <Диапазон>] <Диапазон>] LOOPLOOP

<Последовательные операторы><Последовательные операторы>ENDEND LOOPLOOP [ <Метка> ];[ <Метка> ];

Пример использования оператора цикла при описании шифратора:

ENTITYENTITY encoder encoder ISIS PORTPORT ( a, b, c, d, e, f, g, h : ( a, b, c, d, e, f, g, h : ININ std_logic; std_logic; out2, out1, out0 : out2, out1, out0 : OUTOUT std_logic); std_logic);ENDEND encoder; encoder;ARCHITECTUREARCHITECTURE behave OF encoder IS behave OF encoder ISBEGINBEGIN PROCESSPROCESS (a, b, c, d, e, f, g, h) (a, b, c, d, e, f, g, h) VARIABLEVARIABLE inputs : std_logic_vector (7 inputs : std_logic_vector (7 DOWNTODOWNTO 0); 0); VARIABLEVARIABLE i : i : INTEGERINTEGER ; ;

Оператор циклаОператор цикла

38

Page 39: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

BEGINBEGIN INPUTSINPUTS := (h, g, f, e, d, c, b, a); := (h, g, f, e, d, c, b, a); i := 7;i := 7; WHILEWHILE i >= 0 i >= 0 ANDAND inputs(i) /= '1' inputs(i) /= '1' LOOPLOOP i := i - 1;i := i - 1; ENDEND LOOPLOOP;; IFIF ( i < 0) ( i < 0) THENTHEN i := 0;i := 0; ENDEND IFIF;;

-- conv_std_logic_vector (i, 3) - -- conv_std_logic_vector (i, 3) - функцияфункция преобразованияпреобразования-- -- переменнойпеременной типатипа integer integer вв сигналсигнал типатипа std_logic_vector std_logic_vector-- Второй аргумент определяет размер вектора.-- Второй аргумент определяет размер вектора.

(out2, out1, out0) <= conv_std_logic_vector (i, 3);(out2, out1, out0) <= conv_std_logic_vector (i, 3); ENDEND process; process;END behave;

39

Page 40: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

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

LIBRARYLIBRARY ieee ieee;;USEUSE ieee.std_logic_1164.all; ieee.std_logic_1164.all;-- Синтезируемое описание простого выходного буфера (драйвера)-- Синтезируемое описание простого выходного буфера (драйвера)ENTITYENTITY tristate1 tristate1 ISIS

PORTPORT ( input, enable : ( input, enable : ININ std_logic; std_logic;output : output : OUTOUT std_logic) ; std_logic) ;

ENDEND tristate1 ; tristate1 ; ARCHITECTUREARCHITECTURE single_driver single_driver OFOF tristate1 tristate1 ISISBEGINBEGIN

output <= input output <= input WHENWHEN enable = '1' enable = '1' ELSEELSE 'Z' ; 'Z' ;ENDEND single single__driverdriver ; ;-- Синтезируемое описание драйвера шины-- Синтезируемое описание драйвера шиныLIBRARYLIBRARY ieee; ieee;USEUSE ieee.std_logic_1164. ieee.std_logic_1164.ALLALL;;ENTITYENTITY tristate2 tristate2 ISIS

PORTPORT ( input3, input2, input1, input0: ( input3, input2, input1, input0: ININ std_logic_vector (7 std_logic_vector (7 DOWNTODOWNTO 0); 0); enable : IN std_logic_vector (3 enable : IN std_logic_vector (3 DOWNTODOWNTO 0); 0); output : OUT std_logic_vector (7 output : OUT std_logic_vector (7 DOWNTODOWNTO 0) ); 0) );ENDEND tristate2 ; tristate2 ; ARCHITECTUREARCHITECTURE multiple_drivers of tristate2 multiple_drivers of tristate2 ISISBEGINBEGIN 40

Page 41: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

output <= input3 output <= input3 WHENWHEN enable(3) = '1' enable(3) = '1' ELSEELSE "ZZZZZZZZ" ; "ZZZZZZZZ" ;output <= input2 output <= input2 WHENWHEN enable(2) = '1' enable(2) = '1' ELSEELSE "ZZZZZZZZ" ; "ZZZZZZZZ" ;output <= input1 output <= input1 WHENWHEN enable(1) = '1' enable(1) = '1' ELSEELSE "ZZZZZZZZ" ; "ZZZZZZZZ" ;output <= input0 output <= input0 WHENWHEN enable(0) = '1' enable(0) = '1' ELSEELSE "ZZZZZZZZ" ; "ZZZZZZZZ" ;

ENDEND multiple multiple__driversdrivers;;-- Синтезируемое описание шинного формирователя-- Синтезируемое описание шинного формирователяLIBRARYLIBRARY ieee; ieee;USEUSE ieee.std_logic_1164.ALL; ieee.std_logic_1164.ALL;ENTITYENTITY bidir bidir ISIS PORTPORT ( input_val, enable: ( input_val, enable: ININ std_logic; std_logic; output_val : output_val : OUTOUT std_logic; std_logic; bidir_port : bidir_port : INOUTINOUT std_logic) ; std_logic) ;ENDEND bidir ; bidir ; ARCHITECTUREARCHITECTURE tri_state tri_state OFOF bidir bidir ISISBEGINBEGIN

bidir_port <= input_val bidir_port <= input_val WHENWHEN enable = '1' enable = '1' ELSEELSE 'Z' ; 'Z' ;output_val <= bidir_port;output_val <= bidir_port;

ENDEND tri_state; tri_state;

41

Page 42: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Пример описания ОЗУ Пример описания ОЗУ

LIBRARYLIBRARY ieee; ieee;USEUSE ieee.std_logic_1164. ieee.std_logic_1164.ALLALL;;USEUSE ieee.std_logic_arith. ieee.std_logic_arith.ALLALL;;USEUSE ieee.std_logic_unsigned. ieee.std_logic_unsigned.ALLALL;;ENTITYENTITY MEM_ MEM_88__1616_BE _BE ISIS PORTPORT ( ( A : A : ININ std_logic_vector(2 std_logic_vector(2 DOWNTODOWNTO 0); 0); BE: BE: ININ std_logic_vector(1 std_logic_vector(1 DOWNTODOWNTO 0); 0); WE: WE: ININ std_logic; std_logic; CLK: CLK: ININ std_logic; std_logic; DIN: DIN: ININ std_logic_vector(15 std_logic_vector(15 DOWNTODOWNTO 0); 0); DOUT: DOUT: OUTOUT std_logic_vector(15 std_logic_vector(15 DOWNTODOWNTO 0) 0) ););ENDEND MEM_8_16_BE; MEM_8_16_BE;ARCHITECTUREARCHITECTURE BEHAV BEHAV OFOF MEM_8_16_BE MEM_8_16_BE ISISTYPETYPE MEM_8_16 MEM_8_16 ISIS ARRAYARRAY (0 (0 TOTO 7) 7) OFOF std_logic_vector(7 std_logic_vector(7 DOWNTODOWNTO 0); 0);SIGNALSIGNAL RAM0: MEM_8_16; RAM0: MEM_8_16;SIGNALSIGNAL RAM1: MEM_8_16; RAM1: MEM_8_16;SIGNALSIGNAL D:std_logic_vector(15 D:std_logic_vector(15 DOWNTODOWNTO 0); 0);

42

Page 43: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

BEGINBEGINOUT0: OUT0: PROCESSPROCESS (CLK,WE,A,BE) (CLK,WE,A,BE)BEGINBEGIN IFIF (CLK'EVENT (CLK'EVENT ANDAND CLK='1') CLK='1') THENTHEN IFIF ((WE = '1' ((WE = '1' OROR WE = 'H') WE = 'H') ANDAND BE(0)='0') BE(0)='0') THENTHEN RAM0(conv_integer(unsigned(A)))(7 RAM0(conv_integer(unsigned(A)))(7 DOWNTODOWNTO 0) <= DIN(7 0) <= DIN(7 DOWNTODOWNTO 0); 0); ENDEND IFIF;; ENDEND IFIF;;ENDEND PROCESSPROCESS OUT0; OUT0;DOUT(7 DOUT(7 DOWNTODOWNTO 0) <= RAM0(conv_integer(unsigned(A)))(7 0) <= RAM0(conv_integer(unsigned(A)))(7 DOWNTODOWNTO 0); 0);OUT1: OUT1: PROCESSPROCESS (CLK,WE,A,BE) (CLK,WE,A,BE)BEGINBEGIN IFIF (CLK'EVENT (CLK'EVENT ANDAND CLK='1') CLK='1') THENTHEN IFIF ((WE = '1' ((WE = '1' OROR WE = 'H') WE = 'H') ANDAND BE(1)='0') BE(1)='0') THENTHEN RAM1(conv_integer(unsigned(A)))(7 RAM1(conv_integer(unsigned(A)))(7 DOWNTODOWNTO 0) <= DIN(15 0) <= DIN(15 DOWNTODOWNTO 8); 8); ENDEND IFIF;; ENDEND IFIF;;ENDEND PROCESSPROCESS OUT1; OUT1;DOUT(15 DOUT(15 DOWNTODOWNTO 8) <= RAM1(conv_integer(unsigned(A)))(7 8) <= RAM1(conv_integer(unsigned(A)))(7 DOWNTODOWNTO 0); 0);ENDEND behav; behav;

43

Page 44: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Правила описания синтезируемых конструкций на VHDL • Необходимо максимально использовать поведенческий стиль

описания. При структурном описании нижние модули иерархии должны выполнять законченные функции. Обычно поведенческое описание модуля содержит 30 – 500 строк кода или от 1 до 10 процессов.

• Процесс, по возможности должен содержать один – два оператора на верхнем уровне.

• Для создания триггера, защелкиваемого по перепаду сигнала можно использовать условие CLK’event and CLK=’1’ или CLK’event and CLK=’0’ (в первом случае отслеживается фронт, во втором спад.) Это условие используется совместно с оператором IF, причем если оно следует после ELSIF то после IF этого же оператора обычно описывается условие асинхронного сброса. Для всех сигналов, имеющих присвоения внутри ветки с условием, создаются триггеры

44

Page 45: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

• Использование условий (CLK’event and CLK=’1’) или (CLK’event and CLK=’0’) в двух и более ветках оператора IF означает что описывается триггер с двумя тактовыми сигналами. Таких триггеров в ПЛИС нет, а применение таких триггеров в ASIC нежелательно.

• Все последовательные описания синтезируется в комбинационную схему, если описание заключено в ветку IF с условием (CLK’event and CLK=’1’) или (CLK’event and CLK=’0’) , то к выходу такой комбинационной схемы подключается один или несколько триггеров (в зависимости от количества сигналов, используемых в описании и их разрядности).

• Если последовательное описание содержит исключительно асинхронную логику, то необходимо, чтобы используемые в нем сигналы имели назначение в каждой из альтернативных веток. Отсутствие такого назначения приводит к тому, что при выполнении этой ветки сигнал должен принимать свое старое значение). На самом деле для таких сигналов синтезируются триггеры, управляемые уровнем (LATCH).

Правила описания синтезируемых конструкций на VHDL

45

Page 46: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

Latch- это триггер, управляемый уровнем разрешающего сигнала (см. рис 2.1). Такой триггер формируется при использовании описаний, подобных представленному на следующем листинге:

Latch_Data: process(Latch_Open, D_Input)beginif (Latch_Enable = ’1’) then

Q <= D;-- If Latch_Enable = 0, then Q сохраняет свое старое значение,-- то есть Latch закрыта.end if;end process Latch_Data;

Использование LATCH - триггеров имеет следующие недостатки:•В случае появления помех, вызванных гонками сигналов, на линии

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

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

•Путь сигнала проходящего через LACH плохо поддается временному анализу.

Правила описания синтезируемых конструкций на VHDL

46

Page 47: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

•Операторы IF, WHEN/ELSE приводят к созданию приоритетной логики.•Операторы CASE и WITH/SELECT/WHEN, приводят к созданию безприоритетной логики.•Количество используемых LUT и уровень их каскадирования для реализации некоторой функции можно оценить следующим образом: 1) определяется количество входов функции n, 2) определяется минимальное количество каскадов LUT ]log4n[. (для n=1..4 – 1 уровень, для n=5..16 – 2 уровня LUT).

Правила описания синтезируемых конструкций на VHDL

47

Page 48: V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)

•Тактовые сигналы имеют обычно иные электрические характеристики, чем сигналы дынных. Это связано с большим коэффициентом разветвления тактового сигнала, а так же с необходимостью одновременного тактирования нескольких триггеров, что обуславливается минимальным временем задержки на линии тактового сигнала. Поэтому для тактирования используются только тактовые сигналы, а не линии данных. То есть с выхода триггера нельзя брать тактовый сигнал. Если все-таки необходимо тактировать схему с выхода триггера, то между ним и тактовым входом другого триггера вставляется специальный буфер. Тип и название буфера определяется технологией ПЛИС (или ASIC), для XILINX, в библиотеке UNISIM имеется буфер GCLK.•Тактирование схемы должно быть однокаскадным. Однако это не мешает строить несколько схем (модулей), с тактированием разными тактовыми сигналами (тактовыми доменами). •Если необходимо управлять триггером более медленным тактовым сигналом, кратным основному тактовому, можно использовать сигнал разрешения тактирования.

Правила описания синтезируемых конструкций на VHDL

48