Содержание статьи
Говорят, древние программисты собирали свои компьютеры самостоятельно, уверенно обращались с паяльником и знали ассемблер. Но потом эти умения были безвозвратно погребены под слоями абстракции, и теперь каждый — специалист в узкой области, который редко заглядывает дальше ее. Если ты не работаешь с железом, то схемотехника тебе вряд ли пригодится сама по себе. Так зачем ее учить? Попробую показать на примере.
Знаешь, что изображено на этой картинке?
![](https://xakep.ru/wp-content/uploads/2019/07/229666/racing_wheel.jpg)
Так выглядит руль болида «Формулы-1». Нетрудно догадаться, что у пилота за таким штурвалом совершенно иной уровень подготовки. И речь не о скорости реакции или рефлексах: тут абсолютно другое, качественно более глубокое понимание принципов и особенностей работы машины.
Знания пилота «Формулы-1» — это и немного знаний конструктора, и инженера, и механика. Только так можно выжать из этого автомобиля максимум и нестись по трассе на огромной скорости под восхищенные крики болельщиц. Примерно то же и со схемотехникой: без нее ты просто скучный современный водитель, от которого скрыли устройство его машины.
Лично мне цифровая схемотехника дала многое. Я, например, узнал, что собой представляет конвейер в процессоре, почему его сброс дорого обходится для исполняемой программы и как выглядит компромисс времени и памяти на аппаратном уровне. Если мне удалось тебя убедить и ты тоже хочешь хоть немного овладеть этой наукой, то приступим!
Форма сигнала
Схемотехнику принято делить на две большие области: цифровую и аналоговую, по типу сигнала. Аналоговая оперирует такими параметрами, как сила тока, напряжение (иногда оно бывает отрицательным) и сопротивление. В цифровой все проще — в схеме есть только высокий и низкий логические уровни, даже без конкретных значений.
В С/С++ подобное отношение моделирует тип bool
и два его состояния — true
и false
. Я и дальше буду использовать аналогии из языков программирования, где это уместно. Надеюсь, это поможет тебе лучше понять происходящее. Кроме того, это ярко показывает, насколько тесно все связано в цифровом мире.
Аналоговая схемотехника капризна и непредсказуема — на параметры сигнала могут влиять не только хорошо известные факторы вроде температуры и внешних наводок, но и даже такие неочевидные вещи, как вовремя не отмытый с платы флюс или окислившиеся контакты (без шуток). Цифровая схемотехника, напротив, слабо зависит от окружающих условий и вообще устойчива к шумам.
![](/wp-content/themes/engine/img/info-icon.jpg)
INFO
Фирма Sony удачно обыграла аналоговую и цифровую природу сигнала в названии своих ноутбуков VAIO. Если внимательно присмотреться к их логотипу, то первые его две буквы повторяют аналоговую форму синусоиды, тогда как последние две представляют пару дискретных состояний цифрового бита.
Так что нет ничего удивительного в том, что сегодня большая часть информации существует именно в цифровом виде, а компьютеры оперируют исключительно числами (если точнее, то их двоичным представлением). Для базового понимания цифровой схемотехники не требуется особых знаний — достаточно только уметь переводить числа из десятичной формы в двоичную и обратно.
Схема на миллион
Типичная цифровая схема состоит из входов, выходов и логических элементов, также называемых вентилями. Сигналы поступают на входы схемы, преобразуются по определенным правилам внутри вентилей (об этом чуть ниже) и подаются на выходы.
В комбинационных схемах состояние сигналов на выходе зависит только от состояния на входе. В последовательностных схемах выход зависит не только от входа, но еще и от внутреннего состояния схемы. В любом случае важно понимать, что сигналы на выходе зависят от входа, не наоборот.
В этой статье мы будем рассматривать только комбинационные схемы. Они проще для понимания и наглядней. Кстати, в отечественной литературе нет устоявшегося перевода для последовательностных схем. Кто-то называет их последовательными, кто-то предпочитает кальку с английского языка и использует термин «секвенциальные схемы» (sequential). Разницы нет никакой, но все равно учти это, когда будешь читать дополнительные источники.
Базовые блоки
Все цифровые схемы сводятся к нескольким стандартным логическим элементам. Это примерно как кубики Lego в детском конструкторе. Их можно комбинировать, соединять друг с другом и получать новые схемы. Для каждого элемента я привел таблицу истинности — соответствие между входными и выходными сигналами.
Существуют еще диаграммы Венна, но, на мой взгляд, они совершенно лишние и только осложняют дело. Впрочем, если ты предпочитаешь графическое представление, то можешь ознакомиться и с ними.
NOT
![](https://xakep.ru/wp-content/uploads/2019/07/229666/NOT.jpg)
Самый простой вентиль, представляет собой логическое отрицание и инвертирует сигнал на единственном входе. Так как у нас всего два возможных состояния, таблица истинности совсем крохотная. В С/C++ это оператор !
, хотя там его действие распространяется на любые переменные с числовым значением, не только бинарные.
Обрати внимание, что на рисунке выше (и на всех последующих) приведены два символа для обозначения конкретного элемента на схемах. Слева — американский вариант (ANSI), справа — его европейский аналог (МЭК и ГОСТ). Второй стандарт сейчас уже редко где применяется, и даже в русскоязычной литературе почти всегда используется графически более наглядный стандарт ANSI.
AND
![](https://xakep.ru/wp-content/uploads/2019/07/229666/AND.jpg)
Сигнал на выходе этого вентиля равен логической единице только тогда, когда на всех входах присутствует высокий уровень. При этом количество входов может быть любым — таблица истинности изменится незначительно. Кроме того, ничто не мешает каскадировать такие элементы, подавая выход одного вентиля AND
на вход другого.
Традиционно таблица рисуется именно таким образом: сперва все входы находятся в состоянии логического ноля, а затем последовательно инвертируется один из разрядов, начиная с младшего. Можно смотреть на это и с другой стороны — как будто все входы кодируют какое-то число (в двоичном представлении) и в каждой строке мы прибавляем к нему по единичке, проходя все возможные значения.
В С/С++ существует аж два аналога для этого вентиля: булево И (оператор &) и логическое И (оператор &&). Первый применяется для проверки флагов и других операций над отдельными битами числа, тогда как второй используется в логических выражениях.
OR
![](https://xakep.ru/wp-content/uploads/2019/07/229666/OR.jpg)
Здесь выход находится в состоянии логического ноля, только когда все входы равны нулю. Остальные комбинации приводят к высокому уровню на выходе.
Вместе AND
и OR
— это два основных строительных «кирпичика» цифровой логики. Сразу возникает вопрос, как их отличать друг от друга на схемах. Конечно, все решает практика, и со временем они запомнятся сами собой, но можно воспользоваться простым правилом: форма элемента со стороны входов соответствует первой букве в английском обозначении.
Так, округлость вентиля OR
напоминает очертания буквы O, а прямая линия элемента AND
явно позаимствована из буквы А. Звучит немного нелепо, но главное, что это работает.
Аналогично ситуации с AND
для вентиля OR
в языках программирования С/С++ используется булево ИЛИ (оператор |
) и логическое ИЛИ (оператор ||
).
XOR
![](https://xakep.ru/wp-content/uploads/2019/07/229666/XOR.jpg)
Наконец, последний из базовых элементов в нашем списке — функция исключающего ИЛИ (XOR
). На первый взгляд его таблица истинности выглядит странной, но легко запоминается — высокий уровень на выходе, только когда входы отличаются друг от друга. Однако не все так просто.
В общем случае (больше двух входов) этот вентиль реализует самую неочевидную функцию из рассмотренных: если на входах нет логических единиц или если их количество четное, то на выходе ноль, в любом другом случае — единица.
В C/C++ это оператор ^
и с ним связана забавная возможность обменять значения двух числовых переменных без участия временной переменной для промежуточного хранения (свойство самообратимости). И все в одной строчке:
int x, y;
...
x ^= y ^= x ^= y;
Но вернемся к нашим вентилям. Иногда в их список добавляют также сочетания с NOT
: NOT + AND = NAND
, NOT + OR = NOR
и NOT + XOR = XNOR
. При желании можешь вывести их таблицы истинности самостоятельно, это не составляет никакого труда.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»