Основы цифровой схемотехники

Основы схемотехники

У сегодняшних программистов нет необходимости знать устройство компьютера на самом низком уровне, и все же без этого чувствуешь, что упустил что-то важное. К сожалению, в одной статье я не смогу рассказать о том, как работает даже самый примитивный процессор, поэтому мы начнем с изучения сумматора — ключевого элемента арифметико-логического устройства (АЛУ). Немного поговорим по теории, потом перейдем к практике: познакомимся с микросхемой 74HC283 и попробуем собрать на макетной плате небольшой тестовый стенд.

Говорят, древние кодеры собирали свои компы самостоятельно, уверенно обращались с паяльником и знали ассемблер. Но потом эти умения были безвозвратно погребены под слоями абстракции, и теперь каждый — специалист в узкой области, который редко заглядывает дальше ее. Если вы не работаете с железом, то схемотехника вам вряд ли пригодится сама по себе. Так зачем ее учить? Попробую показать на примере.

Знаете, что изображено на этой картинке?

основы цифровой схемотехники руль болида «Формулы-1»

Так выглядит руль болида «Формулы-1». Нетрудно догадаться, что у пилота за таким штурвалом совершенно иной уровень подготовки. И речь не о скорости реакции или рефлексах: тут абсолютно другое, качественно более глубокое понимание принципов и особенностей работы машины.

Знания пилота «Формулы-1» — это и немного знаний конструктора, и инженера, и механика. Только так можно выжать из этого автомобиля максимум и нестись по трассе на огромной скорости под восхищенные крики болельщиц. Примерно то же и со схемотехникой: без нее ты просто скучный современный водитель, от которого скрыли устройство его машины.

РЕКОМЕНДУЕМ:
3D-сканер из смартфона или фотокамеры

Лично мне цифровая схемотехника дала многое. Я, например, узнал, что собой представляет конвейер в процессоре, почему его сброс дорого обходится для исполняемой программы и как выглядит компромисс времени и памяти на аппаратном уровне. Если мне удалось вас убедить и вы тоже хотите хоть немного овладеть этой наукой, то приступим!

Форма сигнала

Схемотехнику принято делить на две большие области: цифровую и аналоговую, по типу сигнала. Аналоговая оперирует такими параметрами, как сила тока, напряжение (иногда оно бывает отрицательным) и сопротивление. В цифровой все проще — в схеме есть только высокий и низкий логические уровни, даже без конкретных значений.

В С/С++ подобное отношение моделирует тип bool и два его состояния — true и false. Я и дальше буду использовать аналогии из языков программирования, где это уместно. Надеюсь, это поможет тебе лучше понять происходящее. Кроме того, это ярко показывает, насколько тесно все связано в цифровом мире.

Аналоговая схемотехника капризна и непредсказуема — на параметры сигнала могут влиять не только хорошо известные факторы вроде температуры и внешних наводок, но и даже такие неочевидные вещи, как вовремя не отмытый с платы флюс или окислившиеся контакты (без шуток). Цифровая схемотехника, напротив, слабо зависит от окружающих условий и вообще устойчива к шумам.

Фирма Sony удачно обыграла аналоговую и цифровую природу сигнала в названии своих ноутбуков VAIO. Если внимательно присмотреться к их логотипу, то первые его две буквы повторяют аналоговую форму синусоиды, тогда как последние две представляют пару дискретных состояний цифрового бита.

Так что нет ничего удивительного в том, что сегодня большая часть информации существует именно в цифровом виде, а компьютеры оперируют исключительно числами (если точнее, то их двоичным представлением). Для базового понимания цифровой схемотехники не требуется особых знаний — достаточно только уметь переводить числа из десятичной формы в двоичную и обратно.

Цифровая схема

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

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

РЕКОМЕНДУЕМ:
Как научиться электронике и схемотехнике

В этой статье мы будем рассматривать только комбинационные схемы. Они проще для понимания и наглядней. Кстати, в отечественной литературе нет устоявшегося перевода для последовательностных схем. Кто-то называет их последовательными, кто-то предпочитает кальку с английского языка и использует термин «секвенциальные схемы» (sequential). Разницы нет никакой, но все равно учти это, когда будешь читать дополнительные источники.

Базовые блоки

Все цифровые схемы сводятся к нескольким стандартным логическим элементам. Это примерно как кубики Lego в детском конструкторе. Их можно комбинировать, соединять друг с другом и получать новые схемы. Для каждого элемента я привел таблицу истинности — соответствие между входными и выходными сигналами.

Существуют еще диаграммы Венна, но, на мой взгляд, они совершенно лишние и только осложняют дело. Впрочем, если ты предпочитаешь графическое представление, то можешь ознакомиться и с ними.

NOT

основы цифровой схемотехники not

Самый простой вентиль, представляет собой логическое отрицание и инвертирует сигнал на единственном входе. Так как у нас всего два возможных состояния, таблица истинности совсем крохотная. В С/C++ это оператор !, хотя там его действие распространяется на любые переменные с числовым значением, не только бинарные.

Обрати внимание, что на рисунке выше (и на всех последующих) приведены два символа для обозначения конкретного элемента на схемах. Слева — американский вариант (ANSI), справа — его европейский аналог (МЭК и ГОСТ). Второй стандарт сейчас уже редко где применяется, и даже в русскоязычной литературе почти всегда используется графически более наглядный стандарт ANSI.

AND

основы цифровой схемотехники and

Сигнал на выходе этого вентиля равен логической единице только тогда, когда на всех входах присутствует высокий уровень. При этом количество входов может быть любым — таблица истинности изменится незначительно. Кроме того, ничто не мешает каскадировать такие элементы, подавая выход одного вентиля AND на вход другого.

Традиционно таблица рисуется именно таким образом: сперва все входы находятся в состоянии логического ноля, а затем последовательно инвертируется один из разрядов, начиная с младшего. Можно смотреть на это и с другой стороны — как будто все входы кодируют какое-то число (в двоичном представлении) и в каждой строке мы прибавляем к нему по единичке, проходя все возможные значения.

В С/С++ существует аж два аналога для этого вентиля: булево И (оператор &) и логическое И (оператор &&). Первый применяется для проверки флагов и других операций над отдельными битами числа, тогда как второй используется в логических выражениях.

OR

основы схемотехники or

Здесь выход находится в состоянии логического ноля, только когда все входы равны нулю. Остальные комбинации приводят к высокому уровню на выходе.

Вместе AND и OR — это два основных строительных «кирпичика» цифровой логики. Сразу возникает вопрос, как их отличать друг от друга на схемах. Конечно, все решает практика, и со временем они запомнятся сами собой, но можно воспользоваться простым правилом: форма элемента со стороны входов соответствует первой букве в английском обозначении.

Так, округлость вентиля OR напоминает очертания буквы O, а прямая линия элемента AND явно позаимствована из буквы А. Звучит немного нелепо, но главное, что это работает.

Аналогично ситуации с AND для вентиля OR в языках программирования С/С++ используется булево ИЛИ (оператор |) и логическое ИЛИ (оператор ||).

XOR

основы схемотехники xor

Наконец, последний из базовых элементов в нашем списке — функция исключающего ИЛИ ( XOR). На первый взгляд его таблица истинности выглядит странной, но легко запоминается — высокий уровень на выходе, только когда входы отличаются друг от друга. Однако не все так просто.

В общем случае (больше двух входов) этот вентиль реализует самую неочевидную функцию из числа рассмотренных: если на входах нет логических единиц или если их количество четное, то на выходе ноль, в любом другом случае — единица.

В C/C++ это оператор ^ и с ним связана забавная возможность обменять значения двух числовых переменных без участия временной переменной для промежуточного хранения (свойство самообратимости). И все в одной строчке:

Но вернемся к нашим вентилям. Иногда в их список добавляют также сочетания с NOT: NOT + AND = NAND, NOT + OR = NOR и NOT + XOR = XNOR. При желании можешь вывести их таблицы истинности самостоятельно, это не составляет никакого труда.

Пример

Настало время применить полученные знания и собрать что-то практически полезное. Логические операции — это, конечно, прекрасно, но хотелось бы и работать с числами, хотя бы для разнообразия!

Представим, что наши требования к безопасности таковы, что мы не можем доверять даже процессорам крупных компаний. Мы опасаемся возможных закладок, на уровне компании — разработчика схемы или на уровне компании — производителя кристалла, каких-либо гипотетических уязвимостей, которые могут эксплуатировать недоброжелатели, — словом, мы опасаемся всего и сразу. Значит, нужно собрать все самостоятельно, не доверяя никому!

РЕКОМЕНДУЕМ:
Перехват и анализ радиосигнала

Начинать стоит именно с процессора, а если еще конкретнее, то с сумматора в АЛУ. Это ключевой блок всего компьютера. Как если бы мы захотели приехать в Москву и очутились бы сразу на Красной площади.

Полусумматор

Конкретизируем задачу — пусть нам надо сложить два восьмибитных положительных значения друг с другом. Если использовать алгоритм сложения столбиком, то это будет выглядеть примерно так.

основы схемотехники полусумматор

Мы последовательно складываем цифры в каждом разряде, справа налево, и получаем результат для этого разряда. При этом мы распространяем дальше перенос, если у нас возникло переполнение. Таким образом, у нас в схеме должно быть два входа (A и B) и два выхода (S и C). Составим таблицу истинности для всех возможных комбинаций А и В.

основы схемотехники полусумматор

Рассматривая по отдельности получившиеся колонки S и C, легко заметить, каким логическим элементам они соответствуют. Теперь можно представить схему полностью.

схемотехника полусумматор

Сумматор

Предыдущий блок носил несколько обидное название «полусумматора». Почему только половинка — догадаться нетрудно, ведь здесь мы никак не учитываем выход с предыдущего разряда. Логично предположить, что, комбинируя два таких блока, мы можем составить схему полного сумматора. Это как с Землей — есть Северное и Южное полушария. Хотя стоп, есть же еще Западное и Восточное…

схемотехника сумматор
Вопрос, куда девали вторую Землю, остается открытым

Теперь, когда мы получили возможность полноценно складывать биты из одного разряда, мы можем последовательно вычислить полную сумму нашего числа, каким бы большим оно ни было. Да, вот так все просто!

Важная характеристика цифровой схемы — задержка распространения. Схема реагирует на изменение входных сигналов не мгновенно, а с некоторым запаздыванием. То есть приходится ждать какое-то время, в течение которого сигнал на выходе тоже может меняться. Чем больше элементов в схеме, тем хуже ее быстродействие. На примере с сумматором в такой наивной реализации сигнал переноса должен последовательно пройти через все биты числа, прежде чем сформируется итоговая сумма. К счастью, есть хитрые способы обойти такие ограничения, и один из них мы разберем ниже.

Практика

До этого момента в статье была сплошь теория. Сейчас я предлагаю закрепить ее практической частью и собрать восьмибитный сумматор. Нам потребуется пара беспаечных макетных плат, несколько DIP-переключателей, светодиоды для индикации, токоограничивающие резисторы на 10 кОм и пара микросхем 74HC283.

Серия 74xx включает в себя микросхемы самого разного назначения. Это могут быть как сборки логических вентилей (например, 74HC04 — шесть инверторов в одном корпусе), так и полноценные АЛУ (74HC181). Помимо комбинационных схем, там есть и последовательностные: триггеры (74НС74), регистры (74НС373) и счетчики (74НС393).

Чтобы ориентироваться во всем этом номенклатурном разнообразии, я рекомендую не скачивать документацию на каждую микросхему в отдельности, а сразу найти целый справочник по всей серии. Например, есть справочник Texas Instruments в PDF.

В СССР и России существуют аналогичные микросхемы серий К155 и КР1564, для замены 74хх и 74НСхх соответственно. Большинство из них совместимы по корпусам и контактам с зарубежными, но из-за своей редкости и высокой цены они остаются скорее занятной диковинкой. Для этой статьи я пытался достать парочку интегральных схем (ИС) белорусского «Интеграла» (ЭКР5564ИМ6), но в наличии их не оказалось, поэтому пришлось ограничиться более массовыми SN74HC283 все той же Texas Instruments.

Расположение выводов у микросхемы 74HC283 можно найти на странице 176 справочника, принципиальную схему и таблицы истинности смотри на страницах 390–391. И хотя это сумматор всего лишь на четыре бита, тут есть функция ускоренного переноса, а сами микросхемы можно объединять, собирая сумматоры на 8, 16 или даже 32 бит.

основы схемотехники

Хорошо видно, что схема здесь несколько отличается от той, что мы вывели ранее. В этом нет ничего необычного, одну и ту же функцию можно реализовать несколькими способами, и в производстве зачастую используют тот, который дешевле (по элементам) и лучше подходит для техпроцесса.

При этом все равно осталось некоторое сходство — его можно заметить при внимательном изучении. Например, элементы XOR от полусумматоров располагаются непосредственно перед выходом для значений каждого из разрядов.

Кроме того, можно понять, что значение для переноса вычисляется параллельно со значениями разрядов — для этого в микросхеме и присутствуют «лишние» элементы. Пожалуй, это самая сложная часть в статье. Поэтому, если у тебя возникли трудности, попробуй рассмотреть схему ускоренного переноса отдельно — это ИС 74HC182 на с. 338 (вот она, польза от полноценного справочника).

Сложение

Теперь, когда принцип работы микросхемы и назначение каждого ее вывода для нас не составляет секрета, можно собирать рабочий сумматор на восемь бит на макетных платах. Потребуется целый ворох проводов и перемычек, чтобы соединить все компоненты, так что главное здесь — быть внимательным и не допускать ошибок.

основы схемотехники сложение

Как правило, значения в АЛУ попадают из регистров — самого быстрого типа памяти в компьютере. Здесь же я для удобства использую пару DIP-переключателей (левый верхний угол), чтобы можно было легко задавать нужные значения. По сути, это регистры А и В нашего протокомпьютера.

К сожалению, производитель переключателей явно не рассчитывал на такое применение, поэтому нумерация битов в каждом регистре мало того что начинается с единицы, так еще и идет в «неправильном» порядке, слева направо! Учитывай это, когда будешь работать со схемой.

Пара 74НС283 располагается по центру на нижней макетке, а результат операции отображается на линии из светодиодов (правый верхний угол). В левом нижем углу роль источника питания выполняет преобразователь USB — UART (другого способа подать стабильные 5 В я в тот момент не нашел).

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

Вычитание

Удивительно, но такую схему без каких-либо изменений и доработок можно использовать и для вычитания. Да, раньше я не говорил об этом ни слова, но такое действительно возможно. Если использовать представление отрицательных чисел в дополнительном коде, нам никак не нужно переопределять операцию сложения — все будет работать на имеющемся железе.

основы схемотехники вычитание

Наверняка ты уже представляешь, как на уровне цифровой схемы из положительного числа можно сделать отрицательное (в дополнительном коде). Действительно, достаточно только к каждому биту применить операцию NOT, а затем подать на вход сумматора вместе с единицей. Как видишь, подобное представление неочевидно с точки зрения человека, но очень удобно для реализации из набора логических вентилей.

Заключение

Статья подошла к концу, но цифровая схемотехника на этом отнюдь не заканчивается. Скорее наоборот, только начинается! Мы рассмотрели лишь самые простые комбинационные схемы (за исключением, может быть, ускоренного переноса). За бортом оказались дешифраторы, мультиплексоры, буферы и все последовательностные схемы (они несколько сложнее для понимания).

Кроме того, можно было бы спуститься на уровень ниже и рассказать о том, как собирать логические вентили из дискретных элементов — транзисторов, диодов и резисторов. В разные времена для этого использовали разные технологии, в зависимости от развития промышленности — ТТЛ (транзисторно-транзисторная логика), КМОП (комплиментарный металл-оксид-полупроводник) и другие.

РЕКОМЕНДУЕМ:
Как сделать робота для сборки кубика Рубика

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

С другой стороны, важно понимать, что основные принципы работы компьютеров не сильно изменились с тех пор. За исключением разве что квантовых машин, но это совсем другая история. Интересно, сможем ли мы когда-нибудь собирать квантовые компьютеры так же просто, как сейчас на основе полупроводниковых микросхем?

Продолжение в статье «Логические элементы и биты памяти в компьютере».

Понравилась статья? Поделиться с друзьями:
Добавить комментарий