Описание интерфейса устройства



 

В начале главы уже говорилось, что на моделируемое устройство в первую очередь следует посмотреть со стороны (“вид снаружи”) и для этого “черного ящика” определить интерфейс с внешним миром. Такая задача решается в VHDL декларацией интерфейса entity. Она задает имя описания, имена интерфейсных портов, направление передачи, тип портов. Порт – это сигнальная линия (шина), с помощью которой устройство (модель) взаимодействуют с окружающей средой. Например, для полусумматора (рис. 1.2) декларация будет выглядеть следующим образом:

Рис. 1.2. Полусумматор

 

entity half_adder is

 port(a, b: in BIT; sum, cur: out BIT);

end half_adder;

Здесь описание с именем half_adder имеет два входных порта, a и b (in – означает входной порт), и два выходных порта, sum и carry (out – означает выходной порт). Тип портов определен как BIT – означает, что сигналы на линиях портов могут принимать значения: ‘0’ или ‘1’.

Другим примером может послужить дешифратор, показанный на рис. 1.3.

entity dec2x4 is

port(a, b, enable: in BIT; z: out BIT_VECTOR (0 to 3));

end dec2x4;

Здесь описание с именем dec2x4 имеет три входных порта и четыре выходных. Выходные порты описаны как массив. BIT_VECTOR – это одномерный массив, диапазон задается параметром Z (0 to 3).


Рис. 1.3. Декодер 2х4

 

Каждый интерфейсный порт может функционировать в следующих режимах:

in – значение порта только считывается для использования внутри модели,

out – значение порта может только обновляться моделью, но не считывается,

inout – двунаправленный порт, значение считывается и обновляется моделью,

buffer – буферный порт, значение считывается и обновляется моделью, но источником сигнала может быть либо буфер, либо одиночный источник.

Архитектура

 

Архитектура (architecture body) моделирует взгляд на устройство “изнутри”. Устройство может рассматриваться под разными углами и описываться по-разному. Оно может предстать либо как композиция более простых модулей (структурный стиль моделирования), либо как набор параллельно исполняемых алгоритмов (стиль dataflow), либо описано как процесс последовательного исполнения операций (стиль “поведенческий”), либо может быть раскрыто сочетанием указанных стилей.

С одним интерфейсом типа entity может быть связано несколько архитектур. Рассмотрение архитектурных стилей начнем с поведенческого (behavioral style).

Поведенческое описание

Функционирование устройства рассматривается как процесс последовательного вычисления выражений, входящих в process. Толчком к запуску процесса является изменение (event -событие) какого либо сигнала, из входящих в список “воспринимаемых” сигналов (sensitivity list). Этот список внешне очень похож на список параметров в других языках высокого уровня. Рассмотрим поведенческую модель декодера dec2х4 (рис.1.3). Декларация интерфейса его уже приводилась, а теперь она будет пополнена архитектурой поведенческого типа.

entity dec2x4 is

port(a, b, enable: in BIT; z: out BIT_VECTOR (0 to 3));

end dec2x4;

architecture dec_seq of dec2x4 is

begin

process (a, b, enable)

    variable abar, bbar: BIT;

    begin

              abar:= not a;   --выражение 1

              bbar:= not b;   -- выражение 2

              If enable = ‘1’ then   -- выражение 3

                       z(3) <= not (a and b); -- выражение 4

                       z(2) <= not (a and bbar);   -- выражение 5

                       z(1) <= not (abar and b); -- выражение 6

                       z(0) <= not (abar and bbar); -- выражение 7

                       else z <= “1111”;

              end if;

end process;

end dec_seq;

Архитектура имеет свое имя dec_seq. О принадлежности архитектуры к описанию интерфейса dec2х4 говорит выражение: dec_seq of dec2x4. Список сигналов, которыми запускается процесс, дан в скобках: process (a, b, enable). До начала процесса, если необходимо, декларируются переменные variable abar, bbar: BIT. Зона действия их ограничена данным процессом (от begin до end process). Предположим, что в момент T произошло изменение сигнала а. Новое значение переменной abar (выражение 1) вычисляется и присваивается без задержки – мгновенно (в качестве знака присваивания в данном случае используется =). Без задержки будут вычислены выражения 2 и 3.

Далее в ходе процесса одно за другим вычисляются выражения от 4 до 7, а новые значения сигналам z(0), z(1), z(2), z(3) будут присвоены (в качестве символа оператора присвоения используется <= ) лишь через некоторую, пусть даже фиктивную (бесконечно малую), задержку D. Это существенное отличие процедур присвоения для переменных и для сигналов.

Рассмотрим пример мультиплексора 4х1 (рис.1.4). Четыре входных сигнала A, B, C и D выводятся через один порт Z. Коммутация осуществляется сигналом CTRL.


Рис. 1.4. Мультиплексор 4х1.

 

entity MUX is

    port (A, B, C, D: in BIT; CTRL: in BIT_VECTOR(0 to 1);

                                                                      Z: out BIT);

end MUX;

architecture MUX_BEHAVIOR of MUX is

begin

    PMUX: process (A, B, C, D, CTRL)

              variable TEMP: BIT;

    begin

              case CTRL is

                       when "00" => TEMP := A:

                       when "01" => TEMP := B;

                  when "10" => TEMP := C;

                       when "11" => TEMP := D;

              end case;

              Z <= TEMP;

    end process PMUX;

end MUX_BEHAVIOR;

Архитектура получила название MUX_BEHAVIOR, процесс имеет ярлык PMUX. Переменной TEMP в зависимости от значения сигнала CTRL присваивается значение одного из входных портов: A, когда CTRL имеет значение “00”; B, когда CTRL имеет значение “01”; A, когда CTRL имеет значение “10”; D, когда CTRL имеет значение “11”.

Для описания синхросигналов обычно используется атрибу EVENT. Он истинен когда происходит “событие” - изменение сигнала. Например, поведение D-триггера, показанного на рис.1.5, можно описать так:

 

Рис.1.5. D-триггер

 

entity dff is

port (data, clk: in BIT

 q, notq: out BIT);

end dff;

architecture behav of dff is

begin

 process (clk)

 begin

 if (clk’event and clk = ‘1’) then

 q <= data;

 notq <= not data;

 end if;

 end process;

end behav;

Выражение (clk’event and clk = ‘1’) задает условие: если сигнал clk меняется с ‘0’ на ‘1’


Дата добавления: 2019-07-15; просмотров: 71; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!