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

Часто в защелках полезно сохранять многобитное значение. Предположим, вы хотите использовать сумматор из главы 12 для сложения трех 8-битных чисел. Как обычно, вы вводите первое число с помощью первого набора переключателей, а второе — с помощью второго набора, затем потребуется записать результат на бумаге. После этого нужно будет ввести этот результат с помощью одного набора переключателей, а с помощью второго — ввести третье число. На самом деле вводить промежуточный результат нет необходимости. Вы можете использовать его, взяв непосредственно из первого расчета.

Давайте решим эту задачу, применяя защелки. Объединим восемь защелок, каждая из которых использует два вентиля ИЛИ-НЕ, два вентиля И и один инвертор, как было показано ранее. Все входы «Синхронизация» соединены между собой. Вот что у нас получилось.

Эта защелка способна одновременно хранить восемь бит информации. Восемь входов сверху обозначены от D0 до D7, а восемь выходов внизу — от Q0 до Q7. Слева расположен вход «Синхронизация» (Clk). Сигнал Clk обычно равен 0. Когда сигнал Clk — 1, то 8-битное значение на входах D передается на выходы Q. Когда сигнал Clk возвращается к 0, тогда 8-битное значение сохраняется там, пока сигнал Clk снова не станет равен 1.

Восьмибитную защелку также можно изобразить с восемью входами «Данные» и восемью выходами Q, сгруппированными вместе.

Вот схема 8-битного сумматора.

Обычно (если проигнорировать то, что мы делали с вычитанием в предыдущей главе), восемь входов A и восемь входов B подключены к переключателям, вход для переноса CI — к земле, а восемь выходов S и CO — к лампочкам.

В этой пересмотренной версии восемь выходов S 8-разрядного сумматора могут быть подключены как к лампочкам, так и ко входам D 8-битной защелки. Для сохранения результата работы сумматора можно подключить переключатель «Сохранить» ко входу Clk защелки.

Селектор двух линий на одну позволяет выбрать с помощью переключателя, откуда должны поступать данные на входы B: из второго ряда переключателей или из выходов Q защелки. Замыкание переключателя означает выбор выходов 8-битной защелки. В селекторе «2 на 1» используется восемь следующих схем.

Если вход «Выборка» (или Sel — сокращение от английского Select) равен 1, то значение сигнала на выходе вентиля ИЛИ равно значению сигнала на входе B. Это связано с тем, что выход верхнего вентиля И равен входу B, а выход нижнего вентиля И — 0. Если вход «Выборка» равен 0, выход будет совпадать со входом A. Эти правила представлены в следующей функциональной таблице.

Селектор, являющийся частью модифицированного сумматора, включает восемь таких однобитных селекторов. Все входы «Выборка» соединены между собой.

Этот модифицированный сумматор не вполне корректно обрабатывает сигнал CO (выход для переноса). Если при сложении двух чисел этот сигнал CO становится равным 1, то этот сигнал игнорируется при добавлении к сумме следующего числа. Одно из возможных решений заключается в том, чтобы создать сумматор, защелку и селектор, разрядность которых составляет 16 бит или, по крайней мере, превышает разрядность наибольшей суммы, которая может получиться. Мы не будем приступать к решению этой задачи вплоть до главы 17. Более интересный подход к созданию сумматора позволяет обойтись без ряда из восьми переключателей. Однако сначала нужно немного изменить триггер типа D, добавив вентиль ИЛИ и входной сигнал «Очистка» (Clear, или Clr). Вход Clr обычно равен 0. Когда он равен 1, выход Q — 0.

Сигнал Q становится равным 0 вне зависимости от других входных сигналов, что приводит к стиранию информации, сохраненной в триггере.

Вы можете спросить: зачем это нужно? Почему мы не можем очистить триггер, подав на вход «Данные» 0, а на вход Clk — 1? Может быть, мы не можем точно контролировать то, что подается на вход «Данные»? Возможно, у нас есть набор из восьми таких защелок, подключенных к выходам 8-битного сумматора, как показано ниже.

Обратите внимание: переключатель с меткой «Сложить» теперь управляет входом защелки Clk.

Может показаться, что этот сумматор использовать проще, чем предыдущий, особенно если требуется сложить множество чисел. Сначала вы нажимаете кнопку «Очистка». В результате выходы защелок становятся равными 0, все лампочки отключаются, а на второй набор входов 8-битного сумматора подаются значения 0. Вы вводите первое число и нажимаете кнопку «Сложить». Это число отображается в виде комбинации горящих лампочек. Затем вводите второе число и снова нажимаете кнопку «Сложить». Число, введенное с помощью переключателей, добавляется к предыдущей сумме, и результат снова отображается с помощью лампочек. Вы можете продолжать вводить новые числа и нажимать кнопку «Сложить». Я уже говорил, что сконструированный нами D-триггер срабатывает по уровню, то есть уровень сигнала на входе Clk должен измениться с 0 на 1, чтобы в защелке сохранилось значение на входе «Данные». Пока сигнал на входе Clk равен 1, значение входа «Данные» может меняться; любые изменения входа «Данные», пока сигнал Clk равен 1, будут отражаться в значениях выходов Q и .

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

В данном случае идея в том, что вход Clk управляет как первым, так и вторым блоком. Однако в первом блоке сигнал Clk инвертируется, или первый блок работает так же, как D-триггер, за исключением того, что входной сигнал «Данные» сохраняется, когда сигнал Clk равен 0. Выходы второго блока — входы первого, и их сигналы сохраняются, когда вход Clk равен 1. В итоге входной сигнал «Данные» сохраняется в момент изменения сигнала Clk с 0 на 1.

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

Теперь измените значение входного сигнала «Данные» на 1.

Это изменит состояние первого триггера, поскольку инвертированный входной сигнал Clk равен 1. Однако второй блок остается неизменным, так как неинвертированный входной сигнал Clk равен 0. Теперь измените входной сигнал Clk на 1.

Это приведет к изменению второго блока, при этом значение выхода Q поменяется на 1. Разница заключается в том, что входной сигнал «Данные» теперь может меняться (например, обратно на 0), не влияя на значение выхода Q.

Выходы Q и могут меняться только в тот момент, когда входной сигнал Clk изменяется с 0 на 1.

В функциональную таблицу D-триггера со срабатыванием по фронту требуется добавить новый символ — стрелку вверх (↑), которая обозначает изменение значения сигнала с 0 на 1.

Стрелка указывает на то, что значение выходного сигнала Q становится равным входному сигналу «Данные» в момент изменения значения сигнала Clk с 0 на 1. Этот процесс называется положительным переходом сигнала Clk (отрицательный переход с 1 к 0). Схема триггера выглядит следующим образом.

Маленькая угловая скобка указывает на то, что триггер срабатывает по фронту.

Теперь хочу показать вам схему, использующую D-триггер, срабатывающий по фронту, которую нельзя продублировать с помощью триггера, срабатывающего по уровню. Вспомните осциллятор, который мы создали в начале этой главы. Значение выходного сигнала этого осциллятора чередуется между 0 и 1.

Давайте подключим выход осциллятора ко входу Clk D-триггера, срабатывающего по фронту, а выход — ко входу D.

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

Чтобы понять, что происходит в этой схеме, давайте посмотрим на функциональную таблицу, иллюстрирующую различные изменения. Допустим, что вход Clk и выход Q равны 0. Значит, выход Q, подключенный к входу D, равен 1.

Когда значение входного сигнала Clk изменяется с 0 на 1, выходной сигнал Q становится равным входному сигналу D.

Поскольку выходной сигнализменяется на 0, входной сигнал D также поменяется на 0. Теперь входной сигнал Clk станет равен 1.

Входной сигнал Clk возвращается к 0, не влияя на значения выходных сигналов.

Теперь значение входного сигнала Clk снова изменяется на 1. Поскольку входной сигнал D равен 0, выходной сигнал Q становится равным 0, а выходной сигнал — 1.

Таким образом, входной сигнал D также становится равным 1.

То, что здесь происходит, можно описать очень просто: каждый раз, когда значение входного сигнала изменяется с 0 на 1, значение выходного сигнала Q меняется либо с 0 на 1, либо с 1 на 0. Ситуацию может прояснить следующий график.

Когда входной сигнал Clk изменяется с 0 на 1, значение на входе D (которое совпадает со значением на выходе Q) передается на выход Q, при этом также изменяется значение Q и D до следующего перехода значения входного сигнала Clk от 0 к 1.

Если частота осциллятора равна 20 герц (20 циклов в секунду), частота выхода Q в два раза меньше — 10 герц. По этой причине такая схема, в которой выход Q соединен со входом триггера «Данные», также называется