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

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 2: Строка 2:
 
Что бы реализовать вычитание [[Каскадный сумматор|каскадным]] или [[Двоичный каскадный сумматор|двоичным каскадным сумматором]], нужно  сложить на нём уменьшаемое с противоположным по знаку вычитаемым, так же как и при вычитании обычных чисел. Тогда полученная сумма будет разностью данных чисел.
 
Что бы реализовать вычитание [[Каскадный сумматор|каскадным]] или [[Двоичный каскадный сумматор|двоичным каскадным сумматором]], нужно  сложить на нём уменьшаемое с противоположным по знаку вычитаемым, так же как и при вычитании обычных чисел. Тогда полученная сумма будет разностью данных чисел.
  
<math>  x - y = x +(-y)</math>
+
<tex> \large x - y = x +(-y)</tex>
 +
 
 +
Инверсия знака записанного в двоичном виде числа происходит точно так же, как и в [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код#Дополнительный код|дополнительном коде]].
  
Инверсия знака записанного в двоичном виде числа происходит точно так же, как и в [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код#Дополнительный код|дополнительном коде]].<br/>
 
 
Данное число нужно инвертировать и прибавить к нему единицу.
 
Данное число нужно инвертировать и прибавить к нему единицу.
  
<math> -y = (\lnot y) + 1 </math>
+
<tex> \large -y = (\lnot y) + 1 </tex>
  
Например число <math> - 19</math> будет записано как <math>  01101 </math>, так как <math>  19_\mathrm{10} = 10011_\mathrm{2}</math>,  а  <math>  (\lnot 10011) + 1 = 01100 + 1 = 01101 </math>
+
Например число <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>
  
  
Строка 24: Строка 25:
 
{| border="1"
 
{| border="1"
 
![[Файл:XOR_logic_element.png|100px|XOR]]
 
![[Файл:XOR_logic_element.png|100px|XOR]]
| логический [[Реализация булевой функции схемой из функциональных элементов|функциональный элемент]] '''XOR'''<br />'''A''' и '''B''' входы и '''Y''' выход.
+
| логический [[Реализация булевой функции схемой из функциональных элементов|функциональный элемент]] '''XOR'''
!<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>
+
 
 +
'''A''' и '''B''' входы и '''Y''' выход.
 +
!<tex> \large A \oplus B = Y</tex>
 +
 
 +
<tex> \large 0 \oplus 0 = 0</tex>
 +
 
 +
<tex> \large 0 \oplus 1 = 1</tex>
 +
 
 +
<tex> \large 1 \oplus 0 = 1</tex>
 +
 
 +
<tex> \large 1 \oplus 1 = 0</tex>
 
|-
 
|-
 
!<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>
 
|'''0'''-ой '''1'''-ый ... '''n'''-ный биты первого слагаемого или уменьшаемого.
 
|'''0'''-ой '''1'''-ый ... '''n'''-ный биты первого слагаемого или уменьшаемого.
!<math> \mathbf A </math>
+
!<tex> \large  A </tex>
 
|-
 
|-
 
!<math> \mathbf {\color{Red}\mbox{B}_\mathrm{0} , \mbox{B}_\mathrm{1} ... \mbox{B}_\mathrm{N}} </math>
 
!<math> \mathbf {\color{Red}\mbox{B}_\mathrm{0} , \mbox{B}_\mathrm{1} ... \mbox{B}_\mathrm{N}} </math>
 
|'''0'''-ой '''1'''-ый ... '''n'''-ный биты второго слагаемого или вычитаемого.
 
|'''0'''-ой '''1'''-ый ... '''n'''-ный биты второго слагаемого или вычитаемого.
!<math> \mathbf B</math>
+
!<tex> \large B</tex>
 
|-
 
|-
 
!<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> S = A \pm B</math>
+
!<tex> \large S = A \pm B</tex>
 
|-
 
|-
 
!<math> \mathbf {\color{Blue}T} </math>
 
!<math> \mathbf {\color{Blue}T} </math>
|бит отвечающий за знак операции<br />'''T''' подключён к '''C<small>0</small>''' 0-вому биту переноса в сумматоре
+
|бит отвечающий за знак операции
!0 если <math>  S = A + B</math><br />1 если <math>  S = A - B</math><br />
+
 
 +
'''T''' подключён к '''C<small>0</small>''' 0-вому биту переноса в сумматоре
 +
|<center>'''0''' если <tex> \large S = A + B</tex><br />'''1''' если <tex> \large S = A - B</tex></center>
 
|-
 
|-
 
!<math> \mathbf {\color{OliveGreen}0 , 1 ... N} </math>
 
!<math> \mathbf {\color{OliveGreen}0 , 1 ... N} </math>
Строка 51: Строка 64:
  
 
==См. также==
 
==См. также==
[[Двоичный_каскадный_сумматор|Сумматор]]<br />
+
*[[Двоичный_каскадный_сумматор|Сумматор]]
[[Матричный_умножитель|Матричный умножитель]]<br />
+
*[[Матричный_умножитель|Матричный умножитель]]
[[Реализация_булевой_функции_схемой_из_функциональных_элементов|Реализация булевой функции схемой из функциональных элементов]]
+
*[[Реализация_булевой_функции_схемой_из_функциональных_элементов|Реализация булевой функции схемой из функциональных элементов]]
  
 
==Ссылки==
 
==Ссылки==
[http://en.wikipedia.org/wiki/Subtractor Subtractor]<br />
+
*[http://en.wikipedia.org/wiki/Subtractor Subtractor]
[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]
[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 Рабочий пример арифмометра]
  
 
[[Категория:Дискретная математика и алгоритмы]]
 
[[Категория:Дискретная математика и алгоритмы]]
 
[[Категория:Схемы из функциональных элементов]]
 
[[Категория:Схемы из функциональных элементов]]

Версия 06:19, 14 декабря 2011

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

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

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

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

Данное число нужно инвертировать и прибавить к нему единицу.

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

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


Оптимизация

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

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

Условные обозначения Изображение арифмометра
XOR логический функциональный элемент XOR

A и B входы и Y выход.

[math] \large A \oplus B = Y[/math]

[math] \large 0 \oplus 0 = 0[/math]

[math] \large 0 \oplus 1 = 1[/math]

[math] \large 1 \oplus 0 = 1[/math]

[math] \large 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] \large A [/math]
[math] \mathbf {\color{Red}\mbox{B}_\mathrm{0} , \mbox{B}_\mathrm{1} ... \mbox{B}_\mathrm{N}} [/math] 0-ой 1-ый ... n-ный биты второго слагаемого или вычитаемого. [math] \large B[/math]
[math] \mathbf {\color{Green}\mbox{S}_\mathrm{0} , \mbox{S}_\mathrm{1} ... \mbox{S}_\mathrm{N}} [/math] 0-ой 1-ый ... n-ный биты ответа. [math] \large S = A \pm B[/math]
[math] \mathbf {\color{Blue}T} [/math] бит отвечающий за знак операции

T подключён к C0 0-вому биту переноса в сумматоре

0 если [math] \large S = A + B[/math]
1 если [math] \large S = A - B[/math]
[math] \mathbf {\color{OliveGreen}0 , 1 ... N} [/math] блоки каскадного или двоичного каскадного сумматора Блок сумматор
Арифмометр

См. также

Ссылки