Счётчики
Счётчик — последовательная схема, которая считает тактовые импульсы и хранит текущее значение.
🎓 В курсе nand2cpuПрактика: Урок 24: Счётчик — строим счётчик из D-триггеров
Зачем нужны счётчики
| Задача | Пример |
|---|---|
| Деление частоты | 16 МГц → 1 Гц для часов |
| Подсчёт событий | Импульсы энкодера, обороты |
| Адресация памяти | Program Counter в CPU |
| Временные интервалы | Таймеры, PWM |
| Последовательности | Машина состояний |
Принцип работы
┌─────────────────────────────────┐
CLK ────┤ │
│ n-битный счётчик ├──► Q[n-1:0]
RST ────┤ │
└─────────────────────────────────┘
Каждый фронт CLK: значение += 1
При RST=1: значение = 0
Двоичный счётчик
n-битный счётчик проходит значения от 0 до $2^n - 1$, затем «переполняется» в 0:
3-битный счётчик:
CLK _│‾│_│‾│_│‾│_│‾│_│‾│_│‾│_│‾│_│‾│_│‾│_
0 1 2 3 4 5 6 7 0 ← переполнение
Q2 ___________│‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾│___________
Q1 _____│‾‾‾‾‾│_____│‾‾‾‾‾│_____│‾‾‾‾‾│___
Q0 __│‾‾│__│‾‾│__│‾‾│__│‾‾│__│‾‾│__│‾‾│__│
| Такт | Q2 | Q1 | Q0 | Десятич. |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 1 | 1 |
| 2 | 0 | 1 | 0 | 2 |
| 3 | 0 | 1 | 1 | 3 |
| 4 | 1 | 0 | 0 | 4 |
| 5 | 1 | 0 | 1 | 5 |
| 6 | 1 | 1 | 0 | 6 |
| 7 | 1 | 1 | 1 | 7 |
| 8 | 0 | 0 | 0 | 0 ← overflow |
Деление частоты
Каждый бит счётчика делит частоту на 2:
CLK (16 МГц) ─┬─► Q0 (8 МГц) = CLK/2
├─► Q1 (4 МГц) = CLK/4
├─► Q2 (2 МГц) = CLK/8
└─► Q3 (1 МГц) = CLK/16
Формула: частота на бите N = $\frac{f_{CLK}}{2^{N+1}}$
Пример: из 32768 Гц (часовой кварц) получить 1 Гц:
- Нужно делить на 32768 = $2^{15}$
- Требуется 15-битный счётчик
- 1 Гц берём с выхода Q14
Типы счётчиков
Асинхронный (ripple counter)
┌───┐ ┌───┐ ┌───┐
CLK ────►│T-FF├─Q─►│T-FF├─Q─►│T-FF├─► Q2
│ │ │ │ │ │
└───┘ └───┘ └───┘
Q0 Q1 Q2
- Плюс: простая схема
- Минус: задержки накапливаются (ripple = «рябь»)
Синхронный счётчик
┌───┐ ┌───┐ ┌───┐
CLK ─┬──►│D-FF│ │D-FF│ │D-FF│
│ └───┘ └───┘ └───┘
│ ↑ ↑ ↑
└─────┴───────┴───────┘
Все триггеры по одному CLK!
- Плюс: все выходы переключаются одновременно
- Минус: сложнее логика управления
74HC393 — двойной 4-битный ripple
74HC163 — 4-битный синхронный с параллельной загрузкой
Счётчик с модулем (mod-N)
Не всегда нужен полный диапазон $2^n$. Примеры:
| Модуль | Применение |
|---|---|
| mod-10 | BCD-счётчик (0–9) |
| mod-12 | Часы (1–12) |
| mod-60 | Секунды/минуты |
| mod-256 | 8-битный полный |
Схема mod-N (сброс по достижении)
┌─────────┐
CLK ────►│ счётчик ├──► Q[3:0]
│ │ │
RST ◄────┤ │ │
↑ └─────────┘ │
│ ▼
└────[AND]◄── детектор N
Пример mod-10: сброс когда Q = 1010 (десять)
RST = Q3 AND Q1 (1010: Q3=1, Q2=0, Q1=1, Q0=0)
74HC390 — двойной десятичный счётчик (mod-10)
Счётчик вверх/вниз
┌─────────────┐
CLK ────►│ ├──► Q[n-1:0]
│ Up/Down │
UP/DN ──►│ Counter ├──► CARRY
│ ├──► BORROW
└─────────────┘
UP/DN = 1: счёт вверх (0,1,2,3...)
UP/DN = 0: счёт вниз (3,2,1,0...)
74HC193 — 4-битный up/down с раздельными входами
Применение в робототехнике
Энкодер колеса
Импульсы ─────► Счётчик ────► Пройденное расстояние
энкодера (up/down) в "тиках"
Направление ──►
Таймер (delay)
1 МГц ────► Счётчик ────► Компаратор ────► Выход
(16 бит) = 1000?
│
▼
1 мс интервал
Program Counter (PC)
В CPU счётчик команд — это счётчик с возможностью загрузки:
- Обычно: PC += 1
- При JMP: PC = адрес
Подробнее: Урок 28: Program Counter
Микросхемы серии 74xx
| Микросхема | Тип | Биты | Особенности |
|---|---|---|---|
| 74HC93 | Ripple | 4 | Делитель ÷2 и ÷8 |
| 74HC393 | Ripple | 2×4 | Двойной, независимые |
| 74HC163 | Синхр. | 4 | Загрузка, enable |
| 74HC193 | Up/Down | 4 | Раздельные CLK↑/↓ |
| 74HC390 | Десятич. | 2×4 | Mod-10, для дисплея |
| 74HC4040 | Ripple | 12 | Большой делитель |
Сигналы управления
| Сигнал | Назначение |
|---|---|
| CLK | Тактовый вход (по фронту) |
| RST/CLR | Сброс в 0 |
| LOAD | Загрузка начального значения |
| EN | Разрешение счёта |
| UP/DN | Направление счёта |
| TC/CO | Terminal Count — достигнут максимум |
Каскадирование
Для большей разрядности соединяем счётчики:
┌────────┐ ┌────────┐
CLK ────►│ 4-bit ├── TC ───►│ 4-bit ├──► 8-битный
│counter │ │counter │ результат
└────────┘ └────────┘
Q[3:0] Q[7:4]
TC (Terminal Count) первого запускает второй при переполнении.
Связь с другими темами
- Триггеры — базовые ячейки: sequential_logic
- Тактирование — источник CLK: clock_timing
- Двоичная система — зачем степени 2: binary_numbers
- nand2cpu — счётчик в CPU: Урок 24
Мини‑задания
Сколько состояний у 4-битного счётчика?
Какая частота на выходе Q3 если CLK = 1 МГц?
Как сделать mod-6 счётчик из 3-битного?
Зачем нужен сигнал TC (Terminal Count)?
В чём недостаток ripple-счётчика?
Details
$2^4 = 16$ состояний (0–15)
$f_{Q3} = \frac{1\text{ МГц}}{2^4} = 62.5\text{ кГц}$
Сброс при Q = 110 (шесть):
RST = Q2 AND Q1TC сигнализирует о переполнении — используется для каскадирования или прерываний
Задержки накапливаются: Q0 переключится раньше Q3, что может вызвать глитчи при чтении
