bitGateLab Digital · Обучение
Русский
Открыть симулятор

Обучение › Тема 7

Двоичные сумматоры: полусумматор, полный сумматор и каскадное соединение

8 мин чтения · Команда bitGateLab

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

Двоичное сложение вручную

Правил сложения двух битов четыре: 0 + 0 = 0, 0 + 1 = 1, 1 + 0 = 1 и 1 + 1 = 102, то есть 0 и перенос 1 в следующий столбец. Если к тому же приходит перенос, 1 + 1 + 1 = 112: результат 1 и перенос 1. Как и в десятичной системе, складывают столбец за столбцом справа налево, передавая перенос влево.

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

Простейшая схема, полусумматор, складывает два бита, A и B, и имеет два выхода: сумму S и перенос C.

ABCS
0000
0101
1001
1110

Столбец S — это таблица элемента XOR, а столбец C — таблица элемента AND. Следовательно:

S = A ⊕ B    C = AB

AB SC
Полусумматор: элемент XOR выдаёт сумму S, а элемент AND — перенос C. Точками отмечены места, где каждый вход разветвляется на два элемента.

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

Полный сумматор

А вот полный сумматор складывает три бита: A, B и входной перенос Cin. Он выдаёт сумму S и выходной перенос Cout. Обратите внимание, что пара (Cout, S) — это записанное в двоичном виде количество единиц на входах.

ABCinCoutS
00000
00101
01001
01110
10001
10110
11010
11111

S равна 1 при нечётном количестве единиц: S = Σm(1, 2, 4, 7) = A ⊕ B ⊕ Cin. Cout равен 1, когда единиц две или больше: Cout = Σm(3, 5, 6, 7), а после упрощения это мажоритарная функция:

Cout = AB + ACin + BCin

Если на карте Карно для S вы попробуете объединить клетки, то увидите, что ни у одной клетки с 1 нет соседа с 1: это «шахматный» узор, типичный для XOR, который в виде суммы произведений не упрощается.

Полный сумматор из двух полусумматоров

Практичный способ его собрать — соединить в цепочку два полусумматора и один элемент OR:

  1. Первый полусумматор: P = A ⊕ B и G = AB.
  2. Второй полусумматор, на входах P и Cin: S = P ⊕ Cin и частичный перенос P·Cin.
  3. Cout = G + P·Cin = AB + (A ⊕ B)Cin.

Это выражение эквивалентно мажоритарной функции: если A и B равны 1, перенос даёт уже AB; если ровно один из них равен 1, перенос зависит от Cin. Сигнал G называют сигналом генерации переноса, а P — сигналом распространения.

Сумматор с последовательным переносом

Чтобы складывать числа из n бит, соединяют в ряд n полных сумматоров: выход Cout каждого разряда подаётся на вход Cin следующего. На Cin первого разряда подаётся 0, а Cout последнего — это выходной перенос всего сумматора. Такая структура называется сумматором с последовательным переносом, по-английски ripple carry, потому что перенос «прокатывается» от разряда к разряду, как волна. В семействе 74HC есть микросхема, которая содержит четыре полных сумматора, уже соединённых таким образом (74HC283).

Пример 1: 1011 + 0110 на 4-битном сумматоре. В десятичной системе это 11 + 6.

РазрядAiBiCinSiCout
010010
111001
201101
310101

Сумма: S3S2S1S0 = 0001 с выходным переносом 1, то есть 100012 = 17. Верно: 11 + 6 = 17, а это не помещается в 4 бита, поэтому и появляется выходной перенос.

Цена — время. Разряд 3 не может выдать окончательный результат, пока к нему не придёт перенос из разряда 2, который, в свою очередь, ждёт перенос из разряда 1. Если каждому разряду нужно два уровня логических элементов, чтобы сформировать перенос, то сумматору из n бит в худшем случае требуется порядка 2n задержек элемента. Для 64 бит это слишком медленно, поэтому в процессорах используют сумматоры с ускоренным переносом, которые вычисляют переносы параллельно по сигналам G и P. На временной диаграмме симулятора видно, как выходы меняются ступенями, пока не установятся.

Вычитание на том же сумматоре

Как объясняется в теме «системы счисления», в дополнительном коде число, противоположное B, равно B + 1. Значит:

A − B = A + B + 1

Чтобы это получить, достаточно поставить на каждый бит числа B элемент XOR, второй вход которого соединён с линией управления M, и подать M также на Cin первого разряда. При M = 0 элементы XOR пропускают B без изменений и Cin = 0: схема складывает. При M = 1 элементы XOR инвертируют B, а Cin = 1 добавляет «+1»: схема вычитает.

Пример 2: 4-битное вычитание.

  1. 9 − 5: A = 1001, B = 0101, B = 1010. 1001 + 1010 + 1 = 1 0100. Выходной перенос отбрасывается: 0100 = 4.
  2. 5 − 9: A = 0101, B = 1001, B = 0110. 0101 + 0110 + 1 = 0 1100. Выходного переноса нет. 1100 в дополнительном коде равно −8 + 4 = −4.

При вычитании чисел без знака выходной перенос показывает, был ли заём: 1 означает, что A ≥ B, а 0 — что A < B.

Для чисел со знаком переполнение обнаруживается одним-единственным элементом XOR: V = C3 ⊕ C4, где C3 — перенос, входящий в последний разряд, а C4 — выходящий из него. Если они различаются, результат не помещается в 4 бита со знаком.

Типичные ошибки

Попробуйте в симуляторе

Собрать сумматор в редакторе — лучший мост между логическими элементами и арифметикой. Начните с одного бита и дорастите до четырёх.

  1. Поместите два входа, элементы XOR и AND и соедините их, как на схеме полусумматора. Постройте его таблицу истинности.
  2. Соберите полный сумматор из двух полусумматоров и элемента OR и сверьте его 8 строк с таблицей из этой статьи.
  3. Скопируйте полный сумматор четыре раза и соедините переносы в цепочку. На первый Cin подайте 0.
  4. Установите на входах 1011 и 0110 и убедитесь, что на выходе 0001 с выходным переносом 1.
  5. Откройте временную диаграмму, измените вход так, чтобы переносу пришлось пройти через все четыре разряда (например, 1111 + 0001), и понаблюдайте, как устанавливаются выходы.

Упражнения

  1. Найдите S и Cout полного сумматора при A = 1, B = 0, Cin = 1.
    Ответ

    Единиц две: S = 0 и Cout = 1 (1 + 0 + 1 = 102).

  2. Сложите 0111 + 0101 на 4-битном сумматоре и укажите переносы каждого разряда.
    Ответ

    Разряд 0: 1 + 1 = 0, перенос 1. Разряд 1: 1 + 0 + 1 = 0, перенос 1. Разряд 2: 1 + 1 + 1 = 1, перенос 1. Разряд 3: 0 + 0 + 1 = 1, перенос 0. Результат 1100 = 12 (7 + 5).

  3. На 4-битном сумматоре-вычитателе вычислите 6 − 3 и запишите, чему равно M.
    Ответ

    M = 1. 0110 + 1100 + 1 = 1 0011. Перенос отбрасывается: 0011 = 3.

  4. Если рассматривать числа как 4-битные со знаком, есть ли переполнение в 0111 + 0101?
    Ответ

    Да. 7 + 5 = 12 не помещается в диапазон от −8 до +7. Результат 1100 прочитался бы как −4. Переносы равны C3 = 1 и C4 = 0, и V = 1 ⊕ 0 = 1.