Шаг 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Для идентификации инструкции упраления действием регистра или счетчика мы применяем оператор
when "000" =>Если входная инструкция 000, то согласно заданию осуществляется хранение результата, т.е. ничего не происходит
null;
when "001" =>Производим записываение входных данных во внутреннюю переменную
private:=datain;
when "010" =>В зависимости от инструкции производим увеличение или уменьшение значения значения внутренней переменной
private:=private+3;
when "011" =>
private:=private-3;
when "101" =>На данных шагах происходит идентификация вида сдвига: влево или в право в зависимости от кода. Оператор & обозначает конкатенацию, сцепление битов аргумента ( в первом примере результат формируется из первых трех бит значения вектора private и одного бита со значеним 0)
private:=private(3 downto 1)&'0';
when "110" =>
private:='0'&private(2 downto 0);
when others =>В остальных случаях ничего не происходит
null;
end case;Выводим значение внутренней переменной в порт вывода с задержкой в
end if;
DataOut<=private after Delay;
end process;Если все было сделано правильно, то теперь можно компилировать и начинать тестирование.
end architecture;