Код. Тайный язык информатики — страница 24 из 71

Не кажется ли вам это странным? Оба переключателя разомкнуты, как и на первом рисунке, однако теперь лампочка горит. Эта ситуация, безусловно, отличается от тех, что мы видели ранее. Обычно выход цепи зависит только от ее входов. Похоже, в данном случае это не так. Более того, на этом этапе вы можете замкнуть и разомкнуть верхний переключатель, и лампочка не погаснет. Этот переключатель больше не влияет на цепь, поскольку выход левого вентиля ИЛИ-НЕ остается равным 0.

Теперь замкните нижний переключатель. Поскольку один из входов правого вентиля ИЛИ-НЕ равен 1, выход становится равным 0, лампочка гаснет. При этом выход левого вентиля ИЛИ-НЕ — 1.

Если вы разомкнете нижний переключатель, лампочка останется выключенной.

Мы вернулись туда, откуда начали. Теперь вы можете замкнуть и разомкнуть нижний переключатель, не повлияв на лампочку. Подытожим:

при замыкании верхнего переключателя лампочка загорается и остается гореть при размыкании верхнего переключателя;

при замыкании нижнего переключателя лампочка гаснет и не загорается при размыкании нижнего переключателя.

Странность этой схемы заключается в том, что, когда оба переключателя разомкнуты, иногда лампочка горит, иногда — нет. Можно сказать, что эта схема имеет два устойчивых состояния, когда оба переключателя разомкнуты. Называется такая схема триггером, и его история началась в 1918 году с работы английского радиофизика Уильяма Генри Эклза (1875–1966) и Фрэнка Джордана (о котором мало что известно).

Триггер сохраняет информацию, «помнит». В частности, показанный ранее триггер помнит, какой переключатель был замкнут последним. Если вы столкнулись с таким триггером и видите, что лампочка горит, можете предположить, что последним был замкнут верхний переключатель; если лампочка не горит — нижний.

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

Возможно, это не является очевидным, однако триггеры весьма полезны. Они обеспечивают память схемы, сохраняющую историю того, что произошло ранее. Представьте, что значит считать, не обладая памятью. В этом случае вы не знаете, какое число задумали, какое число следует к нему прибавить! Точно так же схема, которая производит подсчет (описанная далее), требует наличия триггеров.

Существуют два различных типа триггеров. Тот, что я показал выше, является самым простым и называется RS-триггером (Reset/Set, сброс/установка). Два вентиля ИЛИ-НЕ чаще всего изображаются и обозначаются так, как показано на диаграмме, для придания им симметричного вида.

Выход, который мы использовали для лампочки, традиционно называется Q (от английского quit — «выход»). Кроме того, существует второй выход , который является электрически противоположным выходу Q, то есть инверсией Q. Если Q равен 0, то Q равен 1, и наоборот. Два входа, S и R, используются для установки (set) и сброса (reset). Вы можете думать об этих действиях так: «установить значение Q на 1» и «сбросить значение Q на 0». Когда S равно 1 (что соответствует замыканию верхнего переключателя на приведенной раннее диаграмме), выход Q становится равным 1, а выход — 0. Когда R равен 1 (что соответствует замыканию нижнего переключателя на приведенной ранее диаграмме), выход Q становится равным 0, а выход — 1. Когда оба входа равны 0, выход указывает на то, являлось ли последним действием установка или сброс значения Q. Результаты работы этой схемы приведены в следующей таблице.

Эта схема называется функциональной таблицей, или таблицей логики, или таблицей истинности. В ней показаны значения выходов, которые являются результатом определенных комбинаций входов. Поскольку у RS-триггера есть только два входа, существует всего четыре комбинации входов. Они соответствуют четырем строкам таблицы.

Обратите внимание на вторую строку снизу, когда значения входов S и R равны 0: выходы обозначены символами Q и , следовательно, значения выходов Q и остаются такими, какими они были до того, как значения обоих входов S и R стали равны 0. Последняя строка таблицы говорит о том, что ситуация, при которой значения входов S и R равны 1, запрещена. Это не означает, что вас могут за это арестовать, однако если в этой схеме оба входа будут 1, то оба выхода — 0, что нарушает условие, согласно которому выход Q противоположен выходу. Так что при создании схемы, в которой используется RS-триггер, избегайте ситуаций, когда входы S и R равны 1.

От себя добавлю: обычно таблицы истинности триггеров изображают с учетом предыдущего состояния Q(t − 1), соответственно, актуальное состояние на выходе триггера — Q(t). Таким образом, для RS-триггера можно составить следующую таблицу.

RS-триггер часто изображается в виде небольшого прямоугольника с двумя входами и двумя выходами, обозначенными, как показано ниже.

RS-триггер, безусловно, интересный пример схемы, которая, по всей видимости, «помнит», какой из двух входов последним был под напряжением. Тем не менее намного более полезным является то, что эта схема запоминает, был ли определенный сигнал равен 0 или 1 в конкретный момент времени.

Давайте подумаем, как должна работать такая схема, прежде чем приступить к ее конструированию. Она будет иметь два входа. Назовем один из них «Данные». Как и все цифровые сигналы, вход «Данные» может иметь значение 0 или 1. Второй вход назовем «Запомнить этот бит», что является цифровым эквивалентом призыва «Запомните эту мысль». Обычно значение сигнала «Запомнить этот бит» равно 0, в случае чего сигнал «Данные» не влияет на схему. Когда значение сигнала «Запомнить этот бит» равно 1, выход схемы совпадает со значением сигнала «Данные». Затем сигнал «Запомнить этот бит» может вернуться к значению 0, и в это время схема запоминает последнее значение сигнала «Данные». Любые дальнейшие изменения в сигнале «Данные» не влияют на схему.

Другими словами, нам нужна схема со следующей функциональной таблицей.

В первых двух случаях, когда сигнал «Запомнить этот бит» равен 1, выход Q имеет то же значение, что и вход «Данные». В остальных двух случаях, когда сигнал «Запомнить этот бит» равен 0, значение выхода Q остается прежним. Обратите внимание: в этих двух случаях, когда сигнал «Запомнить этот бит» равен 0, выход Q является тем же самым, независимо от значения входа «Данные». Эту функциональную таблицу можно упростить.

X означает «неважно». Значение входа «Данные» неважно, поскольку в случае, когда значение входа «Запомнить этот бит» равно 0, выход Q остается прежним.

Реализация сигнала «Запомнить этот бит» на основе существующего RS-триггера требует добавления на вход двух вентилей И.

Напомним, что выход вентиля И равен 1, только если оба входа равны 1. На этой диаграмме выход Q — 0, а выход — 1.

Пока сигнал «Запомнить этот бит» равен 0, сигнал S не влияет на значения выходов.

Не влияет и сигнал R.

Только в случае, когда сигнал «Запомнить этот бит» равен 1, эта схема будет работать так же, как показанный ранее обычный RS-триггер.

Схема ведет себя как обычный RS-триггер, поскольку теперь выход верхнего вентиля И совпадает с сигналом R, а выход нижнего вентиля И — с сигналом S.

Однако мы еще не достигли своей цели. Нам нужны только два входа, а не три. Как их уменьшить? Согласно исходной функциональной таблице RS-триггера, случай, когда сигналы S и R равны 1, запрещен, поэтому нужно его избежать. Кроме того, не имеет смысла и равенство этих сигналов 0, поскольку это просто говорит о неизменности выходного сигнала. В случае с этой схемой мы можем добиться того же результата, установив значение сигнала «Запомнить этот бит» равным 0.

Имеет смысл, чтобы при значении сигнала S, равном 1, сигнал R становился равным 0, а при значении сигнала S, равном 0, сигнал R был равен 1. Сигнал под названием «Данные» может быть эквивалентен сигналу S, а инвертированный сигнал «Данные» — соответствовать сигналу R.

В данном случае оба входа равны 0, и выход Q равен 0 (выход — 1). Пока сигнал «Запомнить этот бит» равен 0, вход «Данные» не влияет на схему.

Когда сигнал «Запомнить этот бит» — 1, выход схемы равен значению входа «Данные».

Сейчас значение выхода Q равно значению входа «Данные», а значение выходапротивоположно ему. Теперь сигнал «Запомнить этот бит» может вернуться к значению 0.

Схема запомнила значение сигнала «Данные» в момент, когда значение сигнала «Запомнить этот бит» последний раз было равно 1, независимо от изменения сигнала «Данные». Например, сигнал «Данные» мог бы вернуться к значению 0, не повлияв на выход.

Такая схема называется D-триггером со срабатыванием по уровню. Буква D означает «данные» (Data). Срабатывание по уровню указывает на то, что триггер сохраняет значение входа «Данные» в тот момент, когда сигнал на входе «Запомнить этот бит» достигает определенного уровня, в данном случае 1. (Далее мы рассмотрим альтернативу триггерам со срабатыванием по уровню.)

Обычно, когда такая схема фигурирует в специальной литературе, для входа используется обозначение не «Запомнить этот бит», а «Синхронизация» (Clock). Иногда этот сигнал может обладать свойствами метронома, который с определенной регулярностью колеблется между значениями 0 и 1. Однако в нашем случае вход «Синхронизация» просто определяет момент, когда необходимо сохранить входной сигнал «Данные».

Как правило, в функциональной таблице вход «Данные» (Data) обозначается буквой D, а вход «Синхронизация» (Clock) — буквами Clk.

Эта схема также называется защелкой D-типа со срабатыванием по уровню; термин означает, что схема «запирает» один бит данных и удерживает его для дальнейшего использования. Эту схему также можно рассматривать в качестве ячейки памяти емкостью один бит. В главе 16 я продемонстрирую способ соединения большого количества таких триггеров для обеспечения памяти большего объема.