Реализация вычитания сумматором — различия между версиями
Alex z (обсуждение | вклад) |
Alex z (обсуждение | вклад) |
||
Строка 2: | Строка 2: | ||
Что бы реализовать вычитание [[Каскадный сумматор|каскадным]] или [[Двоичный каскадный сумматор|двоичным каскадным сумматором]], нужно сложить на нём уменьшаемое с противоположным по знаку вычитаемым, так же как и при вычитании обычных чисел. Тогда полученная сумма будет разностью данных чисел. | Что бы реализовать вычитание [[Каскадный сумматор|каскадным]] или [[Двоичный каскадный сумматор|двоичным каскадным сумматором]], нужно сложить на нём уменьшаемое с противоположным по знаку вычитаемым, так же как и при вычитании обычных чисел. Тогда полученная сумма будет разностью данных чисел. | ||
− | <math> | + | <math> x - y = x +(-y)</math> |
− | |||
Инверсия знака записанного в двоичном виде числа происходит точно так же, как и в [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код#Дополнительный код|дополнительном коде]].<br/> | Инверсия знака записанного в двоичном виде числа происходит точно так же, как и в [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код#Дополнительный код|дополнительном коде]].<br/> | ||
Данное число нужно инвертировать и прибавить к нему единицу. | Данное число нужно инвертировать и прибавить к нему единицу. | ||
− | <math> | + | <math> -y = (\lnot y) + 1 </math> |
− | Например число <math> | + | Например число <math> - 19</math> будет записано как <math> 01101 </math>, так как <math> 19_\mathrm{10} = 10011_\mathrm{2}</math>, а <math> (\lnot 10011) + 1 = 01100 + 1 = 01101 </math> |
Строка 26: | Строка 25: | ||
![[Файл:XOR_logic_element.png|100px|XOR]] | ![[Файл:XOR_logic_element.png|100px|XOR]] | ||
| логический [[Реализация булевой функции схемой из функциональных элементов|функциональный элемент]] '''XOR'''<br />'''A''' и '''B''' входы и '''Y''' выход. | | логический [[Реализация булевой функции схемой из функциональных элементов|функциональный элемент]] '''XOR'''<br />'''A''' и '''B''' входы и '''Y''' выход. | ||
− | !<math> | + | !<math> A \oplus B = Y</math><br /><math> 0 \oplus 0 = 0</math><br /><math> 0 \oplus 1 = 1</math><br /><math> 1 \oplus 0 = 1</math><br /><math> 1 \oplus 1 = 0</math> |
|- | |- | ||
!<math> \mathbf {\color{Goldenrod}\mbox{A}_\mathrm{0} , \mbox{A}_\mathrm{1} ... \mbox{A}_\mathrm{N}} </math> | !<math> \mathbf {\color{Goldenrod}\mbox{A}_\mathrm{0} , \mbox{A}_\mathrm{1} ... \mbox{A}_\mathrm{N}} </math> | ||
Строка 38: | Строка 37: | ||
!<math> \mathbf {\color{Green}\mbox{S}_\mathrm{0} , \mbox{S}_\mathrm{1} ... \mbox{S}_\mathrm{N}} </math> | !<math> \mathbf {\color{Green}\mbox{S}_\mathrm{0} , \mbox{S}_\mathrm{1} ... \mbox{S}_\mathrm{N}} </math> | ||
|'''0'''-ой '''1'''-ый ... '''n'''-ный биты ответа. | |'''0'''-ой '''1'''-ый ... '''n'''-ный биты ответа. | ||
− | !<math> | + | !<math> S = A \pm B</math> |
|- | |- | ||
!<math> \mathbf {\color{Blue}T} </math> | !<math> \mathbf {\color{Blue}T} </math> | ||
|бит отвечающий за знак операции<br />'''T''' подключён к '''C<small>0</small>''' 0-вому биту переноса в сумматоре | |бит отвечающий за знак операции<br />'''T''' подключён к '''C<small>0</small>''' 0-вому биту переноса в сумматоре | ||
− | !0 если <math> | + | !0 если <math> S = A + B</math><br />1 если <math> S = A - B</math><br /> |
|- | |- | ||
!<math> \mathbf {\color{OliveGreen}0 , 1 ... N} </math> | !<math> \mathbf {\color{OliveGreen}0 , 1 ... N} </math> |
Версия 00:39, 10 декабря 2011
Содержание
Преобразование чисел для вычитания сумматором
Что бы реализовать вычитание каскадным или двоичным каскадным сумматором, нужно сложить на нём уменьшаемое с противоположным по знаку вычитаемым, так же как и при вычитании обычных чисел. Тогда полученная сумма будет разностью данных чисел.
Инверсия знака записанного в двоичном виде числа происходит точно так же, как и в дополнительном коде.
Данное число нужно инвертировать и прибавить к нему единицу.
Например число
будет записано как , так как , а
Оптимизация
Очевидно, что такой подход к вычитанию сумматором не оптимален, так как придётся вносить в схему последовательно 2 сумматора или блок памяти, для запоминания промежуточных действий таких как, сложение с единицей. Что бы упростить вычисления нужно воспользоваться лишним битом переноса в сумматоре, в который посылают ноль, и послать в него единицу при вычитании и ноль при суммировании. Вместо того что бы инвертировать вычитаемое число, можно сделать XOR бита первого переноса с каждым битом вычитаемого числа. Таким образом, можно посылать в полученный арифмометр числа точно так же как и при сложении, только первый бит переноса будет отвечать за знак операции: 0-сложение 1-вычитание.
Пример реализации вычитания сумматором
Условные обозначения | Изображение арифмометра | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
См. также
Сумматор
Матричный умножитель
Реализация булевой функции схемой из функциональных элементов
Ссылки
Subtractor
Negative Numbers and Binary Subtraction
Рабочий пример арифмометра