«…Труд избавляет человека от трех великих зол: скуки, порока, нужды…»

ПЦУСБ/Лекция 4

Материал из Wiki
Перейти к: навигация, поиск
Лекции ПЦУСБ

Лекции

Практические
Тесты

Лабораторные

Доп. материалы

Заголовок
Цифровые автоматы
Автор
Авдеев Н.А.
Нижний колонтитул
ПЦУСБ/Лекция 4
Дополнительный нижний колонтитул
Авдеев Н.А., 18:44, 25 марта 2014


Содержание

Слайд: Провести анализ схемы (1)

Book-ddu-risx5-42.png


Слайд: Провести анализ схемы (2)

Book-ddu-risx5-57.png


Слайд: Автомат Мили

Avtomat-mili.png
  • Следующее состояние = F (текущее состояние, вход)
  • Выход = G (текущее состояние, вход)

Слайд: Автомат Мура

Avtomat-mura.png
  • Следующее состояние = F (текущее состояние, вход)
  • Выход = G (текущее состояние)

Слайд: Граф состояний и переходов

[svg]

Кодирование выходов
Состояние выхода Значение y[1:0]
y1 00
y2 10
y3 11


Кодирование состояний
Состояние Код
Q1 0001
Q2 0010
Q3 0100
Q4 1000


Слайд: Выбор состояний для выходов и кодирование состояний


Слайд: Таблица переходов

Текущее состояние
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 Вариант 3
library ieee;
use ieee.std_logic_1164.all;
 
entity automat is
 
  port (
    x   : in  std_logic_vector(2 downto 1);
    rst : in  std_logic;
    clk : in  std_logic;
    y   : out std_logic_vector(1 downto 0));
 
end automat;
 
architecture beh of automat is
 
  signal state      : std_logic_vector(3 downto 0);
  signal next_state : std_logic_vector(3 downto 0);
 
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(2 downto 1) = "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 p1
    if rst = '1' then
      state <= "0001";
    elsif clk'event and clk = '1' then
      state <= next_state;
    end if;
  end process p1;
 
end beh;
architecture beh2 of automat is
 
  type state_type is (Q1, Q2, Q3, Q4);
  signal state      : state_type;
  signal next_state : state_type;
 
begin  -- beh
 
  c1: process (state, x) is
  begin  -- process c1
    case state is
      when Q1 =>
        y <= "00";
        if x(1)='1' then
          next_state <= Q2;
        else
          next_state <= Q1;
        end if;
      when Q2 =>
        y <= "10";
        if x = "10" then
          next_state <= Q3;
        elsif x(1) = '1' then
          next_state <= Q4;
        else
          next_state <= Q2;
        end if;
      when Q3 =>
        y <= "00";
        next_state <= Q3;
      when Q4 =>
        y <= "11";
        if x(1) = '1' then
          next_state <= Q1;
        else
          next_state <= Q4;
        end if;
      when others => null;
    end case;
  end process c1;
 
  -- регистр, хранящий текущее состояние
  p1: process (clk, rst)
  begin  -- process p1
    if rst = '1' then
      state <= Q1;
    elsif clk'event and clk = '1' then
      state <= next_state;
    end if;
  end process p1;
 
end beh2;
library ieee;
use ieee.std_logic_1164.all;
 
architecture beh3 of automat is
 
  type state_type is (Q1, Q2, Q3, Q4);
  signal state      : state_type;
 
begin  -- beh
 
  p1: process (clk, rst)
  begin  -- process p1
    if rst = '1' then
      state <= Q1;
    elsif clk'event and clk = '1' then
 
      if state = Q1 then
        if x(1)='1' then
          state <= Q2;
        end if;
 
      elsif state = Q2 then
 
        if x = "10" then
          state <= Q3;
        elsif x(1) = '1' then
          state <= Q4;
        end if;
 
      elsif state = Q3 then
 
      elsif state = Q4 then
 
        if x(1) = '1' then
          state <= Q1;
        end if;
 
      else   -- защита от сбоя
        state <= Q1;
 
      end if;
 
    end if;
  end process p1;
  -- Задание выходной логики (G)
  y <=
    "00" when state = Q1 else
    "10" when state = Q2 else
    "00" when state = Q3 else
    "11" when state = Q4 else
    "00";
 
end beh3;

Слайд: VHDL-модель тестбенча

library ieee;
use ieee.std_logic_1164.all;
 
entity tb is
 
end tb;
 
architecture beh of tb is
 
  component automat
    port (
      x   : in  std_logic_vector(2 downto 1);
      rst : in  std_logic;
      clk : in  std_logic;
      y   : out std_logic_vector(1 downto 0));
  end component;
  signal x   : std_logic_vector(2 downto 1);
  signal rst : std_logic;
  signal clk : std_logic := '0';
  signal y   : std_logic_vector(1 downto 0);
 
begin  -- beh
 
  automat_1: automat
    port map (
      x   => x,
      rst => rst,
      clk => clk,
      y   => y);
 
  clk <= not clk after 10 ns;
  rst <= '1', '0' after 30 ns,
         '1' after 400 ns, '0' after 405 ns;
 
  process
  begin  -- process
 
    x <= "00";
    wait for 55 ns;
    x <= "01";
    wait for 20 ns;
    x <= "01";
    wait for 20 ns;
    x <= "01";
    wait for 20 ns;
    x <= "01";
    wait for 40 ns;
    x <= "10";
    wait for 40 ns;
    x <= "11";
    wait for 40 ns;
    x <= "10";
    wait for 40 ns;
    x <= "01";
    wait;
  end process;
 
end beh;

Слайд: Временные диаграммы

Временные диаграммы проверки автоматов

Слайд: Словесное описание автомата

Панель ввода пароля

  • обеспечить возможность задания нового пароля по нажатию специальной кнопки и ввода старого пароля (пароль по умолчанию 000), а затем ввода нового. При неправильном вводе переходит в начальное состояние (ожидание ввода). При правильном старом пароле включить сигнал "доступ открыт", а после ввода нового пароля отключить сигнал "доступ открыт".
  • ввод пароля с клавиатуры (3х значное десятичное число от 000 до 999). Предусмотреть кнопку сброса введённого пароля (при неправильный вводе).
  • после ввода 3 цифр система проверяет введённый пароль с внутренним значением:
    • если пароли совпадают, то включается светодиод "Доступ открыт" на 3 сек., после чего система переходит в режим ввода пароля
    • если пароли не совпадают, то включается звуковой сигнал "Доступ закрыт" на 0.5 сек., после чего система переходит в режим ввода пароля
    • если после ввода 1й или 2й цифры, следующая цифра (т.е. 2-я или 3я соответственно) не введены более чем через 5 секунд, то включается звуковой сигнал "Доступ закрыт" на 0.5 секунды

Слайд: Алгоритм

[svg]

Слайд: Таблица переходов :step

Элементы системы и управляющие сигналы (входы/выходы)

  • Входы
    • кнопка ввода пароля - сигнал SetPassword
    • цифровые кнопки 0-9 - сигналы DigitalKey[8 downto 0]
    • кнопка отмены ввода - сигнал Esc
    • сигналы (со счетчика) отсчитывающие 0.5, 3, 5 с - Dalay05s, Dalay3s, Dalay5s
    • сигнал синхронизации - clk (активный положительный фронт)
    • асинхронный сброс - RST
  • Выходы
    • управление трехразрядным семисегментным индикатором - Digits2[6:0], Digits1[6:0], Digits0[6:0] (реально Digits[6:0] и Index[2:0])
    • светодиод "Доступ открыт" - сигнал Open
    • Динамик - сигнал Speaker
    • Сигнал запуск отсчета паузы - StartCount

Слайд: Таблица переходов

Текущее состояние Событие (входы) Следующее состояние
Любое RST = 1 Начальное состояние (ожидание ввода)
Начальное состояние Нажата кнопка ввода пароля Режим смены пароля: ввод старого пароля
Начальное состояние Нажата цифровая кнопка Режим ввода пароля (для доступа) (1)
Начальное состояние Нажата кнопка Esc Начальное состояние
Режим смены пароля: ввод старого пароля (0) Ввод первой цифры Режим смены пароля: ввод старого пароля (1), отобразить введённую цифру
Режим смены пароля: ввод старого пароля (0) Прошло 5 с Начальное состояние
Режим смены пароля: ввод старого пароля (1) Ввод второй цифры Режим смены пароля: ввод старого пароля (2), отобразить введённую цифру
Режим смены пароля: ввод старого пароля (1) Прошло 5 с Начальное состояние
Режим смены пароля: ввод старого пароля (2) Ввод третьей цифры Режим смены пароля:
  • если пароль правильный - включить светодиод "доступ открыт" и перейти к "ввод нового пароля (0)"
  • если пароль неправильный - перейти в "Начальное состояние"
Режим смены пароля: ввод старого пароля (0-2) Нажата кнопка Esc Начальное состояние

Слайд: Таблица переходов (2)

Текущее состояние Событие (входы) Следующее состояние
Режим ввода пароля (для доступа) (1) Ввод второй цифры Режим ввода пароля (для доступа) (2)
Режим ввода пароля (для доступа) (2) Ввод третьей цифры Переход в состояние:
  • включение "доступ открыт", если пароль правильный
  • включение сигнала "Доступ закрыт", если пароль не правильный
Режим ввода пароля (для доступа) (1 или 2) Прошло 5 с Начальное состояние
доступ открыт Прошло 3 с Начальное состояние
Доступ закрыт Прошло 0.5 с Начальное состояние

Слайд: Тоже самое в виде графа

[svg]

Слайд: Схема обработки нажатия клавиши

Рисунок - Схема обработки нажатия кнопки Esc (Edit)


Таблица истинности комбинационного блока
EscPress_i1 EscPress_i0 EscPress_i
0 0 0
0 1 0
1 0 1
1 1 0
Логическое выражение
EscPress_i <= EscPress_i1 and not EscPress_i0


Слайд: Блоки обработки нажатия клавиш

Рисунок - Блоки обработки нажатия кнопок (Edit)


Слайд: Блок обработки нажатия цифровых клавиш

Рисунок - Блок обработки нажатия цифровых клавиш (Edit)

Слайд: Граф переходов

[svg]


Слайд: Режимы работы счетчика

[svg]


Слайд: Режимы работы регистра ввода

[svg]


Слайд: NEW