Обнаружение переполнения в CSA (Carry-save Adder)

Как вы обнаруживаете переполнение, когда у вас есть CSA?

У меня есть 3 16-битных дополнительных входа и 16-битный выход, и мне интересно, как обнаружить переполнение?

Что такое КСА???
Сумматор с сохранением переноса
Зачем вам нужно использовать сумматор переноса-сохранения в контексте, где переполнение имеет значение? Если ваша цель состоит в том, чтобы определить переполнение при суммировании трех значений, вычислите сумму всех значений ниже знакового бита вместе с количеством операций (ноль, один или два). Затем сложите биты знака и переносы, чтобы вычислить количество переносов конечного результата (снова ноль, один или два). Если количество переносов в двух расчетах не совпадает, произошло переполнение. Этот подход можно расширить и для большего количества входных данных.

Ответы (3)

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

Я не знаю способа определить переполнение, просто взглянув на старшие значащие биты (как это можно сделать в сумматоре с переносом). Например, вот пример переполнения в 3-битном дополнении до 2 (3+3-2 = 4).

  0 1 1     (3)
  0 1 1     (3)
  1 1 0     (-2)
  -----
  1 1 0     (-2)
0 1 1       (6)

И еще один с теми же старшими битами, который не переполняется:

  0 1 1     (3)
  0 1 1     (3)
  1 0 1     (-3)
  -----
  1 0 1     (-3)
0 1 1 0     (6)
@starbox: А? Поскольку наибольшее возможное значение, представленное в 3-битном дополнении до 2, равно +3, и поскольку 3+3-2 больше, чем это, 3+3-2 будет переполняться в 3-битном дополнении до 2.

Мне пришлось вернуться к моему руководству по 68HC11, чтобы понять, где я ошибся в своем ответе. Так! Ответ заключается в том, чтобы посмотреть на знаковые биты как входных данных, так и результатов.

  • Если вы сложите два положительных числа, а результат будет отрицательным, у вас возникло переполнение.
  • Если вы добавите два отрицательных числа и получите положительный результат, у вас возникло переполнение.
  • Добавление отрицательного и положительного числа не может переполниться
Да, я мог бы сделать вывод сумматора шире, но как мне выполнить эту операцию в любом случае?
Я расширил свой ответ, чтобы попытаться лучше ответить на ваш вопрос и комментарий
Я считаю, что ваш ответ верен только для беззнаковых операндов. Я выполняю операции с двумя дополнительными операндами (со знаком)
Это верно для большинства сумматоров, но не для RCA.

Вы можете обнаружить переполнение после CSA, используя два самых значимых бита переноса, обозначаемых С о (бит, который отбрасывается), и С , и самый старший знаковый бит, С . Дополнение переполнится, если С о "=" С "=" 0 и С "=" 1 , т. е. все положительные числа, но сумма не может быть представлена ​​в соответствующем представлении дополнения до двух (хотя на самом деле вы получите положительное число в конце, вызванное двойным переполнением) или С 0 "=" С "=" 1 и С "=" 0 , т. е. все отрицательные входные данные, но слишком большая величина (но это все равно может привести к отрицательному числу из-за двойного переполнения).

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

Пример 1:

  011
  011
 +011
-----
 011  carry
  011 sum

Переполнение как С о "=" 0 , С "=" 0 , С "=" 1

  110
 +011
 ----
  001

Здесь в конце происходит еще одно переполнение (хотя это не обнаружено, поскольку с точки зрения дополнения до двух 2 + 3 не переполняется), поэтому несмотря на переполнение получается положительное число.

Пример 2:

  010
  010
 +110
-----
 010  carry
  110 sum

Нет переполнения, как С о "=" 0 , С "=" 1 , С "=" 1

  100
 +110
 ----
  010

Правильный ответ! Тем не менее, похоже, что произошло переполнение при добавлении двух дополнений. Это можно решить, заменив биты знака как С "=" С о и С "=" С С С о (это также сделает представление переноса-сохранения смещаемым), что приведет к

  000
 +010
 ----
  010

и переполнение не обнаружено (что правильно).

Пример 3:

  011
  011
 +111
-----
 011  carry
  111 sum

Нет переполнения, как С о "=" 0 , С "=" 1 , С "=" 1

  110
 +111
 ----
  101

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

  010
 +011
 ----
  101

Теперь, поскольку входящий перенос на конечную стадию (1) отличается от исходящего (0), обнаруживается переполнение, что, конечно, правильно, поскольку 3 + 3 1 находится вне [ 4 , 3 ] возможный диапазон

Все это предлагается и обсуждается в «Архитектурах переноса-сохранения для высокоскоростной обработки цифровых сигналов» Тобиаса Нолла.