У современных программистов нет необходимости знать устройство компьютера на самом низком уровне, и все же без этого чувствуешь, что упустил что-то важное. Увы, в одной статье я не смогу рассказать о том, как работает даже самый примитивный процессор, поэтому мы начнем с изучения сумматора — ключевого элемента арифметико-логического устройства (АЛУ). Пробежавшись по теории, мы перейдем к практике: познакомимся с микросхемой 74HC283 и соберем на макетной плате небольшой тестовый стенд.
Говорят, древние программисты собирали свои компьютеры самостоятельно, уверенно обращались с паяльником и знали ассемблер. Но потом эти умения были безвозвратно погребены под слоями абстракции, и теперь каждый — специалист в узкой области, который редко заглядывает дальше ее. Если ты не работаешь с железом, то схемотехника тебе вряд ли пригодится сама по себе. Так зачем ее учить? Попробую показать на примере.
Знаешь, что изображено на этой картинке?
Так выглядит руль болида «Формулы-1». Нетрудно догадаться, что у пилота за таким штурвалом совершенно иной уровень подготовки. И речь не о скорости реакции или рефлексах: тут абсолютно другое, качественно более глубокое понимание принципов и особенностей работы машины.
Знания пилота «Формулы-1» — это и немного знаний конструктора, и инженера, и механика. Только так можно выжать из этого автомобиля максимум и нестись по трассе на огромной скорости под восхищенные крики болельщиц. Примерно то же и со схемотехникой: без нее ты просто скучный современный водитель, от которого скрыли устройство его машины.
Лично мне цифровая схемотехника дала многое. Я, например, узнал, что собой представляет конвейер в процессоре, почему его сброс дорого обходится для исполняемой программы и как выглядит компромисс времени и памяти на аппаратном уровне. Если мне удалось тебя убедить и ты тоже хочешь хоть немного овладеть этой наукой, то приступим!
Схемотехнику принято делить на две большие области: цифровую и аналоговую, по типу сигнала. Аналоговая оперирует такими параметрами, как сила тока, напряжение (иногда оно бывает отрицательным) и сопротивление. В цифровой все проще — в схеме есть только высокий и низкий логические уровни, даже без конкретных значений.
В С/С++ подобное отношение моделирует тип bool
и два его состояния — true
и false
. Я и дальше буду использовать аналогии из языков программирования, где это уместно. Надеюсь, это поможет тебе лучше понять происходящее. Кроме того, это ярко показывает, насколько тесно все связано в цифровом мире.
Аналоговая схемотехника капризна и непредсказуема — на параметры сигнала могут влиять не только хорошо известные факторы вроде температуры и внешних наводок, но и даже такие неочевидные вещи, как вовремя не отмытый с платы флюс или окислившиеся контакты (без шуток). Цифровая схемотехника, напротив, слабо зависит от окружающих условий и вообще устойчива к шумам.
Фирма Sony удачно обыграла аналоговую и цифровую природу сигнала в названии своих ноутбуков VAIO. Если внимательно присмотреться к их логотипу, то первые его две буквы повторяют аналоговую форму синусоиды, тогда как последние две представляют пару дискретных состояний цифрового бита.
Так что нет ничего удивительного в том, что сегодня большая часть информации существует именно в цифровом виде, а компьютеры оперируют исключительно числами (если точнее, то их двоичным представлением). Для базового понимания цифровой схемотехники не требуется особых знаний — достаточно только уметь переводить числа из десятичной формы в двоичную и обратно.
Типичная цифровая схема состоит из входов, выходов и логических элементов, также называемых вентилями. Сигналы поступают на входы схемы, преобразуются по определенным правилам внутри вентилей (об этом чуть ниже) и подаются на выходы.
В комбинационных схемах состояние сигналов на выходе зависит только от состояния на входе. В последовательностных схемах выход зависит не только от входа, но еще и от внутреннего состояния схемы. В любом случае важно понимать, что сигналы на выходе зависят от входа, не наоборот.
В этой статье мы будем рассматривать только комбинационные схемы. Они проще для понимания и наглядней. Кстати, в отечественной литературе нет устоявшегося перевода для последовательностных схем. Кто-то называет их последовательными, кто-то предпочитает кальку с английского языка и использует термин «секвенциальные схемы» (sequential). Разницы нет никакой, но все равно учти это, когда будешь читать дополнительные источники.
Все цифровые схемы сводятся к нескольким стандартным логическим элементам. Это примерно как кубики Lego в детском конструкторе. Их можно комбинировать, соединять друг с другом и получать новые схемы. Для каждого элемента я привел таблицу истинности — соответствие между входными и выходными сигналами.
Существуют еще диаграммы Венна, но, на мой взгляд, они совершенно лишние и только осложняют дело. Впрочем, если ты предпочитаешь графическое представление, то можешь ознакомиться и с ними.
Самый простой вентиль, представляет собой логическое отрицание и инвертирует сигнал на единственном входе. Так как у нас всего два возможных состояния, таблица истинности совсем крохотная. В С/C++ это оператор !
, хотя там его действие распространяется на любые переменные с числовым значением, не только бинарные.
Обрати внимание, что на рисунке выше (и на всех последующих) приведены два символа для обозначения конкретного элемента на схемах. Слева — американский вариант (ANSI), справа — его европейский аналог (МЭК и ГОСТ). Второй стандарт сейчас уже редко где применяется, и даже в русскоязычной литературе почти всегда используется графически более наглядный стандарт ANSI.
Сигнал на выходе этого вентиля равен логической единице только тогда, когда на всех входах присутствует высокий уровень. При этом количество входов может быть любым — таблица истинности изменится незначительно. Кроме того, ничто не мешает каскадировать такие элементы, подавая выход одного вентиля AND
на вход другого.
Традиционно таблица рисуется именно таким образом: сперва все входы находятся в состоянии логического ноля, а затем последовательно инвертируется один из разрядов, начиная с младшего. Можно смотреть на это и с другой стороны — как будто все входы кодируют какое-то число (в двоичном представлении) и в каждой строке мы прибавляем к нему по единичке, проходя все возможные значения.
В С/С++ существует аж два аналога для этого вентиля: булево И (оператор &) и логическое И (оператор &&). Первый применяется для проверки флагов и других операций над отдельными битами числа, тогда как второй используется в логических выражениях.
Здесь выход находится в состоянии логического ноля, только когда все входы равны нулю. Остальные комбинации приводят к высокому уровню на выходе.
Вместе AND
и OR
— это два основных строительных «кирпичика» цифровой логики. Сразу возникает вопрос, как их отличать друг от друга на схемах. Конечно, все решает практика, и со временем они запомнятся сами собой, но можно воспользоваться простым правилом: форма элемента со стороны входов соответствует первой букве в английском обозначении.
Так, округлость вентиля OR
напоминает очертания буквы O, а прямая линия элемента AND
явно позаимствована из буквы А. Звучит немного нелепо, но главное, что это работает.
Аналогично ситуации с AND
для вентиля OR
в языках программирования С/С++ используется булево ИЛИ (оператор |
) и логическое ИЛИ (оператор ||
).
Наконец, последний из базовых элементов в нашем списке — функция исключающего ИЛИ (XOR
). На первый взгляд его таблица истинности выглядит странной, но легко запоминается — высокий уровень на выходе, только когда входы отличаются друг от друга. Однако не все так просто.
В общем случае (больше двух входов) этот вентиль реализует самую неочевидную функцию из числа рассмотренных: если на входах нет логических единиц или если их количество четное, то на выходе ноль, в любом другом случае — единица.
В C/C++ это оператор ^
и с ним связана забавная возможность обменять значения двух числовых переменных без участия временной переменной для промежуточного хранения (свойство самообратимости). И все в одной строчке:
int x, y; ... x ^= y ^= x ^= y;
Но вернемся к нашим вентилям. Иногда в их список добавляют также сочетания с NOT
: NOT + AND = NAND
, NOT + OR = NOR
и NOT + XOR = XNOR
. При желании можешь вывести их таблицы истинности самостоятельно, это не составляет никакого труда.
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее
1 год7690 р. |
1 месяц720 р. |
Я уже участник «Xakep.ru»
Читайте также
Последние новости