ОСНОВЫ ЯЗЫКА VHDL 1
Параллельные операторы 2 Параллельные операторы это такие, каждый из которых выполняется при любом изменении сигналов, используемых в качестве его исходных данных. Результаты исполнения оператора доступны для других параллельных операторов не ранее, чем будут выполнены все операторы, инициализированные общим событием (а может быть и позже, если присутствуют выражения задержки). В языке VHDL к классу параллельных операторов относятся: :: = | Оператор процесса PROCESS уже рассматривался. Оператор процесса начинает исполняться при изменении сигналов, входящих в список чувствительности (при отсутствии такого списка - безусловно после выполнения всех вложенных операторов), а результаты его исполнения доступны другим параллельным операторам только после исполнения всех операторов, инициируемых теми же событиями, в том числе процессов.
Параллельные операторы 3 Параллельное присваивание Параллельное присваивание определено в трех различных формах: ::= [ : ] | [ : ] По синтаксису и правилам исполнения безусловное параллельное присваивание совпадает с последовательным присваиванием сигналу. Варианты различаются по локализации в программе и характеризуются различными условиями исполнения. Безусловное параллельное присваивание. Основные отличия от оператора последовательного присваивания: параллельное присваивание локализуется в общем разделе архитектурного тела, а последовательное - только в теле процесса; последовательное присваивание сигналу выполняется после того, как инициировано исполнение процесса и выполнены все предшествующие операторы в теле процесса; оператор параллельного присваивания выполняется сразу (с точки зрения модельного времени) после изменения сигналов в правой части этого оператора.
Параллельные операторы 4 Параллельное присваивание ::= [ : ] | [ : ] Условное присваивание и присваивание по выбору. Операторы во многом сходны с условным оператором и оператором выбора. В отличии от условного оператора и оператора выбора, в которых условие может задавать исполнение последовательности действий, в операторах присваивания возможно только присвоение одного значения. ::= ] « WHEN ELSE » ; Пример 1. Двухвходовой буфер с тремя состояниями на выходе Z_out <= TRANSPORT x0 AFTER 2 ns WHEN (adr = '0' AND en =1') ELSE x1 AFTER 2 ns WHEH (adr =1' AND en ='1') ELSE 'Z' AFTER 5 ns; :: = WITH SELECT ] « WHEN, » WHEN ; Пример 2. Двухвходовой буфер с тремя состояниями на выходе WITH a & b SELECT Z_out <= TRANSPORT x0 AFTER 2 ns WHEN "01", x1 AFTER 2 ns WHEN 11", 'Z' AFTER 5 ns WHEN OTHERS;
Параллельные операторы 5 Параллельное присваивание Важно отметить, что если условный оператор IF и оператор выбора CASE не могут выполняться над данными, вырабатываемыми модулями, представленными различными операторами процесса. Пусть, например, три блока (процесса) работают параллельно с выходом на общую шину через буфер с тремя состояниями. Причем выбор подключаемого модуля задается сигналом, подаваемым на порт Chanel_select. Программный модуль, описывающий такой буфер, представлен в примере 3. Пример 3 ENTITY three_charme1 IS PORT ( data_in: IN integer; Channel_select: IN integer RANGE 1 TO 3; z: OUT integer); END three_channel; ARCHITECTURE skeleton OF three_channel IS. SIGNAL datal, data2, data3 : integer; BEGIN WITH Channel_select SELECT z<= data1 WHEN 1; data2 WHEN 2; data3 WHEN 3; 'z' WHEN OTHERS; PROCESS….. BEGIN data1<=..... END PROCESS; PROCESS BEGIN data2<=….. END PROCESS; PROCESS BEGIN data3<=….. END PROCESS; END skeleton;
Параллельные операторы 6 Оператор блока Оператор блока BLOCK, подобно оператору PROCESS, является составным оператором, тело которого включаёт несколько операторов, но, в данном случае, параллельных. Эти операторы инициируются не по последовательному, а по событийному принципу, а результаты их исполнения становятся доступны другим операторам как включенным в блок, так и размещенным в других блоках или "индивидуально", только после исполнения всех операторов, инициированных одним событием. Объединение операторов в блоки обеспечивает следующие возможности: структуризация текста описания, т.е. возможность явного и наглядного выделения совокупности операторов, описывающих законченный функциональный узел; возможность объявления в блоке локальных типов, сигналов, подпрограмм и некоторых других локальных понятий; возможность приписывания всем или некоторым операторам блока общих, условий инициализации. ::= : BLOCK [ ( охранное выражение) ] [ IS ] [ ] BEGIN END BLOCK [ ];
Параллельные операторы 7 Оператор блока Охранное выражение - это любое выражение логического типа, аргументами которого являются сигналы. Любое изменение сигналов, входящих в охранное выражению, вызывает вычисление значения этого выражения и присвоение полученного значения предопределенной переменной GUARD. Область действия переменной GUARD - все тело блока, и она может использоваться как обычная логическая переменная во вложенных операторах блока. Например, узел выборки данных из тридцатидвухразрядного регистра на восьмиразрядную линию, в котором транслируется байт, указанный двухразрядным кодом номера byte_sel может быть представлен таким блоком: Пример 4 Select_byte: BLOCK (select='1' AND read=1) IS BEGIN dbus<= reg (7 DOWNTO 0) WHEN GUARD AND byte_sel="00" ELSE reg (15 DOWNTO 0) WHEN GUARD AND byte_sel=01" ELSE reg (23 DOWNTO 16) WHEN GUARD AND byte_ sel=10" ELSE reg (31 DOWNTO 24) WHEN GUARD AND byte_ sel=11" ELSE "ZZZZZZZZ"; END BLOCK select_byte;
Параллельные операторы 8 Оператор блока Охраняемый оператор присваивания использует значение переменной GUARD без явного указания условия в программе. Если GUARD =0, 'то исполнение операторов присваивания, содержащих ключевое слово GUARDED, в таком блоке запрещено. Например, два модуля, подключенные к общей шине, могут быть представлены в одном архитектурном теле таким образом, как в примере 5. Пример 5 ARCHITECTURE guard_example ОF two_block IS SIGNAL data_bus: Std_logic_vector (N-1 DOWNTO 0); -- n определяется в разделе GENERIC проекта two_block; BEGIN unit1: BLOCK ( adr='0 AND read_data='1') SIGNAL data0 : Std_logic_vector (N-1 DOWNTO 0); BEGIN data_bus PROCESS BEGIN END PROCESS; END BLOCK unit1;;. unit2: BLOCK ( adr='1 AND read_data='1') SIGNAL data1: Std_logic_vector (N-1 DOWNTO 0); BEGIN data_bus PROCESS BEGIN END PROCESS; END BLOCK unit2;
Описание типовых дискретных устройств 9 Комбинационные логические схемы Известно много способов задания логической функции, из которых наибольшее распространение получили: алгебраическое представление; табличное представление; представление через бинарную декомпозицию; декомпозиция в априорно заданном базисе функций меньшего числа аргументов. Часто способ записи логических функций связан просто с опытом и личными предпочтениями разработчика. Язык VHDL представляет возможности выбора любой исходной формы задания без необходимости ручного перевода из одной формы в другую.
Описание типовых дискретных устройств 10 Комбинационные логические схемы Реализация комбинационной логической схемы на основе алгебраической формы записи логической функции интерпретируется оператором присваивания, в правой части которого записывается эквивалентное логическое выражение. Один из простейших способов описания - параллельные операторы присваивания. Программа (пример 6) представляет описание комбинационной логической схемы с двумя выходами, приведенной на рисунке, с использованием параллельных присваиваний. Пример 6 ENTITY simple_logic IS PORT (a,b,c,d: IN std_logic; out1, out2: OUT std_logic); END simple_logic; ARCHITECTURE concurrent OF simple_logic IS SIGNAL a_and_b: std_logic; BEGIN out 1 <= a_and_b OR ( с AND d AND not b) OR ( not a AND not b AND d) ; out2<= a_and_b OR (not a AND с AND d) OR (a AND not b AND not d) OR (b AND not с AND d); a_and_b <= a AND b; END concurrent;
Описание типовых дискретных устройств 11 Комбинационные логические схемы Можно применять также и последовательную форму записи правила функционирования, используя оператор процесса. Архитектурное тело описанного в этой форме устройства, изображенного на рисунке, представлено в примере 7. Здесь важно отметить, что все входные сигналы комбинационной схемы должны быть включены в список чувствительности процесса с тем, чтобы любое их изменение вызывало исполнение оператора присваивания. Кроме того, в данном случае недопустимо a_and_b декларировать как сигнал. Это обязательно переменная, причем ее вычисление задается оператором, предшествующим операторам вычисления результирующих сигналов. В противном случае наблюдается некорректное представление поведения, заключающееся в том, что используются значения не непосредственно полученные в процессе текущего исполнения оператора PROCESS, а значения, вычисленные ранее после предыдущего изменения одного из входных сигналов. Пример 7 ARCHITECTURE sequential OF simple_logic IS -- SIGNAL a and b: std_logic; -- недопустимо в данном контексте BEGIN PROCESS (a,b,c,d) VARIABLE a_and_b: std_logic; BEGIN a_and_b : = a and b; out1<=a_and_b OR ( с AND d AND not b) OR ( not a AND not b AND d); out2<=a_and_b OR (not a AND с AND d) OR (a AND not b AND not d) OR (b and not с and d); END PROCESS; END sequential;
Описание типовых дискретных устройств 12 Комбинационные логические схемы Если a_and_b это все-таки сигнал (например, необходимый для передачи информации другим операторам программы или на порты), то следует выделить его вычисление в отдельный процесс или параллельный оператор, как показано в примере 8. Пример 8 ARCHITECTURE two_processes OF simple_logic IS SIGNAL a_and_b: std_logic; BEGIN PROCESS (a,b) BEGIN a_and_b <= a and b; END PROCESS; PROCESS (a,b,c,d,a_and_b) BEGIN out1<=a_and_b OR (c AND d AND not b) OR (not a AND not b AND d); out2<=a_and_b OR (not a AND с AND d) OR (a AND not b AND not d) OR (b AND not с AND d); END PROCESS; END two_processes;
Описание типовых дискретных устройств 13 Комбинационные логические схемы Табличное представление логической функции можно отобразить в VHDL- программе несколькими способами. Первый способ состоит в представлении таблицы истинности логической функции в виде константного битового вектора, каждый i-й компонент которого представляет значения логической функции на наборе, численный эквивалент которого равен значению i. Очевидно, что "вычисление" функции сведется к выборке элемента массива, индекс которого равен численному эквиваленту входной кодовой комбинации. В функции conv_integer (vect), определенной в пакете std_logic_unsigned, аргумент относится к типу bit_vector или std_logic_vector произвольной длины, а возвращаемое значение - численный эквивалент двоичного кода аргумента (беззнаковое целое в диапазоне от 0 до 2 n -1, где n разрядность аргумента). В функции conv_std_logic_vector (arg1, n), определенной в пакете std_logic_arith, оба аргумента целые беззнаковые, а результат - n-разрядный двоичный код (std_logic_vector), являющийся двоичным эквивалентом arg1. Пример 9 содержит архитектурное тело, функционально соответствующее программе примера 6. В этом варианте результат определяется путем прямой выборки значения из таблицы по индексу, формируемому из входных сигналов, с помощью функции conv_integer. Пример 9 ARCHITECTURE table_ presentation OF simple_logic IS TYPE truth_table_4x1 IS ARRAY (0 TO 15) OF std_logic; CONSTANT FUNCTION1: truth_table_4x1 := ('0, '0, '0, '1', '0', '0', '0', '1',1, '0', '0, '1', 1', '1', '0', 1'); CONSTANT FUNCTION2: truth_table_4x1:= ('0, '1, '0, '1', '0', '0', '0', '1',1, '0', '0, '1', 1', '1', '0', 1'); SIGNAL digital_equivalent: integer RANGE 0 TO 15; BEGIN Digital_equivalent <= conv_integer (d & с & b & a) ; out1<= FUNCTION1 (digital_equivalent); out2<= FUNCTION2 (digital_equivalent); END table_presentation;
Описание типовых дискретных устройств 14 Комбинационные логические схемы Для выхода out1 устройства (см. рисунок) оператор присваивания по выбору, описывающий поведение сигнала во времени, может выглядеть следующим образом: Пример 10 v<=d & с & b & а; WITH v SELECT out1<='X, '0' AFTER 1 ns WHEN "0000", 'X', '0' AFTER 1 ns WHEN "0001", X', '0' AFTER 1 ns WHEN "0010", 'X', 1' AFTER 2 ns WHEN "0011", 'X', '0' AFTER 1 ns WHEN "0100", X', '0' AFTER 1 ns WHEN "0101", 'X', '0' AFTER 1 ns WHEN "0110", X', 1' AFTER 2 ns WHEN "0111", X', 1' AFTER 2 ns WHEN "1000", X', '0' AFTER 1 ns WHEN "1001", X '0' AFTER 1 ns WHEN "1010", 'X', 1' AFTER 2 ns WHEN "1011", X', '1' AFTER 2 ns WHEN "1100", 'X', '1' AFTER 2 ns WHEN "1101", X','0' AFTER 1 ns WHEN "1110", X', 1' AFTER 2 ns WHEN "1111", X' WHEN OTHERS; Применение оператора выбора может обеспечить более компактную запись Пример 11 v:=d & с & b & а; CASE v IS WHEN "0000" | "0001" | 0010" I "0100" I "0101 I "0110" I "1001" | "1010" I "1100" I "1110" =>out1<= 'X, '0' AFTER 1 ns; WHEN "0011 | "0111 I "1000 I "1011 I "1100 I "1101 I "1111" => out1<= 'X', '1' AFTER 2 ns; WHEN OTHERS => out1<= 'X'; END CASE; Такой оператор должен находиться в теле процесса, причем переменные d, с, b и а должны входить в список чувствительности этого процесса.
Описание типовых дискретных устройств 15 Комбинационные логические схемы Представление функции в форме бинарного дерева решений основано на последовательном переходе от представления функции большого числа переменных через суперпозицию функций меньшего числа переменных. Теоретической основой метода является разложение Шеннона: Тогда вычисление первого терма разложения записывается как одна возможная альтернатива условного оператора или условного присваивания, а вычисление другого - как противоположная: IF x1='0' THEN z ; ELSE z ; ЕND IF; Подформулы разложения могут быть, в свою очередь, далее разложены:
СПАСИБО ЗА ВНИМАНИЕ