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

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 14: Строка 14:
  
 
==Оптимизация==
 
==Оптимизация==
Очевидно, что такой подход к вычитанию сумматором не оптимален.Что бы упростить вычисления нужно воспользоваться лишним битом переноса в сумматоре, в который посылают ноль, и послать в него единицу при вычитании и ноль при суммировании. Вместо того что бы инвертировать вычитаемое число, можно сделать XOR бита первого переноса с каждым битом вычитаемого числа.<br />Таким образом, можно посылать в полученный ''арифмометр для сложения и вычитания'' числа точно так же как и при сложении, только первый бит переноса будет отвечать за знак операции: 0-сложение 1-вычитание.
+
Очевидно, что такой подход к вычитанию сумматором не оптимален, так как придётся вносить в схему последовательно 2 сумматора или блок памяти, для запоминания промежуточных действий таких как, сложение с единицей. Что бы упростить вычисления нужно воспользоваться лишним битом переноса в сумматоре, в который посылают ноль, и послать в него единицу при вычитании и ноль при суммировании. Вместо того что бы инвертировать вычитаемое число, можно сделать XOR бита первого переноса с каждым битом вычитаемого числа. Таким образом, можно посылать в полученный арифмометр числа точно так же как и при сложении, только первый бит переноса будет отвечать за знак операции: 0-сложение 1-вычитание.
  
 
==Пример реализации вычитания сумматором==
 
==Пример реализации вычитания сумматором==
Строка 46: Строка 46:
 
!<math> \mathbf {\color{OliveGreen}0 , 1 ... N} </math>
 
!<math> \mathbf {\color{OliveGreen}0 , 1 ... N} </math>
 
|[[Сумматор|блоки]] [[Каскадный сумматор|каскадного]] или [[Двоичный каскадный сумматор|двоичного каскадного]] сумматора  
 
|[[Сумматор|блоки]] [[Каскадный сумматор|каскадного]] или [[Двоичный каскадный сумматор|двоичного каскадного]] сумматора  
|
+
|[[Файл:Full_Adder.png|250px|Блок сумматор]]
 
|}
 
|}
 
|[[Файл:Arithmometer_SUM_SUB.png|400px|Арифмометр]]
 
|[[Файл:Arithmometer_SUM_SUB.png|400px|Арифмометр]]
Строка 60: Строка 60:
 
[http://www.play-hookey.com/digital/binary_subtraction.html Negative Numbers and Binary Subtraction]<br />
 
[http://www.play-hookey.com/digital/binary_subtraction.html Negative Numbers and Binary Subtraction]<br />
 
[http://tams-www.informatik.uni-hamburg.de/applets/hades/webdemos/20-arithmetic/40-addsub/add-sub.html Рабочий пример арифмометра]
 
[http://tams-www.informatik.uni-hamburg.de/applets/hades/webdemos/20-arithmetic/40-addsub/add-sub.html Рабочий пример арифмометра]
 +
 +
[[Категория:Дискретная математика и алгоритмы]]
 +
[[Категория:Схемы из функциональных элементов]]

Версия 19:29, 6 декабря 2011

Преобразование чисел для вычитания сумматором

Что бы реализовать вычитание каскадным или двоичным каскадным сумматором, нужно сложить на нём уменьшаемое с противоположным по знаку вычитаемым, так же как и при вычитании обычных чисел. Тогда полученная сумма будет разностью данных чисел.

[math] \mathbf x - y = x +(-y)[/math]


Инверсия знака записанного в двоичном виде числа происходит точно так же, как и в дополнительном коде.
Данное число нужно инвертировать и прибавить к нему единицу.

[math] \mathbf -y = (\lnot y) + 1 [/math]

Например число [math] \mathbf - 19[/math] будет записано как [math] \mathbf 01101 [/math], так как [math] \mathbf 19_\mathrm{10} = 10011_\mathrm{2}[/math], а [math] \mathbf (\lnot 10011) + 1 = 01100 + 1 = 01101 [/math]


Оптимизация

Очевидно, что такой подход к вычитанию сумматором не оптимален, так как придётся вносить в схему последовательно 2 сумматора или блок памяти, для запоминания промежуточных действий таких как, сложение с единицей. Что бы упростить вычисления нужно воспользоваться лишним битом переноса в сумматоре, в который посылают ноль, и послать в него единицу при вычитании и ноль при суммировании. Вместо того что бы инвертировать вычитаемое число, можно сделать XOR бита первого переноса с каждым битом вычитаемого числа. Таким образом, можно посылать в полученный арифмометр числа точно так же как и при сложении, только первый бит переноса будет отвечать за знак операции: 0-сложение 1-вычитание.

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

Условные обозначения Изображение арифмометра
XOR логический функциональный элементXOR
A и B входы и Y выход.
[math] \mathbf A \oplus B = Y[/math]
[math] \mathbf 0 \oplus 0 = 0[/math]
[math] \mathbf 0 \oplus 1 = 1[/math]
[math] \mathbf 1 \oplus 0 = 1[/math]
[math] \mathbf 1 \oplus 1 = 0[/math]
[math] \mathbf {\color{Goldenrod}\mbox{A}_\mathrm{0} , \mbox{A}_\mathrm{1} ... \mbox{A}_\mathrm{N}} [/math] 0-ой 1-ый ... n-ный биты первого слагаемого или уменьшаемого. [math] \mathbf A [/math]
[math] \mathbf {\color{Red}\mbox{B}_\mathrm{0} , \mbox{B}_\mathrm{1} ... \mbox{B}_\mathrm{N}} [/math] 0-ой 1-ый ... n-ный биты второго слагаемого или вычитаемого. [math] \mathbf B[/math]
[math] \mathbf {\color{Green}\mbox{S}_\mathrm{0} , \mbox{S}_\mathrm{1} ... \mbox{S}_\mathrm{N}} [/math] 0-ой 1-ый ... n-ный биты ответа. [math] \mathbf S = A \pm B[/math]
[math] \mathbf {\color{Blue}T} [/math] бит отвечающий за знак операции
T подключён к C0 0-вому биту переноса в сумматоре
0 если [math] \mathbf S = A + B[/math]
1 если [math] \mathbf S = A - B[/math]
[math] \mathbf {\color{OliveGreen}0 , 1 ... N} [/math] блоки каскадного или двоичного каскадного сумматора Блок сумматор
Арифмометр

См. также

Сумматор
Матричный умножитель
Реализация булевой функции схемой из функциональных элементов

Ссылки

Subtractor
Negative Numbers and Binary Subtraction
Рабочий пример арифмометра