Лабораторная работа 31 / Отчет по лабораторной 3
.docЦель работы: Необходимо на языке VHDL реализовать устройство, реализующее функции автомата алгоритм функционирования, которого задан в графической форме. В данной работе будет реализовываться синхронный автомат.
Описание функционирования автомата и общей архитектуры: автомат
имеет 6 состояний:IDLE, WAIT1, WRITE, READ1, END1, TURN из которых начальным является состояние IDLE. Коды состояний автомата будут храниться в переменной cod_state типа state, которая может принимать значения от 0 до 5, что и будет соответствовать каждому из состояний. Тип state относится к числу перечисляемых типов, в котором перечисляются состояния автомата. В каждом состоянии анализируется состояние входящих сигналов Start,Wr,Read,Ready,EndAdr и в зависимости от этого происходит (или не происходит) переход в другие состояния. Также в каждом состоянии автомат выдает определенные выходные сигналы: EnDat,Strob,Load,AncAdr и ResAdr, причем последний инициализируется по ‘1’ т.к. в начальном состоянии он должен быть установлен. Остальные сигналы инициализированы ‘0’. По сигналу RESET(RESET=1) автомат асинхронно
переходит в состояние IDLE. Находясь в состоянии WAIT1 в автомате работает логика приоритетного сигнала которым является сигнал Wr и
поэтому при подаче одновременно сигналов Wr и Read автомат перейдет в состояние WRITE по сигналу Wr.
Структурная схема устройства:
Текст программы с комментариями:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE work.util_1164.all;
ENTITY lab3 IS
END lab3;
ARCHITECTURE structure OF lab3 IS
--Перечисляемый тип state в котором
--перечисляются состояния автомата
type state is (IDLE,WAIT1,WRITE,READ1,END1,TURN);
--Переменная типа state в которой
--хранится код текущего состояния
--и изначально это IDLE
signal cod_state:state:=IDLE;
--Входные сигналы (команды)
signal Start,Wr,Read,Ready,EndAdr:std_logic:='0';
--Выходные сигналы (функции выхода)
signal EnDat,Strob,Load,AncAdr:std_logic:='0';
signal ResAdr:std_logic:='1'; --Выходной сигнал начального состояния
--инициализируется ‘1’
signal CLK:std_logic:='0'; --Тактовый сигнал
BEGIN
--Процесс, реализующий алгоритм
--функционирования автомата
Automat:process(cod_state,Start,Wr,Read,Ready,EndAdr,CLK,Reset)
begin
IF Reset='1' then
cod_state<=IDLE; --Если RESET=1 , то переход в IDLE
ELSE
IF CLK'EVENT and CLK='1' then --По фронту CLK выполняются
--операторы
--В каждом операторе выбора соответствующего
--своему состоянию выполняются действия опреде-
--ленные для каждого состояния и также по резуль-
--татам анализа входных сигналов осуществляется
--(не осуществляется) переход в другие состояния
case cod_state is
when IDLE => ResAdr<='1';
if Start='1' then cod_state<=WAIT1;
end if;
when WAIT1 => if Wr='1' and Read='0' then EnDat<='1';
cod_state<=WRITE;
elsif Read='1' and Wr='0' then cod_state<=READ1;
elsif Read='1' and Wr='1' then EnDat<='1';
cod_state<=WRITE;
end if;
when WRITE => EnDat<='1'; Strob<='1';
if Ready='1' then cod_state<=END1;
end if;
when READ1 => Load<='1';
if Ready='1' then cod_state<=END1;
end if;
when END1 => AncAdr<='1';
cod_state<=TURN;
when TURN => if EndAdr='1' then cod_state<=IDLE;
--При переходе в IDLE
--выходные сигналы обнуляем
EnDat<='0';Strob<='0';Load<='0';AncAdr<='0';
else cod_state<=WAIT1;
end if;
when OTHERS => null;
end case;
END IF;
END IF;
End process;
Test:process --Процесс-тест для автомата
variable number_test:integer range 0 to 17; --Переменная номера тестового
--воздействия
begin
while number_test<17 loop
--При test=0 не подаются сигналы
if number_test=1 then Start<='0'; --Остаемся в IDLE
elsif number_test=2 then Start<='1'; --Переход в WAIT1
elsif number_test=3 then Start<='0';Wr<='0'; --Остаемся в WAIT1
elsif number_test=4 then Wr<='1'; --Переход в WRITE по Wr=1,Read=0
elsif number_test=5 then Ready<='0';Wr<='0'; --Остаемся в Write
elsif number_test=6 then Ready<='1'; --Переход в END1
elsif number_test=7 then Ready<='0'; --Переход в TURN
elsif number_test=8 then null; --Переход в WAIT1
--Переход в WRITE по Wr=1,Read=1
--притом Wr - приоритетный сигнал
elsif number_test=9 then Wr<='1';Read<='1';
--Переход из WRITE в IDLE путем
--подачи асинхронного сигнала RESET
--Проверка RESET
elsif number_test=10 then Reset<='1';Wr<='0';
elsif number_test=11 then Reset<='0';Start<='1'; --Переход в WAIT1
elsif number_test=12 then Start<='0'; --Переход в READ1 по Wr=0,Read=1
elsif number_test=13 then Read<='0'; --Остаемся в READ1
elsif number_test=14 then Ready<='1'; --Переход в END1 по Ready=1
elsif number_test=15 then Ready<='0'; --Переход в TURN
elsif number_test=16 then EndAdr<='1'; --Переход в IDLE по EndAdr=1
end if;
number_test:=number_test+1;
CLK<='1';
wait for 50 ns; --1/2 периода тактового сигнала
CLK<='0';
wait for 50 ns;
end loop;
assert false report "End of Simulation!"
severity note;
wait;
End process;
END structure;
Результаты моделирования:
Как видно из временной диаграммы, автомат работает согласно заданному алгоритму.
Для моделирования была выбрана тактовая частота 10 МГЦ. Полный цикл автомат проходит за 6 тактов как при проходе через вершину WRITE, так и при проходе через вершину READ1.
Вывод: В процессе работы было описано на языке VHDL и смоделировано устройство последовательного типа, а именно синхронный автомат. Также к описанию схемы автомата был включен и описан модуль, тестирующий автомат. В процессе работы были отработаны навыки построения последовательных устройств, а также создание и использование данных перечисляемых типов.