Skip to main content

Последовательная логика (триггеры)

Комбинационная логика забывает — выключил питание и всё пропало. А что если нужно запомнить? 🧠

Для этого нужны триггеры — элементы с памятью.

🎓 В курсе nand2cpu
Строим память с нуля: Акт III — Память (SR-защёлка → D-триггер → регистр → RAM)

Комбинационная vs Последовательная логика

КОМБИНАЦИОННАЯ:                ПОСЛЕДОВАТЕЛЬНАЯ:

Входы ──► [Логика] ──► Выход   Входы ──► [Логика] ──► Выход
                                     ↑           │
   Выход = f(входы)                  └── ПАМЯТЬ ←┘
   
   Нет памяти!                 Выход = f(входы, состояние)
   Забывает сразу!             Помнит!

Зачем нужна память

ЗадачаПочему нужна память
Кнопка включенияНажал → включилось, отпустил → осталось включённым
АварияСработала → заблокировано до сброса
СчётчикПомнит сколько уже насчитал
Режим работыПомнит в каком режиме сейчас

SR-защёлка — самая простая память

SR = Set/Reset (установить/сбросить)

        ┌─────┐
S ──────┤ NOR ├──┬──► Q
   ┌────┤     │  │
   │    └─────┘  │
   │             │
   │    ┌─────┐  │
   └────┤ NOR ├──┘
R ──────┤     ├──────► Q̄
        └─────┘
SRQ (выход)Что происходит
00QХранит предыдущее значение
101Set — записывает 1
010Reset — записывает 0
11?❌ Запрещено!

Главная идея: когда S=0 и R=0, защёлка помнит что было раньше!

Подробнее: Урок 19: SR-защёлка

D-защёлка — убираем запрещённое состояние

D = Data (данные)

       ┌───┐
D ─────┤   ├──────► Q
       │ D │
EN ────┤   ├──────► Q̄
       └───┘
ENDQ
0xQ (хранит)
100
111

Когда EN=1 — защёлка «прозрачная» (Q = D)
Когда EN=0 — защёлка «заморожена» (Q не меняется)

Подробнее: Урок 20: D-защёлка

D-триггер — запоминает по фронту

Триггер (flip-flop) запоминает значение только в момент фронта тактового сигнала:

       ┌───┐
D ─────┤   ├──────► Q
       │ D │
CLK ───┤>  ├──────► Q̄
       └───┘
       
       ↑ треугольник = по фронту
CLK  ___│‾‾‾│___│‾‾‾│___│‾‾‾│___
           ↑       ↑       ↑
D    ──────┐   ┌───┴───────┴────
           └───┘
           
Q    ──────────┐       ┌────────
               └───────┘
               
        Запомнил    Запомнил
        D=1         D=0

Почему это важно:

  • Защёлка меняется пока EN=1 (может «дрожать»)
  • Триггер меняется только в момент фронта CLK (стабильно!)

Подробнее: Урок 21: D-триггер

Сравнение: защёлка vs триггер

СвойствоЗащёлка (latch)Триггер (flip-flop)
Когда меняетсяПока EN=1Только по фронту CLK
СтабильностьМожет «дрожать»Стабильно
ПрименениеПростые схемыСинхронные системы
В nand2cpuУрок 19-20Урок 21

Регистр — несколько триггеров вместе

8 D-триггеров = 8-битный регистр (хранит 1 байт):

        ┌─────────────────────┐
D[7:0] ─┤                     ├─► Q[7:0]
        │   8× D-триггер      │
CLK ────┤>                    │
        └─────────────────────┘

74HC374 — 8-битный регистр на микросхеме

Подробнее: Урок 22: Регистр

Такт (Clock) — сердце цифровой схемы

CLK  ___│‾‾‾│___│‾‾‾│___│‾‾‾│___│‾‾‾│___
        ↑       ↑       ↑       ↑
    фронт   фронт   фронт   фронт
    
    Всё происходит по фронтам!
ТерминЗначение
Rising edge ↑Переход 0→1 (передний фронт)
Falling edge ↓Переход 1→0 (задний фронт)
Период TВремя одного цикла
Частота fСколько циклов в секунду (f = 1/T)

Автомат состояний (FSM)

FSM = Finite State Machine (конечный автомат)

Пример: робот с тремя режимами

         ┌─────────┐
    ┌───►│ СТОП    │◄───┐
    │    │  (S0)   │    │
    │    └────┬────┘    │
    │         │ кнопка  │ авария
    │         ▼         │
    │    ┌─────────┐    │
    │    │ ВПЕРЁД  │────┘
    │    │  (S1)   │
    │    └────┬────┘
    │         │ препятствие
    │         ▼
    │    ┌─────────┐
    └────│ НАЗАД   │
         │  (S2)   │
         └─────────┘

Как это работает:

  1. Текущее состояние хранится в регистре
  2. Комбинационная логика решает куда переходить
  3. По фронту CLK — переход в новое состояние

Типовые ошибки

ОшибкаПроблемаРешение
Дребезг кнопкиМного «нажатий» за разАнтидребезг 20 мс
Асинхронный входМетастабильностьСинхронизатор (2 триггера)
Гонки сигналовНеправильные состоянияСинхронная логика
Забыл сбросСлучайное начальное состояниеДобавь RST

Синхронизатор — защита от метастабильности

Когда внешний сигнал (кнопка) приходит в «плохой» момент:

                    Может быть
CLK  ___│‾‾‾│___    метастабильность!
Кнопка ────┼─── меняется слишком близко к фронту
        Триггер
        «завис» между 0 и 1

Решение — два триггера подряд:

Кнопка ──► [D-FF] ──► [D-FF] ──► К логике
              ↑          ↑
              CLK        CLK
              
           «Ловит»   «Стабилизирует»

Что из чего строится

NAND ──► SR-защёлка ──► D-защёлка ──► D-триггер
                          Регистр ◄── Счётчик ◄── RAM
                                        CPU!

Всё это мы строим в курсе nand2cpu!

Микросхемы серии 74xx

МикросхемаЧто внутриПрименение
74HC742× D-триггерДелители, синхронизаторы
74HC1746× D-триггерРегистры
74HC3748× D-триггер с OEШины данных
74HC5738× D-защёлкаАдресные защёлки
74HC2794× SR-защёлкаАнтидребезг

Связь с другими темами

  • Комбинационная логика — без памяти: combinational_logic
  • Счётчики — триггеры считают: counters
  • Тактирование — откуда CLK: clock_timing
  • Антидребезг — SR-защёлка помогает: debouncing
  • nand2cpu Акт III — строим память: Акт III

Мини-задания

  1. Чем последовательная логика отличается от комбинационной?

  2. Когда D-триггер запоминает значение?

  3. Почему SR-защёлка с S=1, R=1 — запрещённое состояние?

  4. Зачем нужен синхронизатор из двух триггеров?

  5. Из скольких D-триггеров состоит байтовый регистр?

Details
  1. В последовательной есть память — выход зависит от предыдущего состояния

  2. Только в момент переднего фронта CLK (переход 0→1)

  3. Оба выхода Q и Q̄ станут одинаковыми — это противоречит логике (Q должен быть NOT Q̄)

  4. Первый триггер может «зависнуть» в метастабильном состоянии, второй стабилизирует сигнал

  5. 8 D-триггеров (по одному на каждый бит)

Интерактивные симуляции

Попробуй схемы в симуляторе Falstad — можно кликать на элементы и смотреть что происходит:

SR-защёлка на NOR

D-триггер

D-триггер (по фронту)

Больше симуляций — на falstad.com/circuit