Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 10 лет назад пользователемВладислав Фофанов
1 V.II Основы языка VHDL (Very high speed integration circuits Hardware Description Language) Стандарт VHDL-87, Стандарт VHDL-93, Стандарт VHDL-AMS Язык VHDL используется для: - описания поведения цифровых устройств во времени и при изменении входных воздействий; - описания структуры цифровых устройств с различной степенью детализации (на системном и блочном уровнях, на уровне регистровых передач, на уровне вентилей); - моделирования цифровых устройств; - описания тестовых воздействий при моделировании устройств; - автоматизации преобразования исходного описания схемы в описание на более низком уровне (вплоть до вентильного уровня). Стили описания: - поведенческий стиль, при котором для описания проекта используются причинно-следственные связи между событиями на входах устройства и событиями на его выходах (без уточнения структуры); - структурный стиль описания, при котором устройство представляется в виде иерархии взаимосвязанных простых устройств (подобно стилю, принятому в схемотехнике); - потоковый стиль описания устройства основан на использовании логических уравнений, каждое из которых преобразует один или несколько входных информационных потоков в выходные потоки. 1
2 Объекты VHDL и их типы ::= TYPE IS ; ::= TYPE IS ; ::= SUBTYPE IS ; ::= SUBTYPE IS ; TYPE Multi_Level_Logic IS (LOW, HIGH, RISING, FALLING, AMBIGUOUS); TYPE BIT IS ('0','1') ; TYPE BYTE_LENGTH_INTEGER IS RANGE 0 TO 255; TYPE WORD_INDEX IS RANGE 31 DOWNTO 0; SUBTYPE HIGH_BIT_LOW IS BYTE_LENGTH_INTEGER RANGE 0 TO 127; TYPE MY_WORD IS ARRAY (0 TO 31) OF BIT ; TYPE STATE_TYPE IS (s0,s1,s2,s3); Объекты могут относится к следующим категориям: константы; сигналы; переменные; файлы. В VHDL применяется строгая типизация, при которой для выполнение действий над разнотипными объектами требуется явно преобразовать их к одному и тому же типу. Упрощенный синтаксис описания типа и подтипа: 2
3 Базовые типы данных, описанные в библиотеке STANDARD (автоматически подключается для всех проектов во всех САПР) ТипЗначения/Диапазон Перечислимые типы BOOLEANTRUE,FALSE BIT0,1 BIT_VECTORМассив элементов BIT с индексами от 0 до SEVERITY_LEVELNOTE, WARNING, ERROR, FAILURE FILE_OPEN_KINDREAD_MODE, WRITE_MODE, APPEND_MODE FILE_OPEN_STATUSOPEN_OK, STATUS_ERROR, NAME_ERROR, MODE_ERROR Целочисленные типы INTEGER – … POSITIV 1…… NATURAL 0…… Типы чисел с плавающей запятой REAL –1.0E38 … +1.0E38 Символьные типы STRINGМассив элементов CHARACTER с индексами от 1 до Физические типы TIME – … DELAY_LENGTH 0…
4 Объявление атрибута: ::= ::= ATTRIBUTE : ; Спецификация атрибута: ::= ::= ATTRIBUTE of : IS ; ::= [ {, } ] | OTHERS | ALL ::= [ {, } ] | OTHERS | ALL ::= ENTITY | ARCHITECTURE | CONFIGURATION ::= ENTITY | ARCHITECTURE | CONFIGURATION | PROCEDURE | FUNCTION | PACKAGE | TYPE | SUBTYPE | CONSTANT | SIGNAL | VARIABLE | COMPONENT | LABEL | LITERAL | UNITS | GROUP | FILE ::= [ ] ::= [ ] ::= | | ::= | | ATTRIBUTE state_vector : string; ATTRIBUTE state_vector OF fsm : ARCHITECTURE IS "current_state"; ATTRIBUTE state_vector OF fsm : ARCHITECTURE IS "current_state"; Атрибуты 4
5 Константы и сигналы ::= CONSTANT : [ := ] CONSTANT A: TIME := 30ns; Сигналы – это объекты, обладающие историей изменения (прошлым состоянием и текущим состоянием) ::= ::= SIGNAL : [ ] [ := ] ; ::= REGISTER | BUS ::= REGISTER | BUS Для каждого сигнала предопределены следующие атрибуты, поддерживаемые программами синтеза (на примере сигнала s): - sstable[(T)] – атрибут равен значению true, если за время T сигнал не изменял своего состояния. - stransaction – атрибут типа bit, изменяющий состояние на противоположное при каждом присваивании нового значения сигналу s. - sevent – атрибут, равный true, если в данном цикле моделирования произошло изменение сигнала s. - sactive – атрибут равен true, если в данном цикле моделирования произошло присваивание нового значения сигналу s. - slast_value - атрибут, равный сигналу s до момента его последнего изменения. 5
6 Пример декларации и инициализации сигнала: SIGNAL B: BIT_VECTOR(3 DOWNTO 0):=0000; Пример присвоения значения сигналу: B
7 Сигнал типа 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
8 U – цепь не инициализирована, используется при моделировании. Например если мы попытаемся прочитать ячейку память в которою до этого не было записи то получим такое значение. X – неизвестное значение. Отражает ситуацию подключения к одной и той же цепи двух драйверов, причем один выдает 1, а другой 0. 0, 1 – логический 0 или 1 соответственно. Z – высокий импеданс. L – цепь подключена к терминальному резистору уровня 0. Например мы имеем тристабильный буфер, выход которого подключен через резистор к земле, притом сам буфер выключен. H – цепь подключена к терминальному резистору уровня 1. Например мы имеем тристабильный буфер, выход которого подключен через резистор к питанию, притом сам буфер выключен. W – цепь одновременно подключена к терминальному резистору уровня 0 и терминальному резистору уровня 1. - – не имеет значения (безразлично). Используется при описании устройств, в которых значение на выходе схемы в некоторых случаях не зависит от значения на входе, например, шифратора. (В картах Карно такие значения обозначались как α ) Сигнал типа STD_LOGIC 8
9 Операции VHDL Тип операцийОбозначенияКомментарий Логические АND OR NAND NOR XOR XNOR Логическое И Логическое ИЛИ Логическое И-НЕ Логическое ИЛИ-НЕ Исключающее ИЛИ Эквивалентность Сравнения = /= < > = Равенство Неравенство Меньше Больше Меньше или равно Больше или равно Сдвига SLL SRL SLA SRA ROL ROR Сдвиг влево логический Сдвиг вправо логический Сдвиг влево арифметический Сдвиг вправо арифметический Сдвиг влево циклический Сдвиг вправо циклический Знака и сложения +-&+-& Сложение (знак +) Вычитание (знак -) Конкатенация Умножения * / MOD REM Умножение Деление (синтезируются ограничено) Модуль (синтезируются ограничено) Остаток (синтезируются ограничено) Смешанные ABS NOT ** Абсолютное значение Отрицание Степень 9
10 Примеры выполнения операций над объектами: result
11 Интерфейс и архитектура устройств ::= ::= ENTITY IS [GENERICS ] [PORT ] [ BEGIN ] ] END [ ENTITY ] [ ] ; Упрощенный синтаксис декларации порта ::= ::= PORT( {; }); ::= : ::= : ::= BUFFER|IN|OUT|INOUT|LINKAGE ::= BUFFER|IN|OUT|INOUT|LINKAGE Пример конструкции ENTITY: ENTITY Decoder IS PORT ( inp: IN std_logic_vector(2 DOWNTO 0); outp: OUT std_logic_vector(7 DOWNTO 0)); outp: OUT std_logic_vector(7 DOWNTO 0)); END Decoder; 11
12 Упрощенный синтаксис конструкции ARCHITECTURE: ::= ::= ARCHITECTURE OF IS BEGIN END [ ARCHITECTURE ] [ ] ; Пример описания устройства: -- Комментарий: Интерфейс полного сумматора ENTITY Full_Adder IS PORT (X, Y, Cin:IN Bit; Cout, Sum:OUT Bit) ; END Full_Adder ; -- Комментарий: Архитектура 1 полного сумматора (потоковый стиль) ARCHITECTURE DataFlow1 OF Full_Adder IS SIGNAL A,B: Bit; 12
13 BEGIN A
14 Пакеты и библиотеки ::= ::= PACKAGE is END [ PACKAGE ] [ ] ; ::= ::= PACKAGE BODY is END [ PACKAGE ] [ ] ; ::= ::= LIBRARY {, }; ::= ::=.. | | ALL;.. | | ALL; Пакеты объединяются в библиотеки (LIBRARY) Декларация пакета состоит из описания интерфейса и описания тела. 14
15 PACKAGE TriState IS TYPE Tri IS ('0', '1', 'Z', 'E'); FUNCTION BitVal (Value: Tri) RETURN Bit ; FUNCTION TriVal (Value: Bit) RETURN Tri; TYPE TriVector IS ARRAY (Natural RANGE ) OF Tri ; FUNCTION Resolve (Sources: TriVector) RETURN Tri ; END PACKAGE TriState ; PACKAGE BODY TriState IS FUNCTION BitVal (Value: Tri) RETURN Bit IS CONSTANT Bits : Bit_Vector := "0100"; BEGIN RETURN Bits(Tri'Pos(Value)); END; FUNCTION TriVal (Value: Bit) RETURN Tri IS BEGIN RETURN Tri'Val(Bit'Pos(Value)); END; 15
16 FUNCTION Resolve (Sources: TriVector) RETURN Tri IS VARIABLE V: Tri := 'Z'; BEGIN FOR i IN Sources'Range LOOP IF Sources(i) /= 'Z' THEN IF V = 'Z' THEN V := Sources(i); ELSE RETURN 'E'; END IF; END LOOP; RETURN V; END; END PACKAGE BODY TriState ; 16
17 Параллельные операторы Операторы данной группы описывают параллельно функционирующие части устройства. К таким операторам относятся: Блоки (BLOCK); Процессы (PROCESS); Параллельные вызовы процедур; Параллельные присваивания сигналов (
18 Пример описания устройства с использованием иерархии блоков: C: BLOCK BEGIN X: BLOCK PORT (P1, P2: INOUT BIT); --объявление портов PORT MAP (P1 => S1, P2 => S2); --связывание портов CONSTANT Delay: DELAY_LENGTH := 1 ms; --декларации SIGNAL P3: BIT; BEGIN P3
19 Оператор PROCESS описывает независимые группы последовательных операторов в виде параллельных процессов. Упрощенный синтаксис оператора PROCESS: ::= [ :][POSTPONED] PROCESS ( ) [IS] BEGIN END [POSTPONED] PROCESS [ ] ; Пример описания динамического триггера с использованием процесса: FF: PROCESS (CLK,RST,WE) BEGIN IF RST='1' THEN IF RST='1' THEN D
20 Оператор параллельного присваивания сигнала эквивалентен процессу, в котором, при определенных условиях, происходит присваивание сигналу нового значения ::= ::= [ : ] [ POSTPONED ] [ : ] [ POSTPONED ] | [ : ] [ POSTPONED ] | [ : ] [ POSTPONED ] ::= ::= { WHEN ELSE } { WHEN ELSE } [ WHEN ]; [ WHEN ]; ::= ::= WITH SELECT { WHEN, } { WHEN, } WHEN ; WHEN ; ::= [ GUARDED ] [ ] ::= [ GUARDED ] [ ] ::= ::= [ AFTER ]| NULL [ AFTER ] [ AFTER ]| NULL [ AFTER ] Оператор параллельного присваивания сигнала 20
21 Динамический триггер: ENTITY ff IS PORT (RST,CLK,WE: IN std_logic; PORT (RST,CLK,WE: IN std_logic; D_IN: IN std_logic; D_IN: IN std_logic; D: OUT std_logic); D: OUT std_logic); END ff; ARCHITECTURE DataFlow OF ff IS BEGIN D
22 ARCHITECTURE DataFlow OF decoder IS BEGIN outp(0)
23 Другим способом группировки последовательных действий являются процедуры и функции: ::= ::= PROCEDURE [ ( ) ] |[PURE|IMPURE] FUNCTION [( ) ] RETURN RETURN Пример объявления и параллельного вызова процедуры: ENTITY sort4 IS GENERIC (top : integer :=3); GENERIC (top : integer :=3); PORT ( PORT ( a, b, c, d : IN bit_vector(0 TO top); a, b, c, d : IN bit_vector(0 TO top); ra, rb, rc, rd : OUT bit_vector(0 TO top) ra, rb, rc, rd : OUT bit_vector(0 TO top) ); ); END sort4; ARCHITECTURE muxes OF sort4 IS PROCEDURE sort2(SIGNAL x, y : IN bit_vector(0 TO top); PROCEDURE sort2(SIGNAL x, y : IN bit_vector(0 TO top); SIGNAL g, l : OUT bit_vector(0 TO top) SIGNAL g, l : OUT bit_vector(0 TO top) ) IS ) IS BEGIN BEGIN Процедуры и функции 23
24 IF x > y THEN g
25 Для упрощения отладки в языке VHDL используется оператор - ловушка ASSERT, позволяющий выполнить в ходе моделирования проверочное сравнение, и, при обнаружении ошибки (ложном значении выражения), выдать заданное сообщение. ::= ::= [ :] [POSTPONED] ASSERT [REPORT ] [SEVERITY ]; Пример сообщения: ASSERT D =1 REPORT Ошибка, D не равно 1; Для использования устройства в виде компонента другого устройства необходимо объявить его в декларативной части конструкции ARCHITECTURE: Оператор - ловушка ASSERT 25
26 Использования компонентов После этого можно создать экземпляр компонента в описательной части ARCHITECTURE при помощи конструкции использования: Для использования устройства в виде компонента другого устройства необходимо объявить его в декларативной части конструкции ARCHITECTURE: ::= ::= : : GENERIC MAP ( ) PORT MAP ( ); ::= ::= COMPONENT COMPONENT GENERIC ; PORT ; END COMPONENT; 26
27 -- Пример использования компонент LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; USE ieee.std_logic_unsigned.ALL; ENTITY adder IS GENERIC ( n: INTEGER:=16); GENERIC ( n: INTEGER:=16); PORT ( a,b: IN std_logic_vector (n-1 DOWNTO 0); PORT ( a,b: IN std_logic_vector (n-1 DOWNTO 0); result: OUT std_logic_vector(n-1 DOWNTO 0)); result: OUT std_logic_vector(n-1 DOWNTO 0)); END adder; ARCHITECTURE behave OF adder IS BEGIN result
28 PORT(a,b,c: IN std_logic_vector(op_n-1 DOWNTO 0); result: OUT std_logic_vector(sum_n-1 DOWNTO 0)); result: OUT std_logic_vector(sum_n-1 DOWNTO 0)); END adders; ARCHITECTURE behave OF adders IS COMPONENT adder COMPONENT adder GENERIC ( n:INTEGER:=op_n); GENERIC ( n:INTEGER:=op_n); PORT ( a,b: IN std_logic_vector(n-1 DOWNTO 0); PORT ( a,b: IN std_logic_vector(n-1 DOWNTO 0); result: OUT std_logic_vector(n-1 DOWNTO 0)); result: OUT std_logic_vector(n-1 DOWNTO 0)); END COMPONENT; END COMPONENT; SIGNAL rez: std_logic_vector(sum_n-1 DOWNTO 0); SIGNAL rez: std_logic_vector(sum_n-1 DOWNTO 0);BEGIN a1:adder a1:adder PORT MAP ( a => a, b=>b, result=>rez); PORT MAP ( a => a, b=>b, result=>rez); a2:adder a2:adder PORT MAP ( a=>rez, PORT MAP ( a=>rez,b=>c, result => result); result => result); END behave; 28
29 Оператор GENERATE обеспечивает возможность итеративного или условного повторения деклараций и операторов. ::= ::= [ :] GENERATE [ BEGIN] [ ] [ ] END GENERATE [ ]; ::= FOR IN | IF ::= FOR IN | IF Пример конструкции GENERATE: Gen: BLOCK --двоичное дерево BEGIN L1: CELL PORT MAP (Top, Bus(1), Bus(2)) ; --Top,Left,Right L2: FOR I IN 1 to 7 GENERATE L3: FOR J IN 0 TO 2**I-1 GENERATE L5: CELL PORT MAP (Bus(2**I+J-1), Bus((2**I+J)*2-1), Bus(2**I+J)*2); END GENERATE ; END BLOCK Gen; Оператор GENERATE 29
30 Последовательные операторы Последовательные операторы используются для описания алгоритма функционирования параллельных процессов и подпрограмм. Их исполнение происходит в той последовательности, в которой они описаны в программе. Последовательными операторами являются: оператор WAIT; оператор – ловушка ASSERT; оператор сообщения REPORT; оператор присваивания сигнала и оператор условного присваивания сигнала; оператор присваивания переменной; вызов процедуры; оператор IF; оператор CASE; оператор цикла LOOP; оператор NEXT; оператор EXIT; оператор RETURN; пустой оператор NULL. 30
31 Оператор ожидания WAIT позволяет приостановить исполнение процесса или подпрограммы. ::= ::= [ ] [UNTIL ] [FOR ]; Пример использования оператора WAIT: WAIT ON Clk; ::= ::= [ :] ASSERT [REPORT ] [SEVERITY ]; Пример использования ASSERT и REPORT: ASSERT (IRDY_N = '0') REPORT "Target device: FRAME signal deassertion error. IRDY is not asserted." SEVERITY ERROR; Оператор ожидания WAIT Оператор-ловушка ASSERT 31
32 Последовательный оператор присваивание сигнала служит для изменения значения сигнала и используется внутри процесса. ::= ::= [ :] ] ; ::= TRANSPORT ::= TRANSPORT |[REJECT ] INERTIAL ::= ::= [ AFTER ]| NULL [ AFTER ] [ AFTER ]| NULL [ AFTER ] Пример присваивания сигнала: P3
33 Присваивание значения переменной подобно операторам присваивания в языках программирования. Синтаксис оператора присваивания переменной: ::= ::= [ :] := ; Пример присваивания переменной: i := i - 1; Оператор вызова подпрограммы служит для исполнения алгоритма, описанного в процедуре или функции: ::= ::= [ : ] [ ( ) ]; Присваивание значения переменной Оператор вызова подпрограммы 33
34 Условный оператор IF позволяет описать устройство, в алгоритме работы которого по результатам проверки заданных условий разрешается исполнение одной (или нуля) групп последовательных операторов. Выполнение последовательных операторов разрешается, если заданное условие истинно. ::= ::= [ :] IF THEN { ELSIF THEN } } [ ELSE ] ] END IF [ ]; Условный оператор IF 34
35 Пример описания шифратора с помощью условного оператора: ENTITY encoder IS PORT ( in1 :IN std_logic_vector(7 DOWNTO 0); out1 :OUT std_logic_vector(2 DOWNTO 0)); out1 :OUT std_logic_vector(2 DOWNTO 0)); END encoder; ARCHITECTURE behave OF encoder IS BEGIN PROCESS (in1) PROCESS (in1) BEGIN BEGIN IF in1(7) = '1' THEN out1
36 Оператор выбора CASE разрешает исполнение одного из многих альтернативных блоков последовательных операторов. Выбор блока среди альтернатив выполняется при совпадении значения выражения с образцом. ::= ::= [ : ] case is when => when => { when => } end case [ ] ; Пример использования оператора выбора при описании дешифратора: LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY decoder IS PORT ( inp: IN std_logic_vector(2 DOWNTO 0); outp: OUT std_logic_vector(7 DOWNTO 0)); outp: OUT std_logic_vector(7 DOWNTO 0)); END decoder; Оператор выбора CASE 36
37 ARCHITECTURE behave OF decoder IS BEGIN BEGIN PROCESS (inp) BEGIN PROCESS (inp) BEGIN CASE inp IS WHEN "000" => outp outp outp outp outp outp outp outp outp outp outp outp outp outp outp outp outp outp outp outp outp outp outp outp outp outp outp outp outp outp outp outp outp outp outp outp ">
38 Оператор цикла позволяет описать часть устройства, алгоритм работы которой представляет из себя повторяющиеся действия. ::= ::= [ : ] [ WHILE | FOR IN ] LOOP END LOOP [ ]; Пример использования оператора цикла при описании шифратора: ENTITY encoder IS PORT ( a, b, c, d, e, f, g, h : IN std_logic; PORT ( a, b, c, d, e, f, g, h : IN std_logic; out2, out1, out0 : OUT std_logic); out2, out1, out0 : OUT std_logic); END encoder; ARCHITECTURE behave OF encoder IS BEGIN PROCESS (a, b, c, d, e, f, g, h) PROCESS (a, b, c, d, e, f, g, h) VARIABLE inputs : std_logic_vector (7 DOWNTO 0); VARIABLE inputs : std_logic_vector (7 DOWNTO 0); VARIABLE i : INTEGER ; VARIABLE i : INTEGER ; Оператор цикла 38
39 BEGIN INPUTS := (h, g, f, e, d, c, b, a); INPUTS := (h, g, f, e, d, c, b, a); i := 7; i := 7; WHILE i >= 0 AND inputs(i) /= '1' LOOP WHILE i >= 0 AND inputs(i) /= '1' LOOP i := i - 1; i := i - 1; END LOOP; END LOOP; IF ( i < 0) THEN IF ( i < 0) THEN i := 0; i := 0; END IF; END IF; -- conv_std_logic_vector (i, 3) - функция преобразования -- переменной типа integer в сигнал типа std_logic_vector -- Второй аргумент определяет размер вектора. (out2, out1, out0)
40 Пример описание устройств с тремя состояниями выходов LIBRARY ieee; USE ieee.std_logic_1164.all; -- Синтезируемое описание простого выходного буфера (драйвера) ENTITY tristate1 IS PORT ( input, enable : IN std_logic; output : OUT std_logic) ; END tristate1 ; ARCHITECTURE single_driver OF tristate1 IS BEGIN output
41 output
42 Пример описания ОЗУ LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_arith.ALL; USE ieee.std_logic_unsigned.ALL; ENTITY MEM_8_16_BE IS PORT ( PORT ( A : IN std_logic_vector(2 DOWNTO 0); A : IN std_logic_vector(2 DOWNTO 0); BE: IN std_logic_vector(1 DOWNTO 0); BE: IN std_logic_vector(1 DOWNTO 0); WE: IN std_logic; WE: IN std_logic; CLK: IN std_logic; CLK: IN std_logic; DIN: IN std_logic_vector(15 DOWNTO 0); DIN: IN std_logic_vector(15 DOWNTO 0); DOUT: OUT std_logic_vector(15 DOWNTO 0) DOUT: OUT std_logic_vector(15 DOWNTO 0) ); ); END MEM_8_16_BE; ARCHITECTURE BEHAV OF MEM_8_16_BE IS TYPE MEM_8_16 IS ARRAY (0 TO 7) OF std_logic_vector(7 DOWNTO 0); SIGNAL RAM0: MEM_8_16; SIGNAL RAM1: MEM_8_16; SIGNAL D:std_logic_vector(15 DOWNTO 0); 42
43 BEGIN OUT0: PROCESS (CLK,WE,A,BE) BEGIN IF (CLK'EVENT AND CLK='1') THEN IF (CLK'EVENT AND CLK='1') THEN IF ((WE = '1' OR WE = 'H') AND BE(0)='0') THEN IF ((WE = '1' OR WE = 'H') AND BE(0)='0') THEN RAM0(conv_integer(unsigned(A)))(7 DOWNTO 0)
44 Правила описания синтезируемых конструкций на VHDL Необходимо максимально использовать поведенческий стиль описания. При структурном описании нижние модули иерархии должны выполнять законченные функции. Обычно поведенческое описание модуля содержит 30 – 500 строк кода или от 1 до 10 процессов. Процесс, по возможности должен содержать один – два оператора на верхнем уровне. Для создания триггера, защелкиваемого по перепаду сигнала можно использовать условие CLKevent and CLK=1 или CLKevent and CLK=0 (в первом случае отслеживается фронт, во втором спад.) Это условие используется совместно с оператором IF, причем если оно следует после ELSIF то после IF этого же оператора обычно описывается условие асинхронного сброса. Для всех сигналов, имеющих присвоения внутри ветки с условием, создаются триггеры 44
45 Использование условий (CLKevent and CLK=1) или (CLKevent and CLK=0) в двух и более ветках оператора IF означает что описывается триггер с двумя тактовыми сигналами. Таких триггеров в ПЛИС нет, а применение таких триггеров в ASIC нежелательно. Все последовательные описания синтезируется в комбинационную схему, если описание заключено в ветку IF с условием (CLKevent and CLK=1) или (CLKevent and CLK=0), то к выходу такой комбинационной схемы подключается один или несколько триггеров (в зависимости от количества сигналов, используемых в описании и их разрядности). Если последовательное описание содержит исключительно асинхронную логику, то необходимо, чтобы используемые в нем сигналы имели назначение в каждой из альтернативных веток. Отсутствие такого назначения приводит к тому, что при выполнении этой ветки сигнал должен принимать свое старое значение). На самом деле для таких сигналов синтезируются триггеры, управляемые уровнем (LATCH). Правила описания синтезируемых конструкций на VHDL 45
46 Latch- это триггер, управляемый уровнем разрешающего сигнала (см. рис 2.1). Такой триггер формируется при использовании описаний, подобных представленному на следующем листинге: Latch_Data: process(Latch_Open, D_Input) begin if (Latch_Enable = 1) then Q
47 Операторы IF, WHEN/ELSE приводят к созданию приоритетной логики. Операторы CASE и WITH/SELECT/WHEN, приводят к созданию безприоритетной логики. Количество используемых LUT и уровень их каскадирования для реализации некоторой функции можно оценить следующим образом: 1) определяется количество входов функции n, 2) определяется минимальное количество каскадов LUT ]log4n[. (для n=1..4 – 1 уровень, для n=5..16 – 2 уровня LUT). Правила описания синтезируемых конструкций на VHDL 47
48 Тактовые сигналы имеют обычно иные электрические характеристики, чем сигналы дынных. Это связано с большим коэффициентом разветвления тактового сигнала, а так же с необходимостью одновременного тактирования нескольких триггеров, что обуславливается минимальным временем задержки на линии тактового сигнала. Поэтому для тактирования используются только тактовые сигналы, а не линии данных. То есть с выхода триггера нельзя брать тактовый сигнал. Если все-таки необходимо тактировать схему с выхода триггера, то между ним и тактовым входом другого триггера вставляется специальный буфер. Тип и название буфера определяется технологией ПЛИС (или ASIC), для XILINX, в библиотеке UNISIM имеется буфер GCLK. Тактирование схемы должно быть однокаскадным. Однако это не мешает строить несколько схем (модулей), с тактированием разными тактовыми сигналами (тактовыми доменами). Если необходимо управлять триггером более медленным тактовым сигналом, кратным основному тактовому, можно использовать сигнал разрешения тактирования. Правила описания синтезируемых конструкций на VHDL 48
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.