Проектирование цифровых устройств с использованием ПЛИС (1055366), страница 5
Текст из файла (страница 5)
Параллельные операторыОператоры данной группы описывают взаимосвязанные параллельно функционирующие части устройства. Параллельные операторы выполняются асинхронно по отношению друг к другу. К таким операторам относятся:• блоки (BLOCK);• процессы (PROCESS);• параллельные присваивания сигналов (<=);• параллельные вызовы процедур;• параллельные операторы-ловушки (ASSERT);• экземпляры компонентов (COMPONENT).Оператор BLOCKЭтот оператор позволяет описать группу параллельных операторов:<БЛОК> ::=[<МЕТКА>] : BLOCK [( <ОХРАННОЕ ВЫРАЖЕНИЕ> )] [IS][GENERIC (<ОБЪЯВЛЕНИЕ НАСТРОЕЧНЫХ КОНСТАНТ>);][GENERIC MAP (СПИСОК СВЯЗЫВАНИЯ НАСТРОЕЧНЫХ КОНСТАНТ);][PORT (<ОБЪЯВЛЕНИЕ ПОРТОВ>);][PORT MAP (<СПИСОК СВЯЗЫВАНИЯ ПОРТОВ>)]<ДЕКЛАРАТИВНАЯ ЧАСТЬ>BEGIN<ПАРАЛЛЕЛЬНЫЕ ОПЕРАТОРЫ>END BLOCK [<МЕТКА>];Охранное выражение позволяет задать скрытый локальныйсигнал GUARD, который можно использовать в пределах блока вкачестве разрешающего сигнала при присваиваниях.
Объявлениенастроечных констант и их связывание конкретизируют настроечные значения. Объявление портов и их связывание позволяют ассоциировать порты схемы с внешними сигналами.Пример описания устройства с использованием иерархии блоков:C: BLOCKBEGINX: BLOCK31PORT (P1, P2: INOUT BIT); --объявление портовPORT MAP (P1 => S1, P2 => S2); --связывание портовCONSTANT Delay: DELAY_LENGTH := 1 ms; --декларацииSIGNAL P3: BIT;BEGINP3 <= P1 AFTER Delay; --присвоение•B: BLOCK•BEGIN•END BLOCK B;END BLOCK X;END BLOCK C;Оператор PROCESSЭтот оператор описывает независимые группы последовательных операторов в виде параллельных процессов.Упрощенный синтаксис оператора PROCESS:<ПРОЦЕСС>::=[<МЕТКА:>][POSTPONED] PROCESS(<СПИСОК ЧУВСТВИТЕЛЬНОСТИ>) [IS]<ДЕКЛАРАТИВНАЯ ЧАСТЬ>BEGIN<ПОСЛЕДОВАТЕЛЬНЫЕ ОПЕРАТОРЫ>END [POSTPONED] PROCESS [<МЕТКА>] ;Использование ключевого слова POSTPONED позволяет примоделировании указать на отложенный процесс (исполнение егоотложено относительно всех исполняющихся в данный моментвремени t процессов).
Такой процесс исполняется последним длямомента времени t. Декларативная часть содержит объявленияобъектов, типов, атрибутов, а также тела подпрограмм и альтернативные точки входа в подпрограммы.Список чувствительности представляет собой перечень сигналов, позволяющий моделирующей программе определить моментывремени, в которые процесс должен активизироваться. При синтезе схемы список чувствительности не учитывается.32Пример описания динамического триггера с использованиемпроцесса:FF: PROCESS (CLK,RST,WE)BEGINIF RST='1' THEND<='0';ELSIF ((CLK='1') AND (CLK'event)) THENIF (WE='1') THEND<=D_IN;END IF;END IF;END PROCESS;Оператор параллельного присваивания сигналаЭтот оператор эквивалентен процессу, в котором при определенных условиях происходит присваивание сигналу нового значения.Синтаксис оператора параллельного присваивания сигнала:<ПАРАЛЛЕЛЬНОЕ ПРИСВАИВАНИЕ СИГНАЛА>::=[ <МЕТКА> : ] [ POSTPONED ] <УСЛОВНОЕ ПРИСВАИВАНИЕ СИГНАЛА>| [ <МЕТКА> : ] [ POSTPONED ] <ПРИСВАИВАНИЕ СИГНАЛА><УСЛОВНОЕ ПРИСВАИВАНИЕ СИГНАЛА> ::=<СИГНАЛ><= <ОПЦИИ> { <ОБРАЗЕЦ> WHEN <УСЛОВИЕ> ELSE }<ОБРАЗЕЦ> [ WHEN <УСЛОВИЕ> ];<ПРИСВАИВАНИЕ СИГНАЛА> ::=WITH <ВЫРАЖЕНИЕ> SELECT<СИГНАЛ> <= <ОПЦИИ> { <ОБРАЗЕЦ> WHEN <ЗНАЧЕНИЕ>, }<ОБРАЗЕЦ> WHEN <ЗНАЧЕНИЕ>;<ОПЦИИ> ::= [ GUARDED ] [ <СПОСОБ ЗАДЕРЖКИ> ]<ОБРАЗЕЦ> ::=<ВЫРАЖЕНИЕ> [ AFTER <ВРЕМЯ> ]| NULL [ AFTER <ВРЕМЯ> ]Опция GUARDED обеспечивает использование при присваивании дополнительного разрешающего сигнала c именем GUARD(неявно объявленного в блоке или явно объявленного пользователем).
Все присваивания разрешены по фронту или по уровню сигнала GUARD. Опция AFTER определяет задержку изменения сигнала.33Динамический триггер можно описать с помощью операторапараллельного присваивания сигнала следующим способом:ENTITY ff ISPORT (RST,CLK,WE: IN std_logic;D_IN: IN std_logic;D: OUT std_logic);END ff;ARCHITECTURE DataFlow OF ff ISBEGIND<= '0'WHEN RST='1' ELSED_IN WHEN (CLK='1') AND (CLK'event) AND (WE='1');END DataFlow;Описание дешифратора:LIBRARY ieee; --Описание подключаемых библиотекUSE ieee.std_logic_1164.ALL;ENTITY decoder ISPORT ( inp: IN std_logic_vector(2 DOWNTO 0);outp: OUT std_logic_vector(7 DOWNTO 0));END decoder;ARCHITECTURE DataFlow OF decoder ISBEGINoutp(0) <= '1' WHEN inp = "000" ELSE '0';outp(1) <= '1' WHEN inp = "001" ELSE '0';outp(2) <= '1' WHEN inp = "010" ELSE '0';outp(3) <= '1' WHEN inp = "011" ELSE '0';outp(4) <= '1' WHEN inp = "100" ELSE '0';outp(5) <= '1' WHEN inp = "101" ELSE '0';outp(6) <= '1' WHEN inp = "110" ELSE '0';outp(7) <= '1' WHEN inp = "111" ELSE '0';END DataFlow;Процедуры и функцииДругим способом группировки последовательных действий являются процедуры и функции, которые могут быть вызваны и исполнены в виде параллельных процессов.
Объявленные внутрипроцедуры или функции объекты, как и для других способов груп34пировки (PROCESS и BLOCK), не могут быть использованы за ихпределами, т. е. приобретают свойство локальности.Упрощенный синтаксис объявления процедуры:<ПРОЦЕДУРА> ::=PROCEDURE <ИМЯ> [ ( <СПИСОК ФОРМАЛЬНЫХ ПАРАМЕТРОВ >) ]|[PURE|IMPURE] FUNCTION <ИМЯ> [(< СПИСОК ФОРМАЛЬНЫХПАРАМЕТРОВ> ) ]RETURN <ТИП>Пример объявления и параллельного вызова процедуры:ENTITY sort4 ISGENERIC (top : integer :=3);PORT (a, b, c, d : IN bit_vector(0 TO top);ra, rb, rc, rd : OUT bit_vector(0 TO top));END sort4;ARCHITECTURE muxes OF sort4 ISPROCEDURE sort2(SIGNAL x, y : IN bit_vector(0 TO top);SIGNAL g, l : OUT bit_vector(0 TO top)) ISBEGINIF x > y THENg <= x;l <= y;ELSEl <= x;g <= y;END IF;END sort2;SIGNAL v1,v2,v3,v4,v5,v6,v7,v8,v9,v10 : bit_vector(0 TO top);BEGIN--Параллельные вызовы процедурыsort2(a, c, v1, v2);sort2(b, d, v3, v4);sort2(v1, v3, v5, v6);sort2(v2, v4, v7, v8);sort2(v6, v7, v9, v10);35-- Параллельные присваивания сигналовra <= v8;rb <= v10;rc <= v9;rd <= v5;END muxes;Оператор-ловушка ASSERTДля упрощения отладки в языке VHDL используется операторловушка ASSERT, позволяющий выполнить в ходе моделированияпроверочное сравнение и при обнаружении ошибки (ложном значении выражения) выдать заданное сообщение:<СООБЩЕНИЕ> ::=[<МЕТКА> :] [POSTPONED] ASSERT <ВЫРАЖЕНИЕ>[REPORT <СООБЩЕНИЕ>] [SEVERITY <ТИП СООБЩЕНИЯ>];Пример сообщения:ASSERT D =’1’REPORT “Ошибка, D не равно 1”;Использование компонентовДля использования устройства в виде компонента другого устройства необходимо объявить его в декларативной части конструкции ARCHITECTURE:<ОБЪЯВЛЕНИЕ КОМПОНЕНТА> ::=COMPONENT <ИМЯ КОМПОНЕНТА>[GENERIC <СПИСОК НАСТРОЕЧНЫХ ПАРАМЕТРОВ>;][PORT<СПИСОК ПОРТОВ>;]END COMPONENT;После этого можно создать экземпляр компонента в описательной части ARCHITECTURE с помощью конструкции использования:<ЭКЗЕМПЛЯР КОМПОНЕНТА> ::=<МЕТКА ЭКЗЕМПЛЯРА>: <ИМЯ КОМПОНЕНТА>36[GENERIC MAP ( <ЗНАЧЕНИЯ НАСТРОЕЧНЫХ КОНСТАНТ> )][PORT MAP ( <СПИСОК СООТВЕТСТВИЙ СИГНАЛОВ> )];Пример использования настроечных констант и декларациикомпонентов:-- Пример использования компонентовLIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_arith.ALL;USE ieee.std_logic_unsigned.ALL;ENTITY adder ISGENERIC ( n:INTEGER:=16);PORT ( a,b: IN std_logic_vector (n-1 DOWNTO 0);result: OUT std_logic_vector(n-1 DOWNTO 0));END adder;ARCHITECTURE behave OF adder ISBEGINresult <= a + b;END;LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_arith.ALL;USE ieee.std_logic_unsigned.ALL;ENTITY adders ISGENERIC(op_n: INTEGER := 16;sum_n: INTEGER :=16);PORT(a,b,c: IN std_logic_vector(op_n-1 DOWNTO 0);result: OUT std_logic_vector(sum_n-1 DOWNTO 0));END adders;ARCHITECTURE behave OF adders ISCOMPONENT adderGENERIC ( n:INTEGER:=op_n);PORT ( a,b: IN std_logic_vector(n-1 DOWNTO 0);result: OUT std_logic_vector(n-1 DOWNTO 0));END COMPONENT;SIGNAL rez: std_logic_vector(sum_n-1 DOWNTO 0);BEGINa1:adderPORT MAP (a => a, b=>b, result=>rez);37a2:adderPORT MAP ( a=>rez,b=>c,result => result);END behave;Оператор GENERATEЭтот оператор обеспечивает возможность итеративного илиусловного повторения деклараций и операторов:<ГЕНЕРАЦИЯ> ::=[<МЕТКА>]:<СПОСОБ ГЕНЕРАЦИИ> GENERATE[<ДЕКЛАРАЦИИ> BEGIN][<ПАРАЛЛЕЛЬНЫЕ ОПЕРАТОРЫ>]END GENERATE [<МЕТКА>];<СПОСОБ ГЕНЕРАЦИИ> ::= FOR <ИДЕНТИФИКАТОР> IN<ДИАПАЗОН> | IF <УСЛОВИЕ>При итеративной генерации используется конструкция FOR, после которой указываются идентификатор номера итерации и его диапазон изменения.