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

Материал из Викиконспекты
Перейти к: навигация, поиск
м (rollbackEdits.php mass rollback)
 
(не показаны 4 промежуточные версии 3 участников)
Строка 1: Строка 1:
 
==Преобразование чисел для вычитания сумматором==
 
==Преобразование чисел для вычитания сумматором==
Что бы реализовать вычитание [[Каскадный сумматор|каскадным]] или [[Двоичный каскадный сумматор|двоичным каскадным сумматором]], нужно  сложить на нём уменьшаемое с противоположным по знаку вычитаемым, так же как и при вычитании обычных чисел. Тогда полученная сумма будет разностью данных чисел.
+
Чтобы реализовать вычитание [[Каскадный сумматор|каскадным]] или [[Двоичный каскадный сумматор|двоичным каскадным сумматором]], нужно  сложить на нём уменьшаемое с противоположным по знаку вычитаемым, так же как и при вычитании обычных чисел. Тогда полученная сумма будет разностью данных чисел: <tex> x - y = x + (-y)</tex>.
 
 
<tex> \large  x - y = x + (-y)</tex>
 
  
 
Инверсия знака записанного в двоичном виде числа происходит точно так же, как и в [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код#Дополнительный код|дополнительном коде]].
 
Инверсия знака записанного в двоичном виде числа происходит точно так же, как и в [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код#Дополнительный код|дополнительном коде]].
  
Данное число нужно инвертировать и прибавить к нему единицу.
+
Данное число нужно инвертировать и прибавить к нему единицу: <tex> -y = (\lnot y) + 1 </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-вычитание.
+
Очевидно, что реализация преобразования в дополнительный код отдельным сумматором делает вычисление разности в два раза медленнее, чем вычисление суммы. Чтобы ускорить вычисления нужно воспользоваться первым битом переноса в сумматоре: для реализации суммы в него посылают ноль, а для реализации вычитания посылать в него единицу при вычитании и ноль при суммировании. Вместо того, чтобы инвертировать вычитаемое число, можно делать XOR бита первого переноса с каждым битом вычитаемого числа. Таким образом, полученная схема будет работать как для суммирования, так и для вычитания, и при этом вычитание не требует больше времени, чем сложение.
  
==Пример реализации вычитания сумматором==
+
==Схема реализации вычитания сумматором==
 
{|
 
{|
 
|-
 
|-
 
!Условные обозначения
 
!Условные обозначения
!Изображение арифмометра
+
!Изображение схемы
 
|-
 
|-
 
|
 
|
Строка 38: Строка 33:
 
<tex> \large 1 \oplus 1 = 0</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>
+
!<tex> \mathbf {\mbox{A}_\mathrm{0} , \mbox{A}_\mathrm{1}, \dots, \mbox{A}_\mathrm{N}} </tex>
|'''0'''-ой '''1'''-ый ... '''n'''-ный биты первого слагаемого или уменьшаемого.
+
|биты первого слагаемого (уменьшаемого)
 
!<tex> \large  A </tex>
 
!<tex> \large  A </tex>
 
|-
 
|-
!<math> \mathbf {\color{Red}\mbox{B}_\mathrm{0} , \mbox{B}_\mathrm{1} ... \mbox{B}_\mathrm{N}} </math>
+
!<tex> \mathbf {\mbox{B}_\mathrm{0} , \mbox{B}_\mathrm{1}, \dots, \mbox{B}_\mathrm{N}} </tex>
|'''0'''-ой '''1'''-ый ... '''n'''-ный биты второго слагаемого или вычитаемого.
+
|биты второго слагаемого (вычитаемого)
 
!<tex> \large B</tex>
 
!<tex> \large B</tex>
 
|-
 
|-
!<math> \mathbf {\color{Green}\mbox{S}_\mathrm{0} , \mbox{S}_\mathrm{1} ... \mbox{S}_\mathrm{N}} </math>
+
!<tex> \mathbf {\mbox{S}_\mathrm{0} , \mbox{S}_\mathrm{1}, \dots, \mbox{S}_\mathrm{N}} </tex>
|'''0'''-ой '''1'''-ый ... '''n'''-ный биты ответа.
+
|биты ответа.
 
!<tex> \large S = A \pm B</tex>
 
!<tex> \large S = A \pm B</tex>
 
|-
 
|-
!<math> \mathbf {\color{Blue}T} </math>
+
!<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>
 
|-
 
|-
!<math> \mathbf {\color{OliveGreen}0 , 1 ... N} </math>
+
!<tex> \mathbf {0 , 1, \dots,  N} </tex>
|[[Сумматор|блоки]] [[Каскадный сумматор|каскадного]] или [[Двоичный каскадный сумматор|двоичного каскадного]] сумматора
+
|полные сумматоры
 
|[[Файл:Full_Adder.png|250px|Блок сумматор]]
 
|[[Файл:Full_Adder.png|250px|Блок сумматор]]
|-
 
!<math> \mathbf {\color{Black}\mbox{C}_\mathrm{0}} </math>
 
|Изначально ненужный бит в сумматоре,
 
однако он [[Реализация вычитания сумматором#Оптимизация|полезен при вычитании]].
 
|
 
В последующих блоках
 
в бит переноса подаётся
 
старший разряд
 
предыдущего суммирования.
 
 
|}
 
|}
 
|[[Файл:Arithmometer_SUM_SUB.png|400px|Арифмометр]]
 
|[[Файл:Arithmometer_SUM_SUB.png|400px|Арифмометр]]
Строка 76: Строка 62:
 
*[[Реализация_булевой_функции_схемой_из_функциональных_элементов|Реализация булевой функции схемой из функциональных элементов]]
 
*[[Реализация_булевой_функции_схемой_из_функциональных_элементов|Реализация булевой функции схемой из функциональных элементов]]
  
==Ссылки==
+
==Источники информации==
 
*[http://en.wikipedia.org/wiki/Subtractor Subtractor]
 
*[http://en.wikipedia.org/wiki/Subtractor Subtractor]
 
*[http://www.play-hookey.com/digital/binary_subtraction.html Negative Numbers and Binary Subtraction]
 
*[http://www.play-hookey.com/digital/binary_subtraction.html Negative Numbers and Binary Subtraction]

Текущая версия на 19:07, 4 сентября 2022

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

Чтобы реализовать вычитание каскадным или двоичным каскадным сумматором, нужно сложить на нём уменьшаемое с противоположным по знаку вычитаемым, так же как и при вычитании обычных чисел. Тогда полученная сумма будет разностью данных чисел: [math] x - y = x + (-y)[/math].

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

Данное число нужно инвертировать и прибавить к нему единицу: [math] -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]

Оптимизация

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

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

Условные обозначения Изображение схемы
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 {\mbox{A}_\mathrm{0} , \mbox{A}_\mathrm{1}, \dots, \mbox{A}_\mathrm{N}} [/math] биты первого слагаемого (уменьшаемого) [math] \large A [/math]
[math] \mathbf {\mbox{B}_\mathrm{0} , \mbox{B}_\mathrm{1}, \dots, \mbox{B}_\mathrm{N}} [/math] биты второго слагаемого (вычитаемого) [math] \large B[/math]
[math] \mathbf {\mbox{S}_\mathrm{0} , \mbox{S}_\mathrm{1}, \dots, \mbox{S}_\mathrm{N}} [/math] биты ответа. [math] \large S = A \pm B[/math]
[math] \mathbf {T} [/math] бит, отвечающий за знак операции

T подключён к C0

0 если [math] \large S = A + B[/math]
1 если [math] \large S = A - B[/math]
[math] \mathbf {0 , 1, \dots, N} [/math] полные сумматоры Блок сумматор
Арифмометр

См. также

Источники информации