Слайд: Выбор состояний для выходов и кодирование состояний
Слайд: Таблица переходов
Текущее состояние state
Входы
Следующее состояние next_state
"0001" (Q1)
x(1)='1'
"0010" (Q2)
"0001" (Q1)
x(1)='0'
"0001" (Q1)
"0010" (Q2)
x(2) = '1', x(1)='0'
"0100" (Q3)
"0010" (Q2)
x(1)='1'
"1000" (Q4)
"0010" (Q2)
x(1)='0'
"0010" (Q2)
"1000" (Q4)
x(1)='1'
"0001" (Q1)
"1000" (Q4)
x(1)='0'
"1000" (Q4)
"0100" (Q3)
-
"0100" (Q3)
Слайд: Таблица истинности выходной логики
Состояние State[3:0]
Выход y[1:0]
Q1: "0001"
y1: "00"
Q2: "0010"
y2: "10"
Q3: "0100"
y1: "00"
Q4: "1000"
y3: "11"
Слайд: VHDL-модель автомата
Вариант 1
Вариант 2
libraryieee;useieee.std_logic_1164.all;entity automat isport(
x :instd_logic_vector(2downto1);
rst :instd_logic;
clk :instd_logic;
y :outstd_logic_vector(1downto0));end automat;architecture beh of automat issignal state :std_logic_vector(3downto0);signal next_state :std_logic_vector(3downto0);begin-- beh-- Задание логики переходов (F)
next_state <="0010"when state="0001"and x(1)='1' else"0001"when state="0001"else"0100"when state="0010"and x(2downto1)="10"else"1000"when state="0010"and x(1)='1' else"0010"when state="0010"else"0001"when state="1000"and x(1)='1' else"1000"when state="1000"else"0100"when state="0100"else"0000";-- Задание выходной логики (G)
y <="00"when state="0001"else"10"when state="0010"else"00"when state="0100"else"11"when state="1000"else"00";-- регистр, хранящий текущее состояние
p1:process(clk, rst)begin-- process p1if rst = '1' then
state <="0001";elsif clk'eventand clk = '1' then
state <= next_state;endif;endprocess p1;end beh;
architecture beh2 of automat istype state_type is(Q1, Q2, Q3, Q4);signal state : state_type;signal next_state : state_type;begin-- beh
c1:process(state, x)isbegin-- process c1case state iswhen Q1 =>
y <="00";if x(1)='1' then
next_state <= Q2;else
next_state <= Q1;endif;when Q2 =>
y <="10";if x ="10"then
next_state <= Q3;elsif x(1)= '1' then
next_state <= Q4;else
next_state <= Q2;endif;when Q3 =>
y <="00";
next_state <= Q3;when Q4 =>
y <="11";if x(1)= '1' then
next_state <= Q1;else
next_state <= Q4;endif;whenothers=>null;endcase;endprocess c1;-- регистр, хранящий текущее состояние
p1:process(clk, rst)begin-- process p1if rst = '1' then
state <= Q1;elsif clk'eventand clk = '1' then
state <= next_state;endif;endprocess p1;end beh2;
Слайд: VHDL-модель тестбенча
libraryieee;useieee.std_logic_1164.all;entity tb isend tb;architecture beh of tb iscomponent automat
port(
x :instd_logic_vector(2downto1);
rst :instd_logic;
clk :instd_logic;
y :outstd_logic_vector(1downto0));endcomponent;signal x :std_logic_vector(2downto1);signal rst :std_logic;signal clk :std_logic:= '0';signal y :std_logic_vector(1downto0);begin-- beh
automat_1: automat
portmap(
x => x,
rst => rst,
clk => clk,
y => y);
clk <=not clk after10ns;
rst <= '1', '0' after30ns,
'1' after400ns, '0' after405ns;processbegin-- process
x <="00";waitfor55ns;
x <="01";waitfor20ns;
x <="01";waitfor20ns;
x <="01";waitfor20ns;
x <="01";waitfor40ns;
x <="10";waitfor40ns;
x <="11";waitfor40ns;
x <="10";waitfor40ns;
x <="01";wait;endprocess;end beh;
Слайд: Последовательный оператор CASE
Последовательный — значит может использоваться только в process
Значение может быть числом (литералом), простым выражением (например, a + b), диапазоном значений (1 to 10), ключевым словом others.
Примеры
case SEL iswhen"01"=> Z <= A;when"10"=> Z <= B;whenothers=> Z <= 'X';endcase;
case INT_A iswhen0=> Z <= A;when1to3=> Z <= B;when4|6|8=> Z <= C;whenothers=> Z <= 'X';endcase;
Примеры ошибок
перекрытие диапазонов
case INT_A iswhen0=> Z <= A;when1to3=> Z <= B;when2|6|8=> Z <= C;-- illegalwhenothers=> Z <= 'X';endcase;
Диапазон для вектора задавать нельзя
signal VEC :unsigned(2downto0);
....
case VEC iswhen"000"to"010"=> Z <= A;-- illegalwhen"111"=> Z <= B;whenothers=> Z <= 'X';endcase;
Слайд: Временные диаграммы
Временные диаграммы проверки автоматов
Слайд: Словесное описание автомата
Панель ввода пароля
обеспечить возможность задания нового пароля по нажатию специальной кнопки и ввода старого пароля (пароль по умолчанию 000), а затем ввода нового. При неправильном вводе переходит в начальное состояние (ожидание ввода). При правильном старом пароле включить сигнал "доступ открыт", а после ввода нового пароля отключить сигнал "доступ открыт".
ввод пароля с клавиатуры (3х значное десятичное число от 000 до 999). Предусмотреть кнопку сброса введённого пароля (при неправильный вводе).
после ввода 3 цифр система проверяет введённый пароль с внутренним значением:
если пароли совпадают, то включается светодиод "Доступ открыт" на 3 сек., после чего система переходит в режим ввода пароля
если пароли не совпадают, то включается звуковой сигнал "Доступ закрыт" на 0.5 сек., после чего система переходит в режим ввода пароля
если после ввода 1й или 2й цифры, следующая цифра (т.е. 2-я или 3я соответственно) не введены более чем через 5 секунд, то включается звуковой сигнал "Доступ закрыт" на 0.5 секунды
Слайд: Алгоритм
Слайд: Таблица переходов :step
Элементы системы и управляющие сигналы (входы/выходы)