V.II Основы языка VHDLe-learning.bmstu.ru/moodle/pluginfile.php/2908/mod...V.II...

Preview:

Citation preview

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

Recommended