v.ii Основы языка vhdle-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...v.ii...
TRANSCRIPT
V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language)
Стандарт VHDL-87, Стандарт VHDL-93, Стандарт VHDL-AMS
Язык VHDL используется для:- описания поведения цифровых устройств во времени и при изменении
входных воздействий;- описания структуры цифровых устройств с различной степенью детализации
(на системном и блочном уровнях, на уровне регистровых передач, на уровне вентилей);
- моделирования цифровых устройств;- описания тестовых воздействий при моделировании устройств;- автоматизации преобразования исходного описания схемы в описание на
более низком уровне (вплоть до вентильного уровня).
Стили описания: - поведенческий стиль, при котором для описания проекта используются
причинно-следственные связи между событиями на входах устройства и событиями на его выходах (без уточнения структуры);
- структурный стиль описания, при котором устройство представляется в виде иерархии взаимосвязанных простых устройств (подобно стилю, принятому в схемотехнике);
- потоковый стиль описания устройства основан на использовании логических уравнений, каждое из которых преобразует один или несколько входных информационных потоков в выходные потоки. 1
Объекты 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
Базовые типы данных, описанные в библиотеке 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
Объявление атрибута:
<Объявление Атрибута> ::=<Объявление Атрибута> ::=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
Константы и сигналы Константы и сигналы
<Константа> ::=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
Пример декларации и инициализации сигнала:
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
Сигнал типа 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
•‘U’ – цепь не инициализирована, используется при моделировании. Например если мы попытаемся прочитать ячейку память в которою до этого не было записи то получим такое значение.
•‘X’ – неизвестное значение. Отражает ситуацию подключения к одной и той же цепи двух драйверов, причем один выдает ‘1’, а другой ‘0’.
•‘0’, ‘1’ – логический ‘0’ или ‘1’ соответственно.
•‘Z’ – высокий импеданс.
•‘L’ – цепь подключена к терминальному резистору уровня ‘0’. Например мы имеем тристабильный буфер, выход которого подключен через резистор к земле, притом сам буфер выключен.
•‘H’ – цепь подключена к терминальному резистору уровня ‘1’. Например мы имеем тристабильный буфер, выход которого подключен через резистор к питанию, притом сам буфер выключен.
•‘W’ – цепь одновременно подключена к терминальному резистору уровня ‘0’ и терминальному резистору уровня ‘1’.
•‘-‘ – не имеет значения (безразлично). Используется при описании устройств, в которых значение на выходе схемы в некоторых случаях не зависит от значения на входе, например, шифратора. (В картах Карно такие значения обозначались как α )
Сигнал типа STD_LOGIC Сигнал типа STD_LOGIC
8
Операции Операции VHDLVHDL Тип операций Обозначения Комментарий
Логические АNDORNANDNORXORXNOR
Логическое ИЛогическое ИЛИЛогическое И-НЕЛогическое ИЛИ-НЕИсключающее ИЛИЭквивалентность
Сравнения =/=<><=>=
РавенствоНеравенствоМеньшеБольшеМеньше или равноБольше или равно
Сдвига SLLSRLSLASRAROLROR
Сдвиг влево логическийСдвиг вправо логическийСдвиг влево арифметическийСдвиг вправо арифметическийСдвиг влево циклическийСдвиг вправо циклический
Знака и сложения
+-&
Сложение (знак +)Вычитание (знак -)Конкатенация
Умножения */MODREM
УмножениеДеление (синтезируются ограничено)Модуль (синтезируются ограничено)Остаток (синтезируются ограничено)
Смешанные ABSNOT**
Абсолютное значениеОтрицаниеСтепень
9
Примеры выполнения операций над объектами:
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
Интерфейс и архитектура устройств Интерфейс и архитектура устройств <Интерфейс> ::= <Интерфейс> ::= 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
Упрощенный синтаксис конструкции 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
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
Пакеты и библиотеки Пакеты и библиотеки
<Интерфейс пакета> ::=<Интерфейс пакета> ::=PACKAGEPACKAGE <Имя пакета> <Имя пакета> isis
<Декларативная часть><Декларативная часть>ENDEND [ [ PACKAGEPACKAGE ] [ <Имя> ] ; ] [ <Имя> ] ;<Тело пакета> ::=<Тело пакета> ::=PACKAGEPACKAGE BODYBODY <Имя пакета> <Имя пакета> isis
<Декларативная часть><Декларативная часть>ENDEND [ [ PACKAGEPACKAGE ] [ <Имя пакета> ] ; ] [ <Имя пакета> ] ;
<Подключение библиотеки> ::= <Подключение библиотеки> ::= LIBRARYLIBRARY <Имя библиотеки> { , <Имя библиотеки> }; <Имя библиотеки> { , <Имя библиотеки> };<Использование Пакета>::=<Использование Пакета>::=<Имя библиотеки>.<Имя пакета>.<Символьное имя> | <Идентификатор> | <Имя библиотеки>.<Имя пакета>.<Символьное имя> | <Идентификатор> | ALLALL;;
Пакеты объединяются в библиотеки (LIBRARY)
Декларация пакета состоит из описания интерфейса и описания тела.
14
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
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
Параллельные операторы Операторы данной группы описывают параллельно функционирующие части устройства. К таким операторам относятся:
•Блоки (BLOCK);•Процессы (PROCESS);•Параллельные вызовы процедур;•Параллельные присваивания сигналов (<=); •Параллельные операторы – ловушки (ASSERT);•Экземпляры компонентов (COMPONENT);
Оператор BLOCK позволяет описать группу параллельных операторов:
<Блок> ::= <Блок> ::= [<Метка>] : [<Метка>] : BLOCKBLOCK [( <Охранное выражение> )] [[( <Охранное выражение> )] [ISIS]] [[GENERICGENERIC (<Объявление настроечных констант>); (<Объявление настроечных констант>);]] [[GENERIC MAPGENERIC MAP ( Список связывания настроечных констант );] ( Список связывания настроечных констант );] [[PORTPORT (<Объявление портов>);] (<Объявление портов>);] [[PORT MAPPORT MAP ( <Список Связывания портов> )] ( <Список Связывания портов> )] <Декларативная часть><Декларативная часть> BEGINBEGIN <Параллельные операторы><Параллельные операторы> END BLOCKEND BLOCK [<Метка>];[<Метка>];
Оператор Оператор BLOCKBLOCK
17
Пример описания устройства с использованием иерархии блоков:
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
Оператор 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
Оператор параллельного присваивания сигнала эквивалентен процессу, в котором, при определенных условиях, происходит присваивание сигналу нового значения
<Параллельное присваивание сигнала>::=<Параллельное присваивание сигнала>::=[ <Метка> : ] [ [ <Метка> : ] [ POSTPONEDPOSTPONED ] <Условное присваивание сигнала>] <Условное присваивание сигнала>| [ <Метка> : ] [ | [ <Метка> : ] [ POSTPONEDPOSTPONED ] <Присваивание сигнала>] <Присваивание сигнала>
<Условное присваивание сигнала> ::=<Условное присваивание сигнала> ::=<Сигнал><Сигнал><=<= <Опции> { <Образец> <Опции> { <Образец> WHENWHEN <Условие> <Условие> ELSEELSE }}<Образец> [ <Образец> [ WHENWHEN <Условие> ]; <Условие> ];
<Присваивание сигнала> ::=<Присваивание сигнала> ::=WITHWITH <Выражение> <Выражение> SELECTSELECT<Сигнал> <Сигнал> <=<= <Опции> { <Образец> <Опции> { <Образец> WHENWHEN <Значение>, } <Значение>, }<Образец> <Образец> WHENWHEN <Значение>; <Значение>;
<Опции> ::= [ <Опции> ::= [ GUARDEDGUARDED ] [ <Способ задержки> ] ] [ <Способ задержки> ]
<Образец> ::=<Образец> ::=<Выражение> [ <Выражение> [ AFTERAFTER <Время> ]| <Время> ]| NULLNULL [ [ AFTERAFTER <Время> ] <Время> ]
Оператор параллельного присваивания сигналаОператор параллельного присваивания сигнала
20
Динамический триггер:
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
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
Другим способом группировки последовательных действий являются процедуры и функции:
<Процедура> ::=<Процедура> ::=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
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
Для упрощения отладки в языке VHDL используется оператор - ловушка ASSERT, позволяющий выполнить в ходе моделирования проверочное сравнение, и, при обнаружении ошибки (ложном значении выражения), выдать заданное сообщение.
<<СообщениеСообщение> ::=> ::=[<[<МеткаМетка> :] [> :] [POSTPONEDPOSTPONED] ] ASSERTASSERT < <ВыражениеВыражение> [> [REPORTREPORT < <СообщениеСообщение>] >] [[SEVERITYSEVERITY < <ТипТип сообщениясообщения>];>];
Пример сообщения:
ASSERTASSERT D =’1’ D =’1’REPORTREPORT “Ошибка, “Ошибка, D D не равно 1”;не равно 1”;
Для использования устройства в виде компонента другого устройства необходимо объявить его в декларативной части конструкции ARCHITECTURE:
Оператор - ловушка Оператор - ловушка ASSERTASSERT
25
Использования компонентовИспользования компонентов
После этого можно создать экземпляр компонента в описательной части ARCHITECTURE при помощи конструкции использования:
Для использования устройства в виде компонента другого устройства необходимо объявить его в декларативной части конструкции ARCHITECTURE:
<ЭКЗЕМПЛЯР компонента><ЭКЗЕМПЛЯР компонента> ::= ::=<Метка экземпляра>: <Имя компонента> <Метка экземпляра>: <Имя компонента> GENERIC MAP GENERIC MAP ( <Значения настроечных констант> )( <Значения настроечных констант> )PORT MAP PORT MAP ( <Список соответствий сигналов> );( <Список соответствий сигналов> );
<Объявление компонента> ::= <Объявление компонента> ::= COMPONENTCOMPONENT <Имя компонента> <Имя компонента>GENERICGENERIC <Список настроечных параметров>;<Список настроечных параметров>;PORTPORT <<СписокСписок портовпортов>;>;END COMPONENTEND COMPONENT;;
26
-- Пример использования компонент-- Пример использования компонент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
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
Оператор 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
Последовательные операторы Последовательные операторы используются для описания алгоритма функционирования параллельных процессов и подпрограмм. Их исполнение происходит в той последовательности, в которой они описаны в программе. Последовательными операторами являются:
•оператор WAIT;•оператор – ловушка ASSERT;•оператор сообщения REPORT;•оператор присваивания сигнала и оператор условного присваивания сигнала;•оператор присваивания переменной;•вызов процедуры;•оператор IF;•оператор CASE;•оператор цикла LOOP;•оператор NEXT;•оператор EXIT;•оператор RETURN;•пустой оператор NULL.
30
Оператор ожидания 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
Последовательный оператор присваивание сигнала служит для изменения значения сигнала и используется внутри процесса.
<Присваивание сигнала> ::=<Присваивание сигнала> ::=[ <метка> :] <сигнал> <= [ <способ задержки> ] <образец> ;[ <метка> :] <сигнал> <= [ <способ задержки> ] <образец> ;<способ задержки> ::= <способ задержки> ::= 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
Присваивание значения переменной подобно операторам присваивания в языках программирования. Синтаксис оператора присваивания переменной:
<Присваивание переменной> ::=<Присваивание переменной> ::=[ <метка> :] <Переменная> := <Выражение>;[ <метка> :] <Переменная> := <Выражение>;
Пример присваивания переменной:
i := i - 1;
Оператор вызова подпрограммы служит для исполнения алгоритма, описанного в процедуре или функции:
<Вызов подпрограммы> ::= <Вызов подпрограммы> ::= [ <Метка> : ] <Имя процедуры или функции> [ ( <Список формальных [ <Метка> : ] <Имя процедуры или функции> [ ( <Список формальных параметров>) ];параметров>) ];
Присваивание значения переменнойПрисваивание значения переменной
Оператор вызова подпрограммыОператор вызова подпрограммы
33
Условный оператор IF позволяет описать устройство, в алгоритме работы которого по результатам проверки заданных условий разрешается исполнение одной (или нуля) групп последовательных операторов. Выполнение последовательных операторов разрешается, если заданное условие истинно.
<Условный оператор> ::=<Условный оператор> ::=[ <Метка> :] [ <Метка> :] IFIF <Условие> <Условие> THENTHEN
<Последовательные операторы><Последовательные операторы>{ { ELSIFELSIF <Условие> <Условие> THENTHEN
<Последовательные операторы>}<Последовательные операторы>}[ [ ELSEELSE
<Последовательные операторы>]<Последовательные операторы>]END IFEND IF [ <Метка> ]; [ <Метка> ];
Условный оператор Условный оператор IFIF
34
Пример описания шифратора с помощью условного оператора:
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
Оператор выбора 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
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
Оператор цикла позволяет описать часть устройства, алгоритм работы которой представляет из себя повторяющиеся действия.
<Цикл> ::=<Цикл> ::=[ <Метка> : ][ <Метка> : ][ [ 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
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
Пример описание устройств с тремя состояниями выходов Пример описание устройств с тремя состояниями выходов
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
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
Пример описания ОЗУ Пример описания ОЗУ
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
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
Правила описания синтезируемых конструкций на VHDL • Необходимо максимально использовать поведенческий стиль
описания. При структурном описании нижние модули иерархии должны выполнять законченные функции. Обычно поведенческое описание модуля содержит 30 – 500 строк кода или от 1 до 10 процессов.
• Процесс, по возможности должен содержать один – два оператора на верхнем уровне.
• Для создания триггера, защелкиваемого по перепаду сигнала можно использовать условие CLK’event and CLK=’1’ или CLK’event and CLK=’0’ (в первом случае отслеживается фронт, во втором спад.) Это условие используется совместно с оператором IF, причем если оно следует после ELSIF то после IF этого же оператора обычно описывается условие асинхронного сброса. Для всех сигналов, имеющих присвоения внутри ветки с условием, создаются триггеры
44
• Использование условий (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
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
•Операторы IF, WHEN/ELSE приводят к созданию приоритетной логики.•Операторы CASE и WITH/SELECT/WHEN, приводят к созданию безприоритетной логики.•Количество используемых LUT и уровень их каскадирования для реализации некоторой функции можно оценить следующим образом: 1) определяется количество входов функции n, 2) определяется минимальное количество каскадов LUT ]log4n[. (для n=1..4 – 1 уровень, для n=5..16 – 2 уровня LUT).
Правила описания синтезируемых конструкций на VHDL
47
•Тактовые сигналы имеют обычно иные электрические характеристики, чем сигналы дынных. Это связано с большим коэффициентом разветвления тактового сигнала, а так же с необходимостью одновременного тактирования нескольких триггеров, что обуславливается минимальным временем задержки на линии тактового сигнала. Поэтому для тактирования используются только тактовые сигналы, а не линии данных. То есть с выхода триггера нельзя брать тактовый сигнал. Если все-таки необходимо тактировать схему с выхода триггера, то между ним и тактовым входом другого триггера вставляется специальный буфер. Тип и название буфера определяется технологией ПЛИС (или ASIC), для XILINX, в библиотеке UNISIM имеется буфер GCLK.•Тактирование схемы должно быть однокаскадным. Однако это не мешает строить несколько схем (модулей), с тактированием разными тактовыми сигналами (тактовыми доменами). •Если необходимо управлять триггером более медленным тактовым сигналом, кратным основному тактовому, можно использовать сигнал разрешения тактирования.
Правила описания синтезируемых конструкций на VHDL
48