Обучение › Тема 10
Счётчики и сдвиговые регистры: проектирование шаг за шагом
7 мин чтения · Команда bitGateLab
Счётчик — это группа триггеров, которая с каждым тактовым импульсом проходит фиксированную последовательность состояний; регистр — это группа триггеров, которая хранит или сдвигает двоичное слово. С их помощью измеряют время, делят частоту, преобразуют данные из последовательной формы в параллельную и формируют управляющие последовательности. Вам нужно хорошо представлять себе D-, JK- и T-триггеры и их таблицы возбуждения, о которых рассказано в теме «защёлки и триггеры».
Асинхронный счётчик (с последовательным переносом)
Самый простой способ считать — соединить в цепочку T-триггеры с T = 1, чтобы каждый переключался и делил частоту на 2. Только первый получает системный тактовый сигнал; каждый из следующих тактируется выходом предыдущего. Если триггеры срабатывают по спадающему фронту, выход Q одного разряда подключают к тактовому входу следующего, и счётчик считает вверх; при нарастающем фронте для счёта вверх нужно использовать Q (с Q он считал бы вниз).
Его недостаток — накапливающаяся задержка: разряд n не изменится, пока не изменятся все предыдущие, словно по цепочке бежит волна. В течение этого времени на выходе появляются ложные значения.
Пример: 4-битный асинхронный счётчик с tCQ = 12 ns на триггер. Он переходит из 0111 в 1000.
- Q0 меняется с 1 на 0 через 12 ns: на выходе читается 0110.
- Q1 меняется через 24 ns: 0100.
- Q2 меняется через 36 ns: 0000.
- Q3 меняется через 48 ns: 1000, правильное значение.
В течение 48 ns на выходе побывали 0110, 0100 и 0000. Если какая-то схема дешифрирует эти значения, она увидит ложные импульсы. Чтобы всегда читать установившееся значение, период тактового сигнала должен превышать 48 ns, то есть f < 20.8 MHz.
Синхронный счётчик
В синхронном счётчике все триггеры получают один и тот же тактовый сигнал, а кто из них переключается, решает логика. В двоичном суммирующем счётчике бит переключается, когда все младшие биты равны 1:
T0 = 1, T1 = Q0, T2 = Q0·Q1, T3 = Q0·Q1·Q2
Все выходы меняются вместе, через tCQ после фронта. Минимальный период больше не растёт с числом бит из-за цепочки триггеров, а определяется суммой tCQ + задержка элемента AND + tsu.
Счётчик по модулю N
Счётчик по модулю N проходит N состояний и начинает сначала. Ему нужно не меньше ⌈log2 N⌉ триггеров. Сделать его можно двумя способами.
С асинхронным сбросом: берут двоичный счётчик и обнаруживают первое состояние, которое не должно появляться. Для модуля 10 это состояние 1010; достаточно элемента NAND от Q3 и Q1, подключённого ко входу сброса (clear) с активным низким уровнем, потому что здесь Q3 и Q1 впервые равны 1 одновременно. Это работает, но состояние 1010 появляется на несколько наносекунд и порождает короткий импульс на выходах.
Синхронное проектирование: записывают таблицу состояний и вычисляют входы по таблице возбуждения. Переходных состояний нет.
Пример: синхронный счётчик по модулю 6 (от 0 до 5) на T-триггерах. Состояния Q2 Q1 Q0; состояния 110 и 111 не используются и помечаются как X.
| Q2 Q1 Q0 | Следующее | T2 | T1 | T0 |
|---|---|---|---|---|
| 000 | 001 | 0 | 0 | 1 |
| 001 | 010 | 0 | 1 | 1 |
| 010 | 011 | 0 | 0 | 1 |
| 011 | 100 | 1 | 1 | 1 |
| 100 | 101 | 0 | 0 | 1 |
| 101 | 000 | 1 | 0 | 1 |
Каждое T равно 1, когда соответствующий бит меняется. Упрощая с учётом X, получаем:
- T0 = 1.
- T1 = Q2·Q0 (покрывает 001 и 011; в 101 равно 0, потому что Q2 = 1).
- T2 = Q1·Q0 + Q2·Q0 = Q0·(Q1 + Q2).
Проверьте неиспользуемые состояния: из 110 при T2 = 0, T1 = 0, T0 = 1 счётчик переходит в 111; из 111 при T2 = 1, T1 = 0, T0 = 1 — в 010. Оба возвращаются в последовательность: счётчик запускается сам, даже если при включении окажется в недопустимом состоянии.
Сдвиговые регистры
Сдвиговый регистр — это D-триггеры, соединённые в цепочку: выход каждого подаётся на вход следующего, и с каждым фронтом все биты продвигаются на одну позицию. По тому, как данные входят и выходят, регистры классифицируют так:
- SISO (последовательный вход, последовательный выход): задерживает сигнал на n тактов.
- SIPO (последовательный вход, параллельный выход): принимает биты по одному и выдаёт их все вместе. Преобразует последовательный код в параллельный.
- PISO (параллельный вход, последовательный выход): загружает слово целиком и выдаёт его бит за битом. На входе каждого триггера стоит MUX 2 в 1:
Di = LOAD·Pi + LOAD·Qi−1. - PIPO (параллельный вход, параллельный выход): простой регистр хранения.
Пример: 4-битный регистр SIPO, изначально в состоянии 0000, где Q0 ← вход, Q1 ← Q0, Q2 ← Q1, Q3 ← Q2. Передаются биты 1, 0, 1, 1 в этом порядке.
| Фронт | Входной бит | Q0 Q1 Q2 Q3 |
|---|---|---|
| 1 | 1 | 1 0 0 0 |
| 2 | 0 | 0 1 0 0 |
| 3 | 1 | 1 0 1 0 |
| 4 | 1 | 1 1 0 1 |
После 4 фронтов регистр, прочитанный как Q3 Q2 Q1 Q0, содержит 1011: первый переданный бит оказался в Q3.
Кольцевой счётчик и счётчик Джонсона
Если выход последнего триггера сдвигового регистра соединить со входом первого, получится кольцевой счётчик. В него заносят одну-единственную 1 (например, 1000), и эта 1 циркулирует: 1000, 0100, 0010, 0001, 1000. При n триггерах у него n состояний, и каждое состояние уже дешифрировано, потому что только один выход равен 1. Начальную загрузку нужно гарантировать: если счётчик стартует в 0000, он останется там навсегда.
Если вместо Q завести в обратную связь Q последнего триггера, получится счётчик Джонсона (или счётчик на «скрученном кольце») с 2n состояниями. Для 4 бит (Q0 Q1 Q2 Q3, где Q0 ← Q3):
0000 → 1000 → 1100 → 1110 → 1111 → 0111 → 0011 → 0001 → 0000
Каждое состояние распознаётся элементом AND всего с двумя входами, если смотреть, где проходит граница между единицами и нулями: например, 1100 — единственное состояние с Q1 = 1 и Q2 = 0, а 0000 — единственное с Q0 = 0 и Q3 = 0.
Типичные ошибки
- Дешифрировать выходы асинхронного счётчика комбинационной логикой, не учитывая переходные состояния.
- Подключить Q вместо Q между разрядами асинхронного счётчика, срабатывающего по нарастающему фронту, и получить вычитающий счётчик.
- Забыть проверить, куда ведут неиспользуемые состояния счётчика по модулю N.
- Запустить кольцевой счётчик, не загрузив начальную 1.
- Перепутать порядок битов при чтении регистра SIPO: бит, вошедший первым, оказывается на самом дальнем конце.
Попробуйте в симуляторе
Сравнить асинхронный счётчик с синхронным на временной диаграмме — лучший способ увидеть эффект «волны» последовательного переноса.
- Поместите четыре T-триггера с T = 1, подключите тактовый сигнал к первому и соедините остальные в цепочку как асинхронный счётчик.
- Подключите четыре выхода к светодиодам и к индикатору или к линейке светодиодов.
- Соберите рядом синхронный счётчик с T1 = Q0, T2 = Q0·Q1 и T3 = Q0·Q1·Q2, все триггеры — с одним и тем же тактовым сигналом.
- Откройте временную диаграмму, запустите тактовый сигнал и понаблюдайте за переходом из 0111 в 1000 в обоих счётчиках.
- Соберите регистр из четырёх D-триггеров в цепочку, меняйте последовательный вход перед каждым фронтом и наблюдайте, как продвигаются биты; затем заведите Q последнего разряда на первый и проверьте все 8 состояний счётчика Джонсона.
Упражнения
- Сколько триггеров нужно для счётчика по модулю 12 — двоичного, кольцевого и счётчика Джонсона?
Ответ
Двоичный: 4 (24 = 16 ≥ 12). Кольцевой: 12. Джонсона: 6 (2 × 6 = 12).
- Какой элемент и какие выходы вы взяли бы, чтобы сделать счётчик по модулю 12 с асинхронным сбросом с активным низким уровнем из 4-битного двоичного счётчика?
Ответ
12 = 1100. Элемент NAND от Q3 и Q2, подключённый ко входу сброса (clear), потому что здесь оба впервые равны 1.
- В 8-битном асинхронном счётчике используются триггеры с tCQ = 10 ns. Каково наихудшее время установления?
Ответ
8 × 10 = 80 ns, например при переходе из 01111111 в 10000000.
- Какой двухвходовый элемент AND дешифрирует состояние 0111 4-битного счётчика Джонсона?
Ответ
Q0·Q1: это единственное состояние с Q0 = 0 и Q1 = 1.