Немного смущает только эта самая операция нахождения дополнения до 2, точнее, в данном случае до 256 — как ее осуществить на практике, если схема всего имеет 8 разрядов? В дальнейшем мы увидим, что на практике это не нужно: при вычитании и в микроконтроллерах, и в обычных электронных счетчиках все осуществляется автоматически.
Впрочем, в микропроцессорах есть обычно и отдельная команда, которая возвращает дополнение до 2. В большинстве ассемблеров она называется neg, от слова «негативный», потому что просто-напросто меняет знак исходного числа, если мы договариваемся считать числа «со знаком». Разберем из любопытства, как ее можно было бы осуществить «вручную», не обращаясь в действительности к 9-му разряду. Для этого выпишем столбиком какое-нибудь число (далее для примера — 2 и 240), результаты операции нахождения его дополнения до 2, и результат еще одной манипуляции, которая представляет собой вычитание единицы из дополнения до 2, или, что то же самое, просто вычитания исходного числа из наивысшего числа диапазона (255):
Если мы сравним двоичные представления в верхней и нижней строках в каждом случае, то увидим, что они могут быть получены друг из друга путем инверсии каждого из битов. Эта операция называется нахождением обратного кода или дополнения до единицы (потому что число, из которого вычитается, содержит все 1 во всех разрядах; для десятичной системы аналогичная операция называется «дополнение до 9»). Для нахождения дополнения до 1 девятый разряд не требуется, да и схему можно построить так, чтобы никаких вычитаний не производить, а просто «переворачивать» биты. Так и делается, конечно, но не ищите в микроконтроллерах специальной операции инверсии битов — для этого вызывается именно команда нахождения дополнения до 1 (в AVR-ассемблере она обозначается, как сом, и определяется, как операция вычитания из FFh, а что уж там происходит на самом деле — тайна, покрытая мраком). Итак, для полного сведения вычитания к сложению надо проделать три операции:
1. Найти дополнение до 1 для вычитаемого (инвертировать его биты).
2. Прибавить к результату 1, чтобы найти дополнение до 2.
3. Сложить уменьшаемое и дополнение до 2 для вычитаемого.
Заметки на полях
Заметим, что все сложности с этими многочисленными дополнениями связаны с наличием нуля в ряду натуральных чисел — если бы его не было, дополнение было бы всего одно, и операция вычитания упростилась. Так может греки все же были в чем-то правы?
В заключение обратим внимание на еще одно замечательное свойство двоичных чисел, которое часто позволяет значительно облегчить операции умножения и деления: а именно умножению на 2 соответствует операция сдвига всех разрядов числа на один разряд влево, а операции деления на 2 — вправо. Крайние разряды (старший при умножении и младший при делении) в общем случае при этом должны теряться, но в микропроцессорах есть специальный регистр, в один из битов которого (бит переноса) эти «потерянные» разряды помещаются. Противоположные крайние разряды (младший при умножении и старший при делении) в общем случае замещаются нулями, но могут замещаться значением бита переноса, что позволяет без лишних проблем делить и умножать числа с разрядностью больше одного байта. Как можно догадаться, умножению и делению на более высокие степени двойки будет соответствовать операция сдвига в нужную сторону на иное (равное степени) число разрядов. Излишне говорить, что операцию сдвига разрядов в электронных схемах производить неизмеримо проще, чем операции деления и умножения. Тот же самый бит переноса используется для размещения переноса в старший разряд при сложении и займа при вычитании.
Глава 8Математическая электроника или игра в квадратики
Зеленые квадратики — это почтительность, а красные— ненависть. Чем больше красных квадратиков, тем больше люди вас боятся, крестьяне лучше работают, а у воинов снижаются боевые качества на 25 %.
fonun.ogl. ru
Разновидностей логических (или цифровых — будем считать, что это синонимы) микросхем, используемых на практике, не так уж и много, и подавляющее большинство из них относится к одной из двух разновидностей — ТТЛ (TTL, Транзисторно-Транзисторная Логика) и КМОП (CMOS, Комплементарные [транзисторы типа] Металл-Окисел-Полупроводник). Различие между ними чисто технологическое, и функционально одноименные элементы из этих серий делают одно и то же и на схемах обозначаются одинаково. С точки же зрения электрических параметров они различаются, хотя и не настолько, чтобы можно было бы заявить об их полной несовместимости.
Транзисторно-транзисторная логика возникла раньше, во второй половине 60-х годов, и стала наследницей диодно-транзисторной логики (ДТЛ) и резисторнотранзисторной логики (РТЛ). Основной родовой признак ТТЛ — использование биполярных транзисторов, причем исключительно структуры n-р-n. КМОП же, как следует из ее названия, основана на полевых транзисторах с изолированным затвором структуры МОП, причем комплементарных, то есть обоих полярностей — и с n- и с p-каналом. Есть и другие цифровые серии, отличающиеся по технологии от этих двух основных, но они либо реализованы исключительно в составе больших интегральных схем (БИС), таких, например, как микросхемы памяти, либо имеют достаточно узкий и специфический диапазон применения, поэтому мы рассматривать их не будем.
ТТЛ-микросхемы мы тоже упомянули исключительно ввиду их еще недавней практической важности, а на практике, за небольшими исключениями, вы будете иметь дело только с КМОП-микросхемами. Все современные микроконтроллеры и другие цифровые микросхемы либо полностью построены на КМОП-технологиях, либо имеют КМОП-совместимые выходы и входы. Базовые серии ТТЛ были существенно более быстродействующими, чем КМОП, но современные микросхемы малой степени интеграции из серий АС (Advanced, т. е. «продвинутая» CMOS) и НС (High-speed, т. е. «высокоскоростная» CMOS) ничуть не уступают по быстродействию микросхемам ТТЛ при сохранении почти всех преимуществ и приятных особенностей КМОП. Которые мы сейчас и разберем.
Схемотехника базовых логических элементов КМОП приведена на рис. 8.1. На Западе такие элементы еще называют вентилями — чем можно оправдать такое название, мы увидим далее. Они довольно близки к представлению о том, каким должен быть идеальный логический элемент.
Рис. 8.1.Схемы базовых элементов КМОП
Как можно видеть из рис. 8.1, КМОП-элементы практически симметричны, как по входу, так и по выходу. Открытый полевой транзистор на выходе (либо р-типа для логической 1, либо n-типа для логического 0) фактически представляет собой, как мы знаем из главы 3, просто резистор, величина которого для разных КМОП-элементов может составлять от 100 до 1000 Ом. Причем для дополнительной симметрии и повышения коэффициента усиления на выходе реальных элементов обычно ставят последовательно два инвертора, подобных показанному на рис. 8.1 справа (жалко, что ли транзисторов?). Не мешает даже то, что в нижнем плече для схемы «И-НЕ» стоят два транзистора последовательно (для схемы «ИЛИ-HE» они будут в верхнем плече, поскольку она полностью симметрична схеме «И-НЕ»). Обратите внимание, что выходной каскад инвертора построен не по схеме «пушпульного» каскада, т. е. это не истоковые повторители напряжения, а транзисторы в схеме с общим истоком, соединенные стоками, что позволяет получить дополнительный коэффициент усиления по напряжению.
На практике это приводит к следующим особенностям КМОП-микросхем:
• напряжение логической единицы практически равно напряжению питания, а напряжение логического нуля практически равно потенциалу «земли» (при ненагруженных выходах);
• порог переключения практически равен половине напряжения питания;
• входы в статическом режиме не потребляют тока, т. к. представляют собой изолированные затворы МОП-транзисторов;
• в статическом режиме весь элемент также не потребляет тока от источника питания.
Представляете: схема любой степени сложности, построенная с помощью КМОП-элементов, в «застывшем» состоянии или при малых рабочих частотах (не превышающих десятка-другого килогерц), практически не потребляет энергии! Отсюда ясно, как стали возможными такие фокусы, как наручные часы, которые способны идти от малюсенькой батарейки годами или sleep-режим микроконтроллеров, в котором они потребляют от 1 до 50 мкА (о нем см. главу 17). Другое следствие перечисленных особенностей— исключительная помехоустойчивость, достигающая половины напряжения питания.
Но это еще не все преимущества— КМОП-микросхемы базовой серии (о различных сериях см. далее), подобно многим операционным усилителям, могут работать в диапазоне напряжений питания от 3 до 15 В. Единственное, при снижении питания довольно резко (в разы) падает быстродействие.
Выходные транзисторы КМОП, как и любые другие полевые транзисторы, при перегрузке (например, в режиме короткого замыкания) работают, как источники тока: при напряжении питания 15 В этот ток для КМОП-элементов базовой серии составит около 30 мА, при 5 В — около 5 мА. Нагрузка при сохранении требований к логическим уровням (которые здесь обычно полагается иметь в пределах от 0 В до 0,1 Uпит — логический ноль, и от Uпит до 0,91Uпит — логическая единица) номинально ограничена величиной примерно 1 кОм (т. е. ток порядка 1 мА). Но для некоторых разновидностей (как для выходов микроконтроллеров AVR) допустимый ток значительно выше, и может достигать 20–40 мА. Причем это штатный долгосрочный режим работы таких элементов, единственное, что при этом надо проверить: не превышается ли предельно допустимое значение рассеиваемой мощности для корпуса (0,5–0,7 Вт). В противном случае, возможно, придется ограничить число выходов, одновременно подключенных к низкоомной нагрузке.