Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа 31 / Отчет по лабораторной 3

.doc
Скачиваний:
30
Добавлен:
01.05.2014
Размер:
102.4 Кб
Скачать

Цель работы: Необходимо на языке 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 и смоделировано устройство последовательного типа, а именно синхронный автомат. Также к описанию схемы автомата был включен и описан модуль, тестирующий автомат. В процессе работы были отработаны навыки построения последовательных устройств, а также создание и использование данных перечисляемых типов.

Соседние файлы в папке Лабораторная работа 31