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

Шаг 4

Рассмотрим поподробнее текст описания.
Прежде всего необходимо отметить, что  в разделе объявления добавлена еще одна библиотека:

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
Раздел интерфейса элемента не содержит ничего нового и выглядит следующим образом:
entity laba4 is
generic (
Delay: time:=20ns); -- Время задержки распространения сигнала
port (
CLK: in STD_LOGIC; -- Входной порт для тактового сигнала
Reset: in STD_LOGIC; -- Сигнал сброса
DataIn: in STD_LOGIC_VECTOR (3 downto 0); -- Информационный вход
DataOut: out STD_LOGIC_VECTOR (3 downto 0); -- Информационный выход
Command: in STD_LOGIC_VECTOR (2 downto 0)); -- Вход кода инструкции
end entity laba4;
Терерь рассмотрим описание архитектуры. Расшифруем текст программы:
architecture laba4 of laba4 is
begin
process(CLK,Reset)
Процесс будет реагировать на изменение синхросигнала и сигнала сброса
variable
private:STD_LOGIC_VECTOR (3 downto 0);
Для хранения текущего состояния вводим дополнительную переменную
begin
if (Reset='1') then private:="0000";
Если происходит сброс, то значение переменной, хранящее текущее состояние счетчика или регистра обнуляется
elsif (CLK'event) and (CLK='0') then
Иначе, если происходит изменение сигнала синхронизации и он становится низкого уровня (управление по заднему фронту), начинаем обработку события
case Command is
Для идентификации инструкции упраления действием регистра или счетчика мы применяем оператор
case <name> is
when "000" =>
null;
Если входная инструкция 000, то согласно заданию осуществляется хранение результата, т.е. ничего не происходит
when "001" =>
private:=datain;
Производим записываение входных данных во внутреннюю переменную
when "010" =>
private:=private+3;
when "011" =>
private:=private-3;
В зависимости от инструкции производим увеличение или уменьшение значения значения внутренней переменной
when "101" =>
private:=private(3 downto 1)&'0';
when "110" =>
private:='0'&private(2 downto 0);
На данных шагах происходит идентификация вида сдвига: влево или в право в зависимости от кода. Оператор & обозначает конкатенацию, сцепление битов аргумента ( в первом примере результат формируется из первых трех бит значения вектора private и одного бита со значеним 0)
when others =>
null;
В остальных случаях ничего не происходит
end case;
end if;
DataOut<=private after Delay;
Выводим значение внутренней переменной в порт вывода с задержкой в
end process;
end architecture;
Если все было сделано правильно, то теперь можно компилировать и начинать тестирование.

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