«Случай — это псевдоним Бога, когда Он не хочет подписываться своим собственным именем.» А. Франс

ПЦУСБ/Лекция 4 — различия между версиями

Материал из Wiki
Перейти к: навигация, поиск
м (Слайд: VHDL-модель тестбенча)
м (Слайд: Тоже самое в виде графа)
Строка 562: Строка 562:
 
InputPassword2 -> InputPasswordCompare [label="DigitalKey[9:0]"]
 
InputPassword2 -> InputPasswordCompare [label="DigitalKey[9:0]"]
  
InputPasswordCompare -> Open [label="InCode = Password"]
+
InputPasswordCompare -> OpenAccess [label="InCode = Password"]
 
InputPasswordCompare -> InputPasswordNotCompared [label="InCode /= Password"]
 
InputPasswordCompare -> InputPasswordNotCompared [label="InCode /= Password"]
  
Open -> Start [label="Delay3s"]
+
OpenAccess -> Start [label="Delay3s"]
  
 
InputPasswordNotCompared -> Start [label="Delay05s"]
 
InputPasswordNotCompared -> Start [label="Delay05s"]

Версия 23:21, 16 октября 2013

Лекции ПЦУСБ

Лекции

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

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

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

Заголовок
Цифровые автоматы
Автор
Авдеев Н.А.
Нижний колонтитул
ПЦУСБ/Лекция 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
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;

Слайд: 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;

Слайд: Последовательный оператор CASE

  • Последовательный — значит может использоваться только в process
case Выражение is
   when Значение =>
     Последовательные операторы
   when Значение [ | Значение ] =>
      Последовательные операторы
end case;
  • Значение может быть числом (литералом), простым выражением (например, a + b), диапазоном значений (1 to 10), ключевым словом others.


Примеры
case SEL is
  when "01"   => Z <= A;
  when "10"   => Z <= B;
  when others => Z <= 'X';
end case;
case INT_A is
  when 0      => Z <= A;
  when 1 to 3 => Z <= B;
  when 4|6|8  => Z <= C;
  when others => Z <= 'X';
end case;
Примеры ошибок
Nuvola apps error.png перекрытие диапазонов
case INT_A is
  when 0      => Z <= A;
  when 1 to 3 => Z <= B;
  when 2|6|8  => Z <= C;   -- illegal
  when others => Z <= 'X';
end case;
Nuvola apps error.png Диапазон для вектора задавать нельзя
signal VEC : unsigned(2 downto 0);
....
case VEC is
  when "000" to "010" 
               =>  Z <= A;   -- illegal
  when "111"   =>  Z <= B;
  when others  =>  Z <= 'X';
end case;

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

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

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

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

  • обеспечить возможность задания нового пароля по нажатию специальной кнопки и ввода старого пароля (пароль по умолчанию 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]

Слайд: NEW