Как устроен сумматор в процессоре
Рассмотрим уравнения и структуры серийно выпускаемых ИС сумматоров. Функциональное обозначение полного одноразрядного двоичного сумматора типа ИМ1 (`80), реализуемого в отечественных сериях 133, К155, КМ155, представлена на рис. 1. Его отличительной чертой является развитая логика на входах разрядов a и b чисел А и В (рис. 2). Структура данной ИС реализуется по следующим уравнениям:
(1) |
(2) |
(3) |
(4) |
(5) |
При использовании данной ИС между входами a3 и b3 и источником питания +5 В нужно включить резистор R, сопротивление которого определяется требуемыми динамическими параметрами (типичные значения 1–5,1 кОм). В дальнейшем на схемах, построенных на этой ИС, резистор опущен.
Реализация прямой суммы и инверсных суммы и переноса в данной ИС обусловлена двумя обстоятельствами: во-первых, задержки распространения логического элемента И-ИЛИ-НЕ меньше, чем у элемента И-ИЛИ, так как последний фактически реализуется по структуре И-ИЛИ-НЕ-НЕ, что позволяет строить параллельные многоразрядные сумматоры с последовательным переносом с относительно небольшими задержками распространения в цепи выходного переноса; во-вторых, используется свойство самодвойственности функций S и P [1].
Наличие входов a1, a2 и b1, b2 позволяет маскировать нулём один разряд, любую группу разрядов или все разряды чисел А и В. Наличие входов a3 и b3 позволяет подключить к ним дополнительную логику, реализованную на элементах, выходы которых выполнены с открытым коллектором. Наличие входов a4 и b4 даёт возможность преобразовывать прямые коды многоразрядных чисел А и В в обратный или дополнительный коды, а также строить схемы не только сумматоров, но и вычитателей.
Рис. 3
В качестве примера на рис. 3 показана схема, поясняющая принцип действия 4-разрядного параллельного сумматора с последовательным переносом, в котором использованы ИС типа ИМ1 (133, 155). Разряд a0 числа А подан на объединённые входы a1 и a2, хотя в общем случае на вход a2 можно подать уровень “1” либо использовать его для маскирования. То же можно сказать о разряде b0 числа В. На входы a4 и b4 ИС младшего разряда необходимо подать уровень “1” (выражения (4) и (5)). Младший разряд суммы снимается с выхода S0 сумматора. Несмотря на то, что перенос из младшего разряда поступает с инверсией, мы подаём его непосредственно на вход переноса следующего разряда.
Учитывая свойство самодвойственности, вторые разряды слагаемых a1 и b1 чисел А и В соответственно подадим на входы a4 и b4 ИС, причём на один или оба входа a1, a2 и b1, b2 необходимо подать уровень “0” (выражения (4) и (5)). Так как все три входа этой ИС имеют инверсные переменные, то на выходе реализуется инверсия суммы, однако, если снимать её с выхода S одноразрядного сумматора, то получим прямое значение разряда S1 суммы. Кроме этого, получится инверсия выходного переноса, но поскольку он снимается с инверсного переноса, то фактически реализуется прямой выходной перенос. Дальнейшие связи остальных разрядов осуществляются аналогично.
Функциональное обозначение двухразрядного двоичного сумматора типа ИМ2 ( `82), реализуемого в отечественных сериях 133, К155, КМ155, представлена на рис. 4.
Рис. 4
Структура данной ИС реализуется по следующим уравнениям:
(пользователю не доступен) | (6) |
(структура И-ИЛИ-НЕ-НЕ) | (7) |
(8) | |
(9) |
Выражения (8) и (9) записаны на основании свойства самодвойственности. Инверсия входных разрядов a1 и b1 осуществляется дополнительно встроенными в ИС инверторами.
Как видно из выражений (6)–(9), логическая структура этой ИС соответствует двум младшим разрядам схемы (рис. 3), в которых отсутствует входная логика, реализующая выражения (4) и (5).
Быстродействие многоразрядных (n > 4) сумматоров с последовательным переносом, которые можно построить на рассмотренных выше ИС, ограничено задержкой его распространения, так как формирование сигнала переноса на выходе старшего разряда не может произойти до тех пор, пока сигнал переноса младшего разряда не распространится последовательно через все разряды сумматора.
Параллельный перенос в i-ом разряде многоразрядного сумматора определяется как функция разрядов слагаемых i-го и всех предыдущих младших разрядов и входного переноса. Для реализации этого принципа в каждом двоичном разряде сумматора специально формируются два дополнительных сигнала: функция генерации переноса в данном i-ом разряде Di и функция распространения переноса через данный i-ый разряд Fi. Представим перенос из i-го разряда в виде:
Схема на миллион
Типичная цифровая схема состоит из входов, выходов и логических элементов, также называемых вентилями. Сигналы поступают на входы схемы, преобразуются по определенным правилам внутри вентилей (об этом чуть ниже) и подаются на выходы.
В комбинационных схемах состояние сигналов на выходе зависит только от состояния на входе. В последовательностных схемах выход зависит не только от входа, но еще и от внутреннего состояния схемы. В любом случае важно понимать, что сигналы на выходе зависят от входа, не наоборот.
В этой статье мы будем рассматривать только комбинационные схемы. Они проще для понимания и наглядней. Кстати, в отечественной литературе нет устоявшегося перевода для последовательностных схем. Кто-то называет их последовательными, кто-то предпочитает кальку с английского языка и использует термин «секвенциальные схемы» (sequential). Разницы нет никакой, но все равно учти это, когда будешь читать дополнительные источники.
P0 = D0 + F0pвх ,
где P0 — выходной перенос из разряда с индексом i = 0; pвх — входной перенос в разряд с индексом i = 0.
Всем привет! Продолжаю серию постов про мой компьютер на логических микросхемах. Единственный модуль процессора, оставшийся до сих пор без внимания, – это АЛУ , про него и пойдет сегодня речь.
Первая версия
Когда я начал делать процессор, я хотел не тратить сильно много времени на АЛУ и скорее получить рабочий вариант, поэтому я сделал первую версию с помощью таблиц в ПЗУ. Простейший вариант мог бы быть таким:
Все входные сигналы подаются на вход ПЗУ, а с выхода снимаются выходные. Нужно всего лишь 2 22 = 4М слов по 12 бит. Такой микросхемы у меня не было, поэтому надо было что-то придумывать, и я придумал вот что:
Тут используется две микросхемы по 32к слов каждая. Левая отвечает за младшие 4 бита, а правая за старшие. Зеленая и красная линии передают информацию вверх или вниз. Передача вверх (зеленая линия) нужна, например, при сложении, чтобы передать перенос с бита 3 на бит 4, а вниз (красная), соответственно, при вычитании. Чтобы не возникало осцилляций (левая микросхема передала правой, правая левой и так по кругу), эти линии пущены через логическое И со старшим битом операции. Таким образом, операции, передающие информацию "вверх" (сложение, сдвиг влево), могут быть закодированы только кодами от 0 до 7, а передающие "вниз" (вычитание, сдвиг вправо) – от 8 до 15.
Первая версия АЛУ
Вторая версия
Использовать ПЗУ – это читерство, поэтому надо было делать вторую версию полностью на логических микросхемах. Общая схема АЛУ такая:
Операнды A и B подаются на мультиплексор, который меняет их местами, если на входе Inv единица. В зависимости от кода операции один из блоков OP1-OPn активируется и подает значение на выходную шину, а остальные держат свои выходы в состоянии высокого сопротивления. В качестве выходного буфера каждого блока используется микросхема 74ACT244.
Требования
АЛУ принимает на вход следующие сигналы:
A, B – операнды, каждый по 8 бит.
OP – код операции, 4 бита.
Cin – старый сохраненный флаг переноса, 1 бит.
Inv – флаг перемены операндов местами, 1 бит.
OE – активация выходного буфера.
R – результат, 8 бит.
Z – флаг нуля, 1 бит.
C – флаг переноса, 1 бит.
S – флаг знака, 1 бит.
O – флаг переполнения, 1 бит.
Никаких тактовых сигналов нет, то есть, АЛУ асинхронно: значения на выходе обновляются сразу, как только изменятся сигналы на входах.
Реализация простых операций
Самая простая операция – EXP . Нужно всего лишь подать Cin на все входы соответствующего выходного буфера.
Сдвиги ( SHR , SAR , SHL ) тоже простые: на входы буферов подаются линии операнда со смешением на один бит в ту или другую сторону.
Для логической инверсии NOT можно использовать микросхему 74ACT240, которая аналогична 74ACT244, но имеет инвертирующие выходы.
Побитовые логические операции могут быть выполнены на паре микросхем 74AC08 для AND и 74AC32 для OR (плюс буфер 74ACT244, конечно же).
Базовые блоки
Все цифровые схемы сводятся к нескольким стандартным логическим элементам. Это примерно как кубики Lego в детском конструкторе. Их можно комбинировать, соединять друг с другом и получать новые схемы. Для каждого элемента я привел таблицу истинности — соответствие между входными и выходными сигналами.
Существуют еще диаграммы Венна, но, на мой взгляд, они совершенно лишние и только осложняют дело. Впрочем, если ты предпочитаешь графическое представление, то можешь ознакомиться и с ними.
Самый простой вентиль, представляет собой логическое отрицание и инвертирует сигнал на единственном входе. Так как у нас всего два возможных состояния, таблица истинности совсем крохотная. В С/C++ это оператор ! , хотя там его действие распространяется на любые переменные с числовым значением, не только бинарные.
Обрати внимание, что на рисунке выше (и на всех последующих) приведены два символа для обозначения конкретного элемента на схемах. Слева — американский вариант (ANSI), справа — его европейский аналог (МЭК и ГОСТ). Второй стандарт сейчас уже редко где применяется, и даже в русскоязычной литературе почти всегда используется графически более наглядный стандарт ANSI.
Сигнал на выходе этого вентиля равен логической единице только тогда, когда на всех входах присутствует высокий уровень. При этом количество входов может быть любым — таблица истинности изменится незначительно. Кроме того, ничто не мешает каскадировать такие элементы, подавая выход одного вентиля AND на вход другого.
Традиционно таблица рисуется именно таким образом: сперва все входы находятся в состоянии логического ноля, а затем последовательно инвертируется один из разрядов, начиная с младшего. Можно смотреть на это и с другой стороны — как будто все входы кодируют какое-то число (в двоичном представлении) и в каждой строке мы прибавляем к нему по единичке, проходя все возможные значения.
В С/С++ существует аж два аналога для этого вентиля: булево И (оператор &) и логическое И (оператор &&). Первый применяется для проверки флагов и других операций над отдельными битами числа, тогда как второй используется в логических выражениях.
Здесь выход находится в состоянии логического ноля, только когда все входы равны нулю. Остальные комбинации приводят к высокому уровню на выходе.
Вместе AND и OR — это два основных строительных «кирпичика» цифровой логики. Сразу возникает вопрос, как их отличать друг от друга на схемах. Конечно, все решает практика, и со временем они запомнятся сами собой, но можно воспользоваться простым правилом: форма элемента со стороны входов соответствует первой букве в английском обозначении.
Так, округлость вентиля OR напоминает очертания буквы O, а прямая линия элемента AND явно позаимствована из буквы А. Звучит немного нелепо, но главное, что это работает.
Аналогично ситуации с AND для вентиля OR в языках программирования С/С++ используется булево ИЛИ (оператор | ) и логическое ИЛИ (оператор || ).
Наконец, последний из базовых элементов в нашем списке — функция исключающего ИЛИ ( XOR ). На первый взгляд его таблица истинности выглядит странной, но легко запоминается — высокий уровень на выходе, только когда входы отличаются друг от друга. Однако не все так просто.
В общем случае (больше двух входов) этот вентиль реализует самую неочевидную функцию из рассмотренных: если на входах нет логических единиц или если их количество четное, то на выходе ноль, в любом другом случае — единица.
В C/C++ это оператор ^ и с ним связана забавная возможность обменять значения двух числовых переменных без участия временной переменной для промежуточного хранения (свойство самообратимости). И все в одной строчке:
Но вернемся к нашим вентилям. Иногда в их список добавляют также сочетания с NOT : NOT + AND = NAND , NOT + OR = NOR и NOT + XOR = XNOR . При желании можешь вывести их таблицы истинности самостоятельно, это не составляет никакого труда.
Сумматор
Осталось девять операций. Восемь из них могут быть выражены при помощи сложения или вычитания:
И все другие логические устройства.
Интересует когда именно происходит вычисления.
Допустим приходит 2 сигнала, но они же 100% не одновременно же придут?
То есть допустим на входах были до 1 и 1 сигналы, и приходят сигналы 0 0, но сначала же придет первый 0, и он там пойдет дальше по цепи 0 + 1 , а потом(через 0.0000000001 секунды) придет второй 0-0й и произойдет вычисление 0+0. То есть первое лишние вычисление.
Я уже отвечал недавно на вопрос, как работает сумматор, и вопрос этот был ваш. Видимо, вы не поняли мой ответ, хотя мне казалось, он сформулирован достаточно просто. Ну что ж, придётся разжёвывать.
Прежде всего, сам по себе сумматор - комбинационная цифровая схема, и как таковой, он в тактовых импульсах не нуждается. Подали на его входы два операнда, и спустя время задержки на выходе появляется сумма. Но разжуём уже до мельчайших косточек - возьмём идеальный сумматор, составленный из идеальных логических элементов, не имеющих задержек распространения сигнала. Исходное состояние - на входах нули. На выходе, естественно, тоже нуль. Подаём первый операнд. Задержек нет, поэтому на выходе тут же появляется этот же операнд (он суммировался с нулём на другом входе). Затем подаём второй операнд - на выходе тут же (т.е. опять-таки без задержек) появляется сумма. Надеюсь, тут всё понятно (собственно, это мой ответ на эти ваши 0.0000000001 секунды - да хоть 0.00000000000000000000000000000001 сек, в идеальном сумматоре это без разницы).
Теперь рассмотрим сумматор из реальных логических элементов, имеющих задержку распространения. В нём всё точно так же, вот только на время суммарной задержки его составных частей на выходе будет неизвестно что. Вот так, буквально - подали первый операнд, на выходе неизвестно что (какая-то каша, которой нельзя доверять), и спустя время задержки каша успокаивается, и мы обнаруживаем на выходе этот самый первый операнд, который суммирован с нулём. Подали второй операнд - то же самое: сумму видим на выходе, когда период задержек закончился.
Именно по этой причине реальный сумматор в реальном процессоре снабжается входными и выходным регистрами - они позволяют отсеять те его состояния, которым нельзя доверять. Записали в первый регистр первый операнд по тактовому импульсу 1, затем второй по импульсу 2 (впрочем, можно и одновременно), и только потом по тактовому импульсу 3 записываем сумму в выходной регистр и пускаем дальше туда, где она понадобилась. Время между тактами должно быть заведомо больше, чем общие задержки в сумматоре - только при этом условии мы можем быть уверены в точности его работы. Попытки уменьшить тактовое время (мол, вот я счас сделаю мой проц более быстрым) неизбежно приведут к сбоям, т.е. к ошибкам в вычислениях.
Теперь понятно? Если всё ещё нет, задавайте вопросы, только не в виде программного кода - на этом уровне рассмотрения он не нужен.
И ещё: вы сделали два одинаковых вопроса - так тут не делается. Настоятельно советую удалить второй, который сейчас заблокирован.
У современных программистов нет необходимости знать устройство компьютера на самом низком уровне, и все же без этого чувствуешь, что упустил что-то важное. Увы, в одной статье я не смогу рассказать о том, как работает даже самый примитивный процессор, поэтому мы начнем с изучения сумматора — ключевого элемента арифметико-логического устройства (АЛУ). Пробежавшись по теории, мы перейдем к практике: познакомимся с микросхемой 74HC283 и соберем на макетной плате небольшой тестовый стенд.
Говорят, древние программисты собирали свои компьютеры самостоятельно, уверенно обращались с паяльником и знали ассемблер. Но потом эти умения были безвозвратно погребены под слоями абстракции, и теперь каждый — специалист в узкой области, который редко заглядывает дальше ее. Если ты не работаешь с железом, то схемотехника тебе вряд ли пригодится сама по себе. Так зачем ее учить? Попробую показать на примере.
Знаешь, что изображено на этой картинке?
Так выглядит руль болида «Формулы-1». Нетрудно догадаться, что у пилота за таким штурвалом совершенно иной уровень подготовки. И речь не о скорости реакции или рефлексах: тут абсолютно другое, качественно более глубокое понимание принципов и особенностей работы машины.
Знания пилота «Формулы-1» — это и немного знаний конструктора, и инженера, и механика. Только так можно выжать из этого автомобиля максимум и нестись по трассе на огромной скорости под восхищенные крики болельщиц. Примерно то же и со схемотехникой: без нее ты просто скучный современный водитель, от которого скрыли устройство его машины.
Лично мне цифровая схемотехника дала многое. Я, например, узнал, что собой представляет конвейер в процессоре, почему его сброс дорого обходится для исполняемой программы и как выглядит компромисс времени и памяти на аппаратном уровне. Если мне удалось тебя убедить и ты тоже хочешь хоть немного овладеть этой наукой, то приступим!
Операции
Четыре бита кода операции дают 16 операций, куда влезает весь "джентельменский набор" арифметики и остается место еще для одной странной операции:
ADC , ADD – сложение (с переносом и без);
SBB , SUB – вычитание (с переносом и без);
INC , DEC – инкремент и декремент;
NEG – смена знака;
NOT – инверсия бит;
SHL , SHR , SAR – сдвиги на один бит;
AND , OR , XOR – побитовые логические операции;
EXP – сохраненный флаг переноса распространяется на все биты результата.
Форма сигнала
Схемотехнику принято делить на две большие области: цифровую и аналоговую, по типу сигнала. Аналоговая оперирует такими параметрами, как сила тока, напряжение (иногда оно бывает отрицательным) и сопротивление. В цифровой все проще — в схеме есть только высокий и низкий логические уровни, даже без конкретных значений.
В С/С++ подобное отношение моделирует тип bool и два его состояния — true и false . Я и дальше буду использовать аналогии из языков программирования, где это уместно. Надеюсь, это поможет тебе лучше понять происходящее. Кроме того, это ярко показывает, насколько тесно все связано в цифровом мире.
Аналоговая схемотехника капризна и непредсказуема — на параметры сигнала могут влиять не только хорошо известные факторы вроде температуры и внешних наводок, но и даже такие неочевидные вещи, как вовремя не отмытый с платы флюс или окислившиеся контакты (без шуток). Цифровая схемотехника, напротив, слабо зависит от окружающих условий и вообще устойчива к шумам.
Фирма Sony удачно обыграла аналоговую и цифровую природу сигнала в названии своих ноутбуков VAIO. Если внимательно присмотреться к их логотипу, то первые его две буквы повторяют аналоговую форму синусоиды, тогда как последние две представляют пару дискретных состояний цифрового бита.
Так что нет ничего удивительного в том, что сегодня большая часть информации существует именно в цифровом виде, а компьютеры оперируют исключительно числами (если точнее, то их двоичным представлением). Для базового понимания цифровой схемотехники не требуется особых знаний — достаточно только уметь переводить числа из десятичной формы в двоичную и обратно.
Продолжение доступно только участникам
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Сумматорами называют логические устройства, выполняющие арифметические суммирование кодов двоичного числа. Символическое изображение одноразрядного двоичного сумматора показано на рис.10.29. Сумматор имеет три входа, где - слагаемые одинакового разряда, – слагаемое переноса; на выходе формируется – сумма cлагаемых и – слагаемое переноса в старший разряд.
Функционирование однозарядного сумматора показано в таблице, приведённой на рис.10.30. В этом случае при сложении слагаемых используется перевод десятичных чисел в двоичные числа.
Pиc.10.29. Символическое изображение одноразрядного двоичного сумматора
Рассмотрим пример:
При сложении слагаемых или 0+1+0 получается десятичное число 1. Такому числу соответствует двоичное число 01, при этом Аналогично, 1+1+0 = 2, которому соответствует двоичное число 10, при этом . При сложении чисел 1+1+1 = 3, которому соответствует двоичное число 11, при этом и так далее.
Сумматоры могут быть последовательного и параллельного действия. В сумматорах последовательного действия коды двоичных чисел вводятся в последовательной форме слагаемое за слагаемым, начиная с младшего разряда.
На рис.10.31 изображена схема сумматора последовательного действия, предназначенного для суммирования четырёхразрядных двоичных чисел. Сумматор построен на трёх регистрах сдвига, D-триггере и на одноразрядном сумматоре.
Рис.10.30. Таблица функционирования одноразрядного сумматора
Рис.10.31. Схема сумматора последовательного действия
Функционирование сумматора приведено в таблице рис.10.32, где слагаемое pi для первого разряда всегда равно нулю.
Рис.10.32. Таблица функционирования сумматора
Для ускорения операции сложения используются сумматоры параллельного действия, которые состоят из нескольких однозарядных сумматоров. В таких сумматорах слагаемые поступают одновременно на соответствующие входы однозарядных сумматоров, при этом каждый из однозарядных сумматоров формирует на своих выходах суммы соответствующих разрядов и слагаемые переноса, передаваемых на входы старших разрядов. Схема четырёхразрядного сумматора параллельного действия приведена на рис.10.33.
Pi = aibi + aipi + bipi = aibi + (ai + bi) pi = Di + Fipi ,
где Di = aibi; Fi = ai + bi . Иногда функция Fi реализуется так: Fi = ai Е bi (докажите справедливость последнего выражения самостоятельно). Смысл функций Di и Fi ясен из следующего числового примера:
Перенос, возникший в младшем разряде D0 = a0b0 = 1.1 = 1, распространяется до разряда с индексом i = 4, а перенос, возникший в разряде с индексом i = 5 : D5 = a5b5 = 1.1 = 1, распространяется до разряда с индексом i = 7.
С учётом вышеизложенного запишем выражения, описывающие структуру 4-разрядного параллельного сумматора с параллельным (быстрым, fast) переносом:
Pi = aibi + aipi + bipi = aibi + (ai + bi) pi = Di + Fipi ,
где Di = aibi; Fi = ai + bi . Иногда функция Fi реализуется так: Fi = ai Е bi (докажите справедливость последнего выражения самостоятельно). Смысл функций Di и Fi ясен из следующего числового примера:
Перенос, возникший в младшем разряде D0 = a0b0 = 1.1 = 1, распространяется до разряда с индексом i = 4, а перенос, возникший в разряде с индексом i = 5 : D5 = a5b5 = 1.1 = 1, распространяется до разряда с индексом i = 7.
С учётом вышеизложенного запишем выражения, описывающие структуру 4-разрядного параллельного сумматора с параллельным (быстрым, fast) переносом:
Читайте также: