Шаг 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;
Если все было сделано правильно, то теперь можно компилировать и начинать
тестирование.