Предыдущий Следующий

Шаг 4

Рассмотрим поподробнее текст описания.
Раздел интерфейса содержит оче нь подробно расписанные ранее две секции: секцию описания статических параметров
entity jk1 is
generic(
delay:time:=20ns
)
и секцию описания портов элемента
port (
j: in STD_LOGIC;
k: in STD_LOGIC;
c: in STD_LOGIC;
r: in STD_LOGIC;
c1: out STD_LOGIC;
c2: out STD_LOGIC
);
end jk1;

Очень интересными являются нововведения в разделе описаня архитектуры элемента. Здесь появился новый элемент process:
architecture jk1 of jk1 is
begin
process(c,r)
begin
Это ключевое слово позволяет инициализировать зависимый или независимый параллельный процесс. В отличие от других языков программирования организация параллельных процессов здесь очень проста. Нам не надо разделять имеющийся процесс на два: дочерний и родительский, разделять время между имеющимися процессами. Достаточно объявить процесс и описать его поведение. Если параметры процесса не указазны, то он выполняеся на протяжениия всего времени работы элемента. Для того чтобы упростить описание процесса, когда необходимо реагировать только на изменение какого-нибудь сигнала, можно в его параметрах указать название сигналов, изменение которых приведет к запуску процесса (как и сделано выше: process(c,r))

Вторым нововведением являеся возможность оперировать переменными различных типов. В нашем примере мы ввели переменную целого типа для запоминания внутренного состояния элемента. Описание переменной очень схожо с объявлением инициализированных переменных в Паскале:
variable q:integer:=0;

Как и в языках высокого уровня таких как Паскаль, Модула, С++, здесь имеются средства условного ветвления программы: оператор IF. Дабы уничтожить сомнения типа: какому из операторов IF пренадлежит данный ELSIF, здесь каждый оператор if должен заканчиваться end if. Описанное ветвление очень напоминает ветвление в описаниях макросов в языках Turbo Assembler и Pascal.
Как мы сказали выше параллельный процесс может запускаться изменением определенного сигнала. Если задано несколько сигналов, то для анализа, какой из синалов изменился должны имется определенные средства. В нашем случае для синала с проверка его изменения заключается в проверке выражения c'event. Это выражение будет равно True, если произошло событие с сигналом c. Таким образом общий алгоритм поведения JK-тригера в нашем случае имеет вид:
if (c'event and c='1' and r='0') then
if ((j='1') and (k='0')) then q:=1;
elsif ((j='0') and (k='1')) then q:=0;
elsif ((j='1') and (k='1')) then q:=1-q;
end if;
end if;
if (r'event and r='1') then q:=0;
end if;
if (q=1) then c1<='1' after delay;c2<='0' after delay;
else c2<='1' after delay;c1<='0' after delay;
end if;
end process;
end jk1;

Если все было сделано правильно, то теперь можно компилировать и начинать тестирование.


Предыдущий Следующий