Раз, два, три, четыре, пять, или считалочка на макетной плате
Вы уже знаете, как убедить семисегментный индикатор отображать десятичные цифры, а триггеры — хранить информацию о состоянии сигнала. Это почти все, что нужно, чтобы собрать ваше первое законченное устройство: полноценный секундомер на макетной плате. Остается разобраться с недостающим кусочком пазла, а именно с реализацией двоичных счетчиков.
- как реализовать двоичный счетчик с помощью триггеров
- что такое вычитывающий и реверсивный счетчики
- какие микросхемы понадобятся, чтобы собрать секундомер на макетной плате
Двоичный счетчик
В предыдущей части вы познакомились с T-триггером, который делит частоту поступающих на его вход импульсов надвое. А ведь ровно в два раза реже при последовательном счете меняют свое состояние любые соседние разряды двоичного числа. От этой мысли остается сделать всего один шаг до самой простой практической реализации двоичных счетчиков! Нужно соединить их друг за другом так, чтобы выход следующего поступал на вход предыдущего. Тогда первый триггер, на который поступает входная последовательность импульсов, будет отсчитывать младший значащий разряд двоичного числа, а последний — старший.
Как обычно, после того, как мы в деталях изучили построение базовых схем на отдельных вентилях, можно использовать микросхемы большей степени интеграции. Поэтому приведенный на рисунке ниже четырехразрядный счетчик сконструирован на базе двух микросхем CD4013BE, каждая из которых содержит по два готовых D-триггера с асинхронными входами сброса и установки. На рисунке дана нумерация выводов микросхем для удобства сборки.
Как вы видите, инверсный выход Qn каждого D-триггера подключен к его же входу D, образуя таким способом обычный T-триггер. Асинхронные входы сброса R и установки S всех триггеров собираются вместе и подключаются к логическому нулю, чтобы быть неактивными и не мешать работе счетчика. Асинхронные входы в триггерах так называются, потому что никак не зависят от сигнала синхронизации. Они воздействуют на состояние выходов непосредственно, игнорируя все, что происходит на входах C и D, как будто это самый примитивный RS-триггер на двух вентилях. Скоро вы узнаете, что это очень полезно в определенных ситуациях.
Подписи под триггерами означают, что мы имеем дело с цифровой микросхемой: буква D — это сокращение от Digital. Первая цифра — номер корпуса, а вторая после точки — номер триггера в корпусе. Конкретная нумерация корпусов и триггеров в них может назначаться нами произвольно и нужна только для того, чтобы нам самим было проще разобраться, что к чему подключено.
Временна́я диаграмма, приведенная на следующем рисунке, поясняет принцип работы двоичного счетчика на примере сигналов для первых двух разрядов. Чтобы разобрать работу счетчика, больше и не надо. Стрелки на диаграмме показывают, как фронт сигнала с предыдущего каскада управляет переключением следующего. Как вы видели в предыдущем материале в теории и в ролике, прямой и инверсный выходы переключаются одновременно по одному и тому же фронту. Но у нас стрелочки от фронтов проведены только к прямому сигналу, чтобы не загромождать рисунок.
Значения кодовой последовательности Q1, Q0 в двоичном представлении приведены в самом низу диаграммы. Изначальное состояние выходов для определенности принято «00». Первый фронт CLK приводит к переключению Q0 в высокий уровень. Парафазный выход Qn0 становится равным 0. Так как второй триггер срабатывает по фронту, то он игнорирует этот срез на своем входе C. В следующий период CLK выходы Q0 и Qn0 меняют свои значения на противоположные, то есть Qn0 переключается из 0 в 1. На входе синхронизации второго триггера возникает фронт, которые заставляет триггер изменить состояние своих выходов Q1 и Qn1. Вы можете продолжить анализ схемы самостоятельно подобным образом.
По диаграмме видно, что по мере поступления тактовых импульсов на выходах Q1, Q0 последовательно перебираются числа от 0 до 3 и далее по кругу в том же порядке. Это называется одновременно:
- циклическим счетом, потому что числа повторяются непрерывно по кругу,
- счетом по модулю 4, потому что перебираются 4 последовательных числа со сбросом в 0 при достижении максимального значения,
- счетом в прямом направлении, так как числа идут от меньшего к большему.
То есть, если формулировать полностью, был рассмотрен циклический счет по модулю 4 в прямом направлении. Асинхронными входами сброса и установки при желании можно задавать начальные значения счетчика. Нетрудно сообразить, что приведенная выше схема из четырех триггеров представляет собой циклический счетчик по модулю 16, считающий в прямом направлении.
Собрав на монтажной плате такое устройство вместе с генератором синхросигналов и светодиодами для индикации состояния выходов, вы сможете наблюдать последовательный перебор двоичных чисел в виде поочередно загорающихся светодиодов. Очень рекомендуем так и сделать, прежде чем двигаться дальше. Не забудьте перевести асинхронные входы сброса и установки в неактивное состояние, подключив их к минусу питания.
Вычитающий и реверсивный счетчики
А можно ли построить счетчик, который «отматывает» числа в обратном направлении: от большего к меньшему? Да, это будет вычитающий счетчик. Для его создания нужно всего лишь подавать сигналы на следующий каскад не с инверсного выхода предыдущего, а с прямого. Это показано на рисунке ниже. Переставив всего три провода на макетной плате, вы сможете наблюдать за работой такого счетчика.
А если мы добавим между каждой парой триггеров двухвходовой мультиплексор, на один из входов которого будем подавать сигнал с прямого выхода T-триггера, а на другой — с инверсного, то, меняя состояние адресного входа, сможем управлять направлением счета в прямом или обратном направлении. Так работают реверсивные счетчики! Такой вариант на макетной плате собирать не обязательно, но если вдруг для чего-то потребуется, вы знаете, как это сделать с помощью готовых микросхем типа CD4051BE, CD4052BE, и CD4053BE в зависимости от разрядности счетчика.
Важно сделать примечание насчет использования прямых и инверсных выходов для прямого и обратного счета.
Во всех рассмотренных схемах использовались триггеры CD4013BE, которые срабатывают по фронту сигнала. Если же вы будете где-нибудь применять триггеры, срабатывающие по срезу (а такие есть), то прямой счетчик поменяется местами с вычитающим!
Можете проверить, нарисовав временну́ю диаграмму для одного из упомянутых случаев. Этот важный момент нельзя забывать, даже опытные инженеры временами путаются. Но у них-то есть программы для моделирования схем, которые облегчают жизнь. Поэтому, когда вы встречаете в интернете схемы счетчиков на триггерах, будьте внимательны: там иногда бывают ошибки.
Счет до десяти
Мигание светодиодов двоичным кодом — это неплохо, но хотелось бы, чтобы счетчик выводил привычные нам десятичные цифры. Тем более, что во время изучения комбинационных схем у нас появилась схема семисегментного индикатора с драйвером. Как мы увидели, драйвер индикатора гасит все сегменты, если на его входы поступает двоичное число от 10 до 15, что вполне логично для одноразрядного индикатора. Значит, нам нужно поменять схему счетчика таким образом, чтобы его модуль счета был равен 10, а не 16.
Сделать это довольно просто, учитывая, что у нас есть асинхронные входы сброса и установки. Нужно чтобы при достижении счетчиком двоичного кода 1010, соответствующего десятичному числу 10, происходил сброс всех триггеров. То есть мы берем сигнал с выходов Q1 и Q3, и подаем их на логическое И. А выход этого вентиля подключаем к сигналу сброса.
Практическая реализация такой схемы дана ниже, не поленитесь собрать и проверить, как она работает на макетной плате. Вместе с генератором, если собрать его на микросхеме CD4011BE с четырьмя вентилями И-НЕ, получится неплохой циклический счетчик импульсов генератора по модулю 10. На плату понадобится добавить всего один корпус для создания генератора на вентилях DD3.1 и DD3.2, и схемы сброса на вентилях DD3.3 и DD3.4. То есть потребуются всего 3 микросхемы.
Важно отметить, что электролитический конденсатор во времязадающих цепях может вести себя довольно капризно, в одном из роликов мы покажем, в чем это выражается. Мы использовали такой конденсатор в наших схемах для начинающих только потому, что он большой и удобный: маркировку на его корпусе легко воспринимать. Но если вдруг ваш счетчик вдруг вместо нормального счета начинает сбоить, а схема собрана верно, то, скорее всего, дело именно в «электролите».
В таком случае можно заменить его на неполярный конденсатор другого типа (керамический подойдет) и меньшей емкости. При этом нужно будет пропорционально увеличить сопротивление резистора в схеме так, чтобы произведение R на C осталось неизменным. Резистор можно взять сопротивлением вплоть до нескольких МОм. Тогда для нашей времязадающей цепочки можно воспользоваться, например, конденсатором 470 нФ и резистором 1 МОм.
Полученную схему можно для завершенности объединить с собранной ранее схемой семисегментного индикатора с драйвером, из которой выкинуты ненужные теперь резисторы на входах драйвера. А вот между драйвером и самим индикатором резисторы нужны, их выкидывать нельзя! Выходы от Q0 до Q3 на схеме счетчика подключаются напрямую к одноименным входам схемы драйвера с индикатором.
Секундомер на двоичном счетчике
Вообще говоря, если подобрать с помощью переменного резистора частоту генератора равную 1 Гц, то у нас получится неплохой секундомер. Правда, считать он будет только до 10 секунд, что маловато. Надо бы довести счет до 60, и тогда секундомер будет похож на настоящий. Почему бы и не попробовать?
Нам потребуется собрать два семисегментных индикатора с драйверами для демонстрации единиц и десятков. С этим проблем у вас быть не должно. Считать секунды мы уже научились. Следующий шаг — научиться считать десятки. В каждой минуте их всего 6, поэтому нам понадобятся еще 2 корпуса CD4013BE, в которых для счета мы используем только три триггера из четырех. Сброс десятков надо организовать по достижению на выходах этого счетчика двоичного кода 110, который соответствует десятичному числу 6. Точно так же, с помощью вентиля И. Можно поставить для этого на плату микросхему CD4081BE, содержащую четыре таких двухвходовых вентиля.
Со сбросом разобрались. А откуда брать тактовый сигнал для счетчика десятков? Ведь если подключить и его к нашему генератору, то он будет считать те же секунды, что и ранее собранный счетчик по модулю 10. Тут на помощь приходит понимание, что любой код от 0 до 9 на выходе счетчика секунд будет появляться ровно один раз в 10 секунд. Нам нужно обновлять счетчик десятков именно в момент переключения единиц секунд из 9 в 0.
На первый взгляд, нужно бы взять сигнал сброса для единиц секунд и использовать его в качестве тактового сигнала для десятков. Но нет! Дело в том, что наш сигнал сброса (выход 4 вентиля DD3.3) не дает гарантий от ложных переключений. Ведь сигналы Q1 и Q3 счетчика секунд совсем не будут одновременными: каждый последующий триггер вносит определенную задержку в распространение сигналов по схеме от предыдущего.
Это явление носит название «гонки сигналов», и его приходится учитывать.
Может так получиться, что из-за разбежки во времени Q1 и Q3 возникнет так называемый «проскок» — неожиданный короткий импульс значения, противоположного ожидаемому, на несколько микросекунд. Мы этого и не заметим, а вот быстродействующие микросхемы — очень даже! В нашем случае при активном высоком уровне сигнала сброса может быть кратковременный ноль с последующим восстановлением в единицу.
С точки зрения работы сброса ничего плохого не случится. Ну, отключится он на какое-то время, а потом снова появится. А вот в качестве тактового импульса такой замусоренный сигнал не годится — у нас будут два фронта подряд, а не один. Из-за этого счетчик десятков «накрутит» сразу два значения вместо одного и будет показывать неправильную цифру. Итак, сброс мы бракуем в качестве тактового сигнала для десятков секунд. Как же тогда быть, неужели тупик?
И тут нам на помощь приходит полезное свойство D-триггеров пропускать сигнал дальше только по приходу фронта тактового импульса. Вспомните счетчик секунд: каждый последующий триггер получает сигнал на свой тактовый вход с выхода предыдущего. А значит, неизбежно будет накапливаться задержка, которая тем больше, чем больше триггеров в цепочке счета. Поэтому код 1001, соответствующий числу 9, появится гарантированно немного после того момента, как закончится фронт сигнала с генератора, вызвавшего переключение из 8 в 9. Если быть точным, то это будет сумма задержек каждого из четырех триггеров от входа C до выхода Q. И код 1001 сменится на 0000 тоже не мгновенно с приходом тактового импульса.
Мы добавим еще один элемент И. Он будет ждать единиц с Q3 и Q1, то есть числа 9, а не 10, чтобы выставить единицу на своем выходе, обозначенном reset10 на схеме ниже. А потом подадим полученный сигнал на вход данных D-триггера, управляемого сигналом C с генератора. Тогда этот триггер будет иметь высокий уровень на выходе, обозначенном на схеме C10, 1 раз в 10 секунд и только тогда, когда закончится 9 секунда и начнется 10-я. Ведь, как мы уже говорили, двухступенчатому триггеру все равно, когда придут данные к нему на вход, он пропустит их дальше только по синхросигналу.
Это все показано на схеме и диаграмме ниже для ясности. Причем добавлены задержки и стрелочки от сигналов, порождающих дальнейшие переключения, чтобы было совсем понятно, что вообще происходит. На самом верху диаграммы приведены десятичные значения счетчика единиц секунд в каждом такте.
Вот этот сигнал C10 и будет нашим синхроимпульсом для десятков. Немного сложно, но в ролике мы посмотрим это на макетной плате с осциллографом и убедимся, что все работает как надо!
Подключение второго индикатора для отображения десятков отличается от первого лишь тем, что разряд A3 на входе драйвера индикатора CD4511BE подключается не к выходу какого-то триггера, а к минусу питания, чтобы на нем всегда был логический ноль. Ведь второй индикатор будет показывать числа только от 0 до 6, по количеству секунд в минуте. А значит, старший бит на входе драйвера в этой схеме нам не потребуется никогда.
В итоге у нас появится первое законченное устройство, в котором были использованы все знания из этого и предыдущих материалов про резисторы, конденсаторы, МОП-транзисторы, светодиоды, вентили, преобразования логических функций, цифровые микросхемы, комбинационные, последовательностные схемы и генераторы. Неплохой багаж навыков, знаний и умений для начинающих! Можете себя поздравить, если добрались до этой точки повествования.