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

Материал из Викиконспекты
Перейти к: навигация, поиск
(Новая страница: «==Преобразование чисел для вычитания сумматором== Что бы реализовать вычитание [[Каскадный...»)
 
Строка 16: Строка 16:
 
Очевидно, что такой подход к вычитанию сумматором не оптимален.Что бы упростить вычисления нужно воспользоваться лишним битом переноса в сумматоре, в который посылают ноль, и послать в него единицу при вычитании и ноль при суммировании. Вместо того что бы инвертировать вычитаемое число, можно сделать XOR бита первого переноса с каждым битом вычитаемого числа.<br />Таким образом, можно посылать в полученный ''арифмометр для сложения и вычитания'' числа точно так же как и при сложении, только первый бит переноса будет отвечать за знак операции: 0-сложение 1-вычитание.
 
Очевидно, что такой подход к вычитанию сумматором не оптимален.Что бы упростить вычисления нужно воспользоваться лишним битом переноса в сумматоре, в который посылают ноль, и послать в него единицу при вычитании и ноль при суммировании. Вместо того что бы инвертировать вычитаемое число, можно сделать XOR бита первого переноса с каждым битом вычитаемого числа.<br />Таким образом, можно посылать в полученный ''арифмометр для сложения и вычитания'' числа точно так же как и при сложении, только первый бит переноса будет отвечать за знак операции: 0-сложение 1-вычитание.
  
<!-- Узнаю как загружать изображения, добавлю наглядную схему. -->
+
==Пример реализация вычитания сумматором==
 +
===Условные обозначения===
 +
{| border="1"
 +
![[Файл:XOR_logic_element.png|100px|XOR]]
 +
| логический [[Реализация булевой функции схемой из функциональных элементов|функциональный элемент]]'''XOR'''<br />'''A''' и '''B''' входы и '''Y''' выход.
 +
!<math> \mathbf A \oplus B = Y</math><br /><math> \mathbf 0 \oplus 0 = 0</math><br /><math> \mathbf 0 \oplus 1 = 1</math><br /><math> \mathbf 1 \oplus 0 = 1</math><br /><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>
 +
|бит отвечающий за знак операции
 +
!0 если <math> \mathbf S = A + B</math><br />1 если <math> \mathbf S = A - B</math><br />
 +
|-
 +
!<math> \mathbf {\color{OliveGreen}0 , 1 ... N} </math>
 +
|[[Сумматор|блоки]] [[Каскадный сумматор|каскадного]] или [[Двоичный каскадный сумматор|двоичного каскадного]] сумматора
 +
!T подключён к C<small>0<br /> 0-вому биту переноса в сумматоре</small>
 +
|}
 +
===Изображение арифмометра===
 +
[[Файл:Arithmometer_SUM_SUB.png|Арифмометр]]

Версия 20:00, 29 ноября 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] (\lnot 10011) + 1 = 01100 + 1 = 01101 [/math]


Оптимизация

Очевидно, что такой подход к вычитанию сумматором не оптимален.Что бы упростить вычисления нужно воспользоваться лишним битом переноса в сумматоре, в который посылают ноль, и послать в него единицу при вычитании и ноль при суммировании. Вместо того что бы инвертировать вычитаемое число, можно сделать 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] бит отвечающий за знак операции 0 если [math] \mathbf S = A + B[/math]
1 если [math] \mathbf S = A - B[/math]
[math] \mathbf {\color{OliveGreen}0 , 1 ... N} [/math] блоки каскадного или двоичного каскадного сумматора T подключён к C0
0-вому биту переноса в сумматоре

Изображение арифмометра

Арифмометр