Преобразование чисел для вычитания сумматором
Чтобы реализовать вычитание каскадным или двоичным каскадным сумматором, нужно сложить на нём уменьшаемое с противоположным по знаку вычитаемым, так же как и при вычитании обычных чисел. Тогда полученная сумма будет разностью данных чисел: [math] x - y = x + (-y)[/math].
Инверсия знака записанного в двоичном виде числа происходит точно так же, как и в дополнительном коде.
Данное число нужно инвертировать и прибавить к нему единицу: [math] -y = (\lnot y) + 1 [/math].
Например, число [math] \large - 19[/math] будет записано как [math] \large 01101 [/math], так как [math] \large 19_\mathrm{10} = 10011_\mathrm{2}[/math], а [math] \large (\lnot 10011) + 1 = 01100 + 1 = 01101 [/math]
Оптимизация
Очевидно, что реализация преобразования в дополнительный код отдельным сумматором делает вычисление разности в два раза медленнее, чем вычисление суммы. Чтобы ускорить вычисления нужно воспользоваться первым битом переноса в сумматоре: для реализации суммы в него посылают ноль, а для реализации вычитания посылать в него единицу при вычитании и ноль при суммировании. Вместо того, чтобы инвертировать вычитаемое число, можно делать XOR бита первого переноса с каждым битом вычитаемого числа. Таким образом, полученная схема будет работать как для суммирования, так и для вычитания, и при этом вычитание не требует больше времени, чем сложение.
Пример реализации вычитания сумматором
Условные обозначения
|
Изображение арифмометра
|
|
логический функциональный элемент XOR
A и B входы и Y выход.
|
[math] \large A \oplus B = Y[/math]
[math] \large 0 \oplus 0 = 0[/math]
[math] \large 0 \oplus 1 = 1[/math]
[math] \large 1 \oplus 0 = 1[/math]
[math] \large 1 \oplus 1 = 0[/math]
|
[math] \mathbf {\mbox{A}_\mathrm{0} , \mbox{A}_\mathrm{1}, \dots, \mbox{A}_\mathrm{N}} [/math]
|
0-ой 1-ый ... n-ный биты первого слагаемого или уменьшаемого.
|
[math] \large A [/math]
|
[math] \mathbf {\mbox{B}_\mathrm{0} , \mbox{B}_\mathrm{1}, \dots, \mbox{B}_\mathrm{N}} [/math]
|
0-ой 1-ый ... n-ный биты второго слагаемого или вычитаемого.
|
[math] \large B[/math]
|
[math] \mathbf {\mbox{S}_\mathrm{0} , \mbox{S}_\mathrm{1}, \dots, \mbox{S}_\mathrm{N}} [/math]
|
0-ой 1-ый ... n-ный биты ответа.
|
[math] \large S = A \pm B[/math]
|
[math] \mathbf {T} [/math]
|
бит отвечающий за знак операции
T подключён к C0
|
0 если [math] \large S = A + B[/math] 1 если [math] \large S = A - B[/math]
|
[math] \mathbf 0 , 1, \dots, N [/math]
|
блоки каскадного или двоичного каскадного сумматора
|
|
[math] \mathbf {\mbox{C}_\mathrm{0}} [/math]
|
Изначально ненужный бит в сумматоре,
однако он полезен при вычитании.
|
В последующих блоках
в бит переноса подаётся
старший разряд
предыдущего суммирования.
|
|
|
См. также
Ссылки