Изменения

Перейти к: навигация, поиск

Реализация вычитания сумматором

170 байт убрано, 13:11, 12 января 2012
Нет описания правки
==Преобразование чисел для вычитания сумматором==
Что бы Чтобы реализовать вычитание [[Каскадный сумматор|каскадным]] или [[Двоичный каскадный сумматор|двоичным каскадным сумматором]], нужно сложить на нём уменьшаемое с противоположным по знаку вычитаемым, так же как и при вычитании обычных чисел. Тогда полученная сумма будет разностью данных чисел. : <tex> \large x - y = x + (-y)</tex>.
Инверсия знака записанного в двоичном виде числа происходит точно так же, как и в [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код#Дополнительный код|дополнительном коде]].
Данное число нужно инвертировать и прибавить к нему единицу. : <tex> \large -y = (\lnot y) + 1 </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>.
Например, число <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>
==Оптимизация==
Очевидно, что такой подход к вычитанию реализация преобразования в дополнительный код отдельным сумматором не оптимален, так как придётся вносить делает вычисление разности в схему последовательно 2 сумматора или блок памятидва раза медленнее, для запоминания промежуточных действий таких как, сложение с единицейчем вычисление суммы. Что бы упростить Чтобы ускорить вычисления нужно воспользоваться лишним первым битом переноса в сумматоре, : для реализации суммы в который него посылают ноль, и послать а для реализации вычитания посылать в него единицу при вычитании и ноль при суммировании. Вместо того что бы , чтобы инвертировать вычитаемое число, можно сделать делать XOR бита первого переноса с каждым битом вычитаемого числа. Таким образом, можно посылать в полученный арифмометр числа точно полученная схема будет работать как для суммирования, так же как и для вычитания, и при сложенииэтом вычитание не требует больше времени, только первый бит переноса будет отвечать за знак операции: 0-чем сложение 1-вычитание.
==Пример реализации вычитания сумматором==
<tex> \large 1 \oplus 1 = 0</tex>
|-
!<mathtex> \mathbf {\color{Goldenrod}\mbox{A}_\mathrm{0} , \mbox{A}_\mathrm{1} ... , \dots, \mbox{A}_\mathrm{N}} </mathtex>
|'''0'''-ой '''1'''-ый ... '''n'''-ный биты первого слагаемого или уменьшаемого.
!<tex> \large A </tex>
|-
!<mathtex> \mathbf {\color{Red}\mbox{B}_\mathrm{0} , \mbox{B}_\mathrm{1} ... , \dots, \mbox{B}_\mathrm{N}} </mathtex>
|'''0'''-ой '''1'''-ый ... '''n'''-ный биты второго слагаемого или вычитаемого.
!<tex> \large B</tex>
|-
!<mathtex> \mathbf {\color{Green}\mbox{S}_\mathrm{0} , \mbox{S}_\mathrm{1} ... , \dots, \mbox{S}_\mathrm{N}} </mathtex>
|'''0'''-ой '''1'''-ый ... '''n'''-ный биты ответа.
!<tex> \large S = A \pm B</tex>
|-
!<mathtex> \mathbf {\color{Blue}T} </mathtex>
|бит отвечающий за знак операции
'''T''' подключён к '''C<small>0</small>'''
|<center>'''0''' если <tex> \large S = A + B</tex><br />'''1''' если <tex> \large S = A - B</tex></center>
|-
!<mathtex> \mathbf {\color{OliveGreen}0 , 1 ... , \dots, N} </mathtex>
|[[Сумматор|блоки]] [[Каскадный сумматор|каскадного]] или [[Двоичный каскадный сумматор|двоичного каскадного]] сумматора
|[[Файл:Full_Adder.png|250px|Блок сумматор]]
|-
!<mathtex> \mathbf {\color{Black}\mbox{C}_\mathrm{0}} </mathtex>
|Изначально ненужный бит в сумматоре,
однако он [[Реализация вычитания сумматором#Оптимизация|полезен при вычитании]].
304
правки

Навигация