В предыдущих уроках курса схемотехники я узнал о комбинационной логике: это когда комбинация выходных сигналов зависит от входных сигналов, подаваемых только в текущий момент. Последовательностная логика же зависит от состояния входных сигналов и до текущего момента. То есть в какой последовательности что изменялось — поэтому называть логику «последовательной» будет ошибкой.

На маршруте последовательностной логики меня поджидает своего рода counter strike — два секундомера в качестве финального проекта курса схемотехники. По пути освою новые компоненты… и новые среды эмуляции. Долой трехмерность, даешь эффективность!

Базовый элемент последовательностной логики — триггер. В простейшей реализации это просто два инвертора, замкнутых друг на друга. Если в первом узле логический ноль, то во втором — логическая единица, которая поддержит логический ноль в первом.

Помимо несомненного преимущества— простоты реализации — такой триггер имеет и неизбежный недостаток: совпадение входов и выходов схемы — это неудобно.

RS-триггер — пробуем Falstad

Соберем триггер с раздельными входами (R и S) и выходами (Q и Qn). Чтобы показать суть триггеров, статичной картинки недостаточно: ведь главной фишкой здесь является сохранение предыдущего состояния. Судя по прошлому посту, трехмерный CRUMB с таким справляется плоховато. Поэтому воспользуюсь советом Родиона и попробую онлайн-симулятор Falstad.

Зеленые входы и выходы — логическая единица, серые — логический ноль. Голубые — это я логически кручу напряжение на одном из входов, чтобы проиллюстрировать таблицу истинности для RS-триггера на вентилях 2И-НЕ. На всякий случай: R и Q в анимации сверху, S и Qn — внизу.

Поясню ключевые моменты:

  1. Я выставляю на входах комбинацию «1 и 0» или «0 и 1».

  2. На выходах получаю «0 и 1» или «1 и 0» соответственно.

  3. После этого переключаю вход, что был с 0, на 1.

  4. Выходы не меняются! Срабатывает сохранение предыдущего состояния — для этого достаточно подать «1 и 1»!

  5. «0 и 0» на входе выдает ошибку. Оба выхода переходят в высокий логический уровень, а так быть не должно, потому что они парафазные (то есть принимающие противоположные значения).

Falstad — весьма неплохой минималистичный эмулятор. Он оперирует теми же условными обозначениями, что я привык видеть в схемах на бумаге, и при этом демонстрирует их работу в анимации. На старте стоит запомнить горячие клавиши эмулятора — это серьезно сэкономит время в дальнейшем. У Falstad есть много настроек, а также загружаемые версии для основных десктопных ОС.

RS-триггер на вентилях 2ИЛИ-НЕ я для полноты картины все-таки соберу в CRUMB.

Вот таблица истинности, в соответствии с ней я наклеил выше ярлычки.

В эмуляции удалось воспроизвести только сброс и установку. В режиме хранения вспыхивали оба светодиода на выходах, вне зависимости от предыдущего состояния. Возможно, где-то я ошибся, и вы увидите проблему на картинке. Возможно, это какой-то баг: в пользу этой версии говорит то, что у меня не заработала кнопка, через которую я хотел реализовать мгновенное переключение логических уровней. Если что, на картинке выше контакт GND микросхемы 74HC02 (4ИЛИ-НЕ) выведен на «землю» с другой стороны макетки, это в скриншот не влезло.

В итоге я и этот RS-триггер смоделировал с Falstad: поменял 2И-НЕ на 2ИЛИ-НЕ, и все заработало зеркально. Успех на этом этапе дал мне еще одну возможную причину неудачи.

В реальных применениях RS-триггеры, которые мы с вами рассмотрели, встречаются не очень часто. Ведь добиться идеальной одновременности переключения входных сигналов, как это нарисовано на обоих временных диаграммах в момент t1 не получится по ряду причин: может отличаться скорость прохождения сигналов в предшествующих частях схемы или длина проводов.

Так начинается раздел «Вход синхронизации» в материалах курса. В CRUMB я вручную переставляю виртуальные 3D-элементы на виртуальной макетке. Сделать это мгновенно невозможно: надо выбрать перемычку, удалить ее и протянуть новую. В Falstad же я могу переключать уровни мгновенно, так как все визуализировано на уровне схем.  

Вход синхронизации

Чтобы исключить переход схемы к запрещенным уровням, к RS-триггеру мы добавляем вход C, также именуемый входом синхронизации или тактовым. При C = 0 на схеме ниже в RS-триггер не пройдет ни R, ни S, и состояние основной, правой части схемы, сохранится.

Посмотрим на таблицу истинности этой схемы. Стало интересней, добавился третий вход. Интересно, что для хранения у нас теперь два состояния. Если R = 0 и S = 0, то режим хранения активируется вне зависимости от тактируемого триггера.

D-триггер — пробуем SimulIDE

Я разобрался, как последовательностная логика в принципе позволяет хранить данные. Теперь нужно отбросить все лишнее, чтобы в схеме остались данные на входе, триггер хранения и данные на выходе. Это и есть D-триггер. D — это delay, задержка, то есть сигнал задерживается до следующего высокого уровня тактового импульса.

Какая лаконичная таблица истинности — никаких запрещенных состояний
Какая лаконичная таблица истинности — никаких запрещенных состояний

Здесь я начинаю срезать углы. Не буду строить триггеры из логических элементов, а возьму готовые. Эфирное время лучше использую для рассказа о другой среде симуляции — SimulIDE. За наводку спасибо Андрею.

SimulIDE тоже распространяется бесплатно, автору можно отправить донат на странице загрузки. Доступны версии для Windows, MacOS и Linux. Помимо симуляции в реальном времени, здесь есть редактор кода и дебаггер для Arduino, GcBasic, PIC asm и других устройств.

Рабочее окно программы включает много разных областей, но пока мне нужен только браузер компонентов и стол в клеточку. Освоиться в SimulIDE было не сложнее, чем в Falstad. Через мышку меняется масштаб рабочей области, через стрелки двигается окно обзора. Поначалу может раздражать прокладывание проводов между компонентами, программа догадывается не всегда, надо привыкнуть.

Все компоненты имеют множество настроек, которые появляются в отдельном окне, и это удобно. А что неудобно, так это неприметные кнопки управления симуляцией, которые всегда выпадают из вида. Ищешь ошибку в безответной схеме, а все оборвалось лишь потому, что IDE просто решила тормознуть процесс.

Среди готовых примеров SimulIDE я нашел D-триггер, это его исходная версия. Чтобы он заработал в соответствии с таблицей истинности выше, я через настройки отключил Set и Reset и поменял тип триггера с Clock на Enable. Подпись Clock можно тоже поменять.

Двухступенчатые триггеры

В физическом мире уязвимое место триггера — это его тактируемый вход C. Мгновенный скачок напряжения может открыть триггер, что приведет к нежелательным изменениям данных. Для повышения отказоустойчивости триггеры последовательно соединяют друг с другом.

Схема двухступенчатого триггера на вентилях И-НЕ нашлась в Falstad. На что стоит обратить внимание:

  1. Тактовый импульс периодически меняется так, что на master и slave поочередно подаются высокий и низкий логический уровень.

  2. При фронте (переходе с низкого уровня на высокий) master-триггер пропускает входящие сигналы, а slave-триггер хранит сохраненные.

  3. При срезе (переходе с высокого на низкий) master-триггер хранит сигналы, а slave — принимает их от master-триггера.

Такая «шлюзовая система» из триггеров практически гарантирует отказоустойчивость. Количество триггеров, управляемых общим тактовым сигналом, соответствует разрядности данных, которые может обрабатывать процессор: 32 триггера, например, принимают 32-разрядные данные (то есть 32 бита информации в один момент).

Конденсаторы

Следующая тема курса — конденсаторы, компоненты для накопления электрического заряда. Многие конденсаторы, что мы встречаем в быту, имеют на торце насечку в виде трехлучевой звезды — это нужно, чтобы при возможном взрыве конденсатора направить электролит четко в одну сторону.

В курсе работают с электролитическими конденсаторами, в CRUMB доступны еще и керамические — внешне они там неразличимы. Выше — простейшая RC-цепь для зарядки и разрядки. Чем мощнее резистор (R), тем дольше заряжается и разряжается конденсатор (C) и длиннее экспоненциальная кривая этого процесса.

Интересно, что и в курсе, и в CRUMB я не увидел измерения именно накопленных фарад. Везде при заряде и разряде у конденсатора изменялось напряжение — от нулевого до того, что подается в цепь, и обратно. Напряжение у определения емкости в знаменателе… получается, при одном и том же напряжении цепи конденсатор с бо́льшей электрической емкостью будет заряжаться и разряжаться дольше. Максимальное напряжение, кстати, на реальных конденсаторах указывают, а в CRUMB его нет — симуляция все стерпит.

Генератор синхросигналов

Конденсатор заряжают и разряжают, а значит, в разных состояниях его уровень можно привести к логическому нулю или единице. И зациклить переключение этих состояний.

 

Собрав схему выше, в пронумерованных точках мы получим четкую осцилляцию, которую можно продемонстрировать, добавив светодиод в конце схемы. Еще интереснее выглядит кривая заряда конденсатора:

Это уже аналоговая электроника. В точке нулевого заряда конденсатора по сути получается RC-схема, описанная выше, и конденсатор начинает заряжаться по экспоненциальной кривой через резистор. При росте до определенного напряжения логический уровень на точках 0 и 2 становится высоким — этот порог зависит от инвертора. Заряд на правой обкладке конденсатора получается бо́льшим, чем на левой, и тот начинает разряжаться через резистор в точку 1 с низким логическим уровнем.

При достижении того же порога инвертор срабатывает в обратном направлении, состояния в точках схемы меняются на противоположные, и все повторяется. Частоту колебаний можно регулировать, устанавливая резисторы с иным сопротивлением или конденсаторы иной емкости.

Чтобы эмулировать эту схему, у нас есть уже три виртуальные среды. Спойлер: не заработало ни в одной.

Вот Falstad, внизу слева — логический уровень последнего инвертора, справа — напряжение на конденсаторе. Лишь после тщательной настройки скоростей симуляции и тока мне удалось добиться какой-то осцилляции. Но она хаотична и не поддается настройке через параметры конденсатора и резистора. Интересный скачущий график на конденсаторе тоже не получается, он просто разряжается по экспоненте. 

SimulIDE оказался лучше лишь тем, что показал частоту осцилляции — 50 МГц, то есть 50 тысяч изменений состояния в секунду. Это очень далеко от того, что было в курсе, и выглядит как какая-то ошибка. В CRUMB я сделал то же самое на микросхеме с 4НЕ и получил такое же бесконтрольное мигание светодиодов.

Отложим виртуальные инструменты и вернемся к теории. Колебания, которые можно получить в генераторах с помощью электролитических конденсаторов, недостаточно стабильны, чтобы найти широкое применение. Но существует особый класс компонентов, которые демонстрируют высочайшую стабильность колебаний заранее установленной частоты. Это кварцевые резонаторы — да, те самые из крутых кварцевых часов. Частота колебаний кварцевых резонаторов обычно привязана к степеням двойки и выражена в герцах (колебаниях в секунду).

К этому моменту у нас есть все, чтобы собрать финальные проекты. Осталось разве что открыть для себя T-триггеры. Такой триггер можно получить, если сигнал с выхода Qn двухступенчатого D-триггера подать на его же вход.

Пока тактовый импульс T-триггера совершает два переключения, выход T-триггера переключается один раз. То есть T-триггер делит частоту следования импульсов в два раза.

Секундомер на двоичном счетчике

Секундомер на двоичном счетчике возможен благодаря двум условиям:

  • T-триггеры делят частоту поступающего импульса надвое.

  • При последовательном счете любые соседние разряды двоичного числа меняют свое состояние в два раза реже.

Вот как выглядит итоговое устройство на макетной плате:

Да, вот за это многие и не жалуют макетные платы. Но если поставить рядом схему проекта, все становится понятней.

На нижней плате собрано четыре T-триггера — каждый на двух D-триггерах в пределах своей микросхемы. Еще одна микросхема — это генератор импульса, рядом с ней установлен единственный в схеме конденсатор. Шестая схема в нижнем ряду отвечает за переход к модулю 10: при достижении счетчиком двоичного кода 1010 (10 в десятичной системе) происходит сброс триггеров.

На верхней плате установлены две микросхемы CD4511BE — два декодера для семисегментных индикаторов в углу. Такие технологии в CRUMB еще не завезли, да и выглядеть это будет так же «наглядно», как на реальной макетке. Впрочем, и в других симуляторах тоже ничего не заработало — видимо по той же причине, что и с генератором.

В пользу версии «симуляторы не умеют в конденсаторы» говорит и тот факт, что в разнообразных готовых схемах счетчиков, которые есть в SimulIDE и Falstad, я не находил ни одного с использованием конденсатора, как создают в курсе схемотехники. В основном виртуальные счетчики сделаны на JK-триггерах. Это универсальные триггеры, способные выполнять роль RS-, T- и D-триггеров. Их главная особенность в том, что при запрещенном состоянии они переходят в так называемый счетный режим, то есть начинают работать как T-триггеры.

Таблица истинности JK-триггера. Источник
Таблица истинности JK-триггера. Источник

Ниже — пример базового счетчика из библиотеки Falstad. Он умеет считать до 16 в десятичной системе — это максимальное значение для четырехразрядного числа в двоичной. Нужен еще разряд — просто добавьте еще JK-триггер.

В каждый момент времени на все четыре JK-триггера как раз и подается две единицы, «запрещенное состояние», что включает режим T-триггера и разделение импульса на две части, о котором я писал в начале раздела. Для наглядности внизу еще и осциллограммы бегут.

Разбор секундомера — лишь часть этого урока схемотехники. В нем также есть информация о схеме 555, заменяющей весь счетчик. Кроме того, Павел дает схеме «голос» с помощью динамика от старого телефона и демонстрирует другое готовое устройство — электронный игровой кубик. Такой же, кстати, был в начале манги «Занимательная электроника. Цифровые схемы»:

Еще один интересный подход к обучению базовой схемотехнике. Источник
Еще один интересный подход к обучению базовой схемотехнике. Источник

Секундомер на сдвиговом регистре

Последнее устройство, создаваемое в рамках курса, — секундомер на основе регистров с последовательной загрузкой триггеров. Здесь на помощь снова приходит библиотека Falstad. Все схемы в ней структурированы и нормально названы по-русски, в отличие от SimulIDE, библиотека которого напоминает свалку временных файлов.

Две «гребенки» в схеме — это кольцевые счетчики, цепочки триггеров, где по фронту синхронизации (инвертированный вход CE) сигнал переходит к следующему триггеру. R — это Reset, используемый для переключения между счетчиками.

А так выглядит счетчик на сдвиговых регистрах, собранный на уроке. Слева — микросхема CD4011BE (4 триггера 2ИЛИ-НЕ), конденсатор, рядом — четырехбитные сдвиговые регистры, передающие сигналы на светодиоды. Каждые десять секунд левый блок светодиодов сбрасывается, а в правом загорается красная лампочка. Полный цикл иллюминации занимает ровно минуту.

Только верхушка Харрисов

На этом курс схемотехники закончился, а я совсем разочаровался в своих эмуляторах. CRUMB сравнительно более реалистичный, но очень глючный. SimulIDE неудобен в управлении и в целом выглядит как небрежно сделанный продукт. В дальнейшем я буду использовать лишь Falstad, да и то лишь для простых набросков.

Сейчас у меня в планах другие проекты, и к схемотехнике в ближайшее время я вряд ли вернусь. Но когда вернусь, то подхвачу обучение с книг «Цифровая электроника для начинающих» Павла Кириченко и «Электроники шаг за шагом» Рудольфа Свореня (ее несложно найти целиком в PDF, так что здесь без ссылки).

Пройти со мной предыдущие уроки курса схемотехники «Истового инженера» можно в статьях:

Комментарии (0)