Реализация вычитания сумматором — различия между версиями
Alex z (обсуждение | вклад) |
|||
Строка 1: | Строка 1: | ||
==Преобразование чисел для вычитания сумматором== | ==Преобразование чисел для вычитания сумматором== | ||
− | + | Чтобы реализовать вычитание [[Каскадный сумматор|каскадным]] или [[Двоичный каскадный сумматор|двоичным каскадным сумматором]], нужно сложить на нём уменьшаемое с противоположным по знаку вычитаемым, так же как и при вычитании обычных чисел. Тогда полученная сумма будет разностью данных чисел: <tex> x - y = x + (-y)</tex>. | |
− | |||
− | <tex> | ||
Инверсия знака записанного в двоичном виде числа происходит точно так же, как и в [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код#Дополнительный код|дополнительном коде]]. | Инверсия знака записанного в двоичном виде числа происходит точно так же, как и в [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код#Дополнительный код|дополнительном коде]]. | ||
− | Данное число нужно инвертировать и прибавить к нему единицу | + | Данное число нужно инвертировать и прибавить к нему единицу: <tex> -y = (\lnot y) + 1 </tex>. |
− | |||
− | <tex> | ||
− | |||
− | |||
+ | Например, число <tex> \large - 19</tex> будет записано как <tex> \large 01101 </tex>, так как <tex> \large 19_\mathrm{10} = 10011_\mathrm{2}</tex>, а <tex> \large (\lnot 10011) + 1 = 01100 + 1 = 01101 </tex> | ||
==Оптимизация== | ==Оптимизация== | ||
− | Очевидно, что | + | Очевидно, что реализация преобразования в дополнительный код отдельным сумматором делает вычисление разности в два раза медленнее, чем вычисление суммы. Чтобы ускорить вычисления нужно воспользоваться первым битом переноса в сумматоре: для реализации суммы в него посылают ноль, а для реализации вычитания посылать в него единицу при вычитании и ноль при суммировании. Вместо того, чтобы инвертировать вычитаемое число, можно делать XOR бита первого переноса с каждым битом вычитаемого числа. Таким образом, полученная схема будет работать как для суммирования, так и для вычитания, и при этом вычитание не требует больше времени, чем сложение. |
==Пример реализации вычитания сумматором== | ==Пример реализации вычитания сумматором== | ||
Строка 38: | Строка 33: | ||
<tex> \large 1 \oplus 1 = 0</tex> | <tex> \large 1 \oplus 1 = 0</tex> | ||
|- | |- | ||
− | !< | + | !<tex> \mathbf {\mbox{A}_\mathrm{0} , \mbox{A}_\mathrm{1}, \dots, \mbox{A}_\mathrm{N}} </tex> |
|'''0'''-ой '''1'''-ый ... '''n'''-ный биты первого слагаемого или уменьшаемого. | |'''0'''-ой '''1'''-ый ... '''n'''-ный биты первого слагаемого или уменьшаемого. | ||
!<tex> \large A </tex> | !<tex> \large A </tex> | ||
|- | |- | ||
− | !< | + | !<tex> \mathbf {\mbox{B}_\mathrm{0} , \mbox{B}_\mathrm{1}, \dots, \mbox{B}_\mathrm{N}} </tex> |
|'''0'''-ой '''1'''-ый ... '''n'''-ный биты второго слагаемого или вычитаемого. | |'''0'''-ой '''1'''-ый ... '''n'''-ный биты второго слагаемого или вычитаемого. | ||
!<tex> \large B</tex> | !<tex> \large B</tex> | ||
|- | |- | ||
− | !< | + | !<tex> \mathbf {\mbox{S}_\mathrm{0} , \mbox{S}_\mathrm{1}, \dots, \mbox{S}_\mathrm{N}} </tex> |
|'''0'''-ой '''1'''-ый ... '''n'''-ный биты ответа. | |'''0'''-ой '''1'''-ый ... '''n'''-ный биты ответа. | ||
!<tex> \large S = A \pm B</tex> | !<tex> \large S = A \pm B</tex> | ||
|- | |- | ||
− | !< | + | !<tex> \mathbf {T} </tex> |
|бит отвечающий за знак операции | |бит отвечающий за знак операции | ||
'''T''' подключён к '''C<small>0</small>''' | '''T''' подключён к '''C<small>0</small>''' | ||
|<center>'''0''' если <tex> \large S = A + B</tex><br />'''1''' если <tex> \large S = A - B</tex></center> | |<center>'''0''' если <tex> \large S = A + B</tex><br />'''1''' если <tex> \large S = A - B</tex></center> | ||
|- | |- | ||
− | !< | + | !<tex> \mathbf 0 , 1, \dots, N </tex> |
|[[Сумматор|блоки]] [[Каскадный сумматор|каскадного]] или [[Двоичный каскадный сумматор|двоичного каскадного]] сумматора | |[[Сумматор|блоки]] [[Каскадный сумматор|каскадного]] или [[Двоичный каскадный сумматор|двоичного каскадного]] сумматора | ||
|[[Файл:Full_Adder.png|250px|Блок сумматор]] | |[[Файл:Full_Adder.png|250px|Блок сумматор]] | ||
|- | |- | ||
− | !< | + | !<tex> \mathbf {\mbox{C}_\mathrm{0}} </tex> |
|Изначально ненужный бит в сумматоре, | |Изначально ненужный бит в сумматоре, | ||
однако он [[Реализация вычитания сумматором#Оптимизация|полезен при вычитании]]. | однако он [[Реализация вычитания сумматором#Оптимизация|полезен при вычитании]]. |
Версия 13:11, 12 января 2012
Содержание
Преобразование чисел для вычитания сумматором
Чтобы реализовать вычитание каскадным или двоичным каскадным сумматором, нужно сложить на нём уменьшаемое с противоположным по знаку вычитаемым, так же как и при вычитании обычных чисел. Тогда полученная сумма будет разностью данных чисел: .
Инверсия знака записанного в двоичном виде числа происходит точно так же, как и в дополнительном коде.
Данное число нужно инвертировать и прибавить к нему единицу:
.Например, число
будет записано как , так как , аОптимизация
Очевидно, что реализация преобразования в дополнительный код отдельным сумматором делает вычисление разности в два раза медленнее, чем вычисление суммы. Чтобы ускорить вычисления нужно воспользоваться первым битом переноса в сумматоре: для реализации суммы в него посылают ноль, а для реализации вычитания посылать в него единицу при вычитании и ноль при суммировании. Вместо того, чтобы инвертировать вычитаемое число, можно делать XOR бита первого переноса с каждым битом вычитаемого числа. Таким образом, полученная схема будет работать как для суммирования, так и для вычитания, и при этом вычитание не требует больше времени, чем сложение.
Пример реализации вычитания сумматором
Условные обозначения | Изображение арифмометра | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|