Você está na página 1de 20

Implementacao de somadores e subtratores

Instituto Metropole Digital - UFRN


Circutos Logicos
Hadley Magno da Costa Siqueira
hdhzero@gmail.com
3 de marco de 2015

Sum
ario
1 Representa
c
ao bin
aria dos n
umeros
1.1 Codificac
ao de n
umeros naturais .
1.2 Convers
ao entre natural e binario .
1.2.1 Natural para binario . . . .
1.2.2 Bin
ario para natural . . . .
1.3 Codificac
ao de n
umeros inteiros . .
1.3.1 Sinal de magnitude . . . . .
1.3.2 Complemento de um . . . .
1.3.3 Complemento de dois . . .

.
.
.
.
.
.
.
.

3
3
4
4
5
6
6
7
7

2 Circuito somador
2.1 Implementac
ao em VHDL . . . . . . . . . . . . . . . . . . . . . .
2.1.1 Implementac
ao de somador de 1 bit . . . . . . . . . . . .
2.1.2 Implementac
ao de somador de N bits . . . . . . . . . . . .

8
11
11
12

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

3 Circuito subtrator
13
3.1 Implementac
ao em VHDL . . . . . . . . . . . . . . . . . . . . . . 15
4 Circuito somador e subtrator
17
4.1 Implementac
ao em VHDL . . . . . . . . . . . . . . . . . . . . . . 19

O objetivo deste documento e apresentar os conceitos envolvidos na construc


ao de um somador para n
umeros binarios.

Representa
c
ao bin
aria dos n
umeros

Durante a vida aprendemos que existem diferentes tipos de n


umeros tais como:
naturais, inteiros, racionais, reais, complexos, etc. Cada um desses tipos tera
uma codificac
ao bin
aria diferente dos demais, de tal forma que cada tipo necessita de um circuito somador proprio.
Em C, um dos tipos mais usados e o tipo int e que representa n
umeros
inteiros, ou seja, n
umeros que podem ser positivos ou negativos e que nao contem
parte fracion
aria. Outro tipo em C bastante usado tambem e o unsigned, que
serve para representas n
umeros naturais. Esse tipo de n
umero pode representar
quantidades tais como: tamanho de vetores, tamanho de strings, quantidade de
bytes a serem alocados, etc.
Devido ao grande uso de n
umeros inteiros e naturais no cotidiano, o somador
que iremos projetar aqui ser
a destinado a operar u
nica e exclusivamente com
estes dois tipos de n
umeros. Porem, antes de projetar o somador, e necessario
decidir como ser
a a representacao binaria dos valores inteiros e naturais. Ou
seja, qual ser
a a codificac
ao ou mapeamento utilizados.

1.1

Codificac
ao de n
umeros naturais

Uma codificac
ao nada mais e do que um mapeamento entre uma cadeia de bits
e o valor ou objeto que queremos representar com tal cadeia. Aqui estamos interessados em codificar n
umeros naturais e a princpio o projetista pode escolher
qualquer codificac
ao que lhe seja conveniente para representar tais naturais.
Apesar dessa liberdade que o projetista tem para escolher como sera a codificac
ao, no decorrer da hist
oria da humanidade se percebeu que existem codificac
oes mais eficazes do que outras para representar certos tipos de valores. Um
desses valores s
ao os n
umeros naturais que possui uma codificacao eficaz pelos
seguintes motivo: existe relac
oes matematicas que relacionam o valor natural
com sua respectiva representacao em binario e vice-versa.
A codificac
ao de n
umeros naturais e, talvez, a mais simples de todo o mundo
da computac
ao. Ela consiste basicamente em fazer uma mapeamento de um
para um na contagem convencional e que pode ser verificada na tabela ??.
Natural
0
1
2
3
...

Binario
...00000000
...00000001
...00000010
...00000011
...

Tabela 1: Codificacao binario para natural

1.2

Convers
ao entre natural e bin
ario

A codificac
ao como apresentada na tabela ?? apresenta uma caracterstica interessante que e a possibilidade de usar matematica para fazer a conversao entre
o valor natural e seu respectivo binario e vice-versa. A conversao de valores naturais para bin
arios e feita usando divisoes ao passo que a conversao de binario
para natural e feita atraves de potencias, multiplicacoes e somas. Quando voce
digita um valor em C, por exemplo 20017, esse n
umero precisa ser convertido
para bin
ario a fim de ser armazenado na memoria e e esta conversao que aprenderemos agora.
1.2.1

Natural para bin


ario

A convers
ao de natural para binario consiste em dividir o valor a ser convertido
por 2. O resultado da divis
ao e novamente dividido por dois e o processo se
repete ate se chegar ao valor 0. A cada divisao deve-se armazenar os valores dos
restos obtidos e que servir
ao para montar o valor em binario.
Vamos converter alguns n
umeros para exemplificar o processo. Comecemos
pelo n
umero 12 cujas divis
oes sao mostradas na figura ??. A divisao acontece
sucessivamente ate que o quociente seja igual a zero, momento em que o processo
para. A cada divis
ao deve-se armazenar os restos e que devem ser concatenados
em ordem inversa para formar o valor em binario. Desta forma, o n
umero 12
na base bin
aria e 1100.

6 2
- 6 3
0

12 2
-12 6
0

3 2
- 2 1
1

1 2
- 0 0
1

Figura 1: Conversao natural para binario


Este processo pode ser montado de maneira mais agradavel de forma grafica
como apresentado na figura ??. A figura apresenta a conversao dos n
umeros 12
(1100), 15 (1111) e 137 (10001001).

12

15

137

68

34

17

Figura 2: Convers
oes dos n
umeros naturais 12, 15 e 137 para binario

1.2.2

Bin
ario para natural

A convers
ao de um valor bin
ario para seu respectivo natural e feito multiplicando cada bit do valor em bin
ario por uma potencia de dois e somando cada um
desses resultados intermedi
arios. Os expoentes comecam em 0 e sao incrementados de unidade em unidade. O expoente 0 fica mais `a direita enquanto que
o expoente de maior valor fica mais `a esquerda. Para exemplificar o processo,
vamos converter os valores 1100, 1111 e 10001001 que sao, respectivamente, 12,
15 e 137.
A convers
ao do valor bin
ario 1100 para natural se da por
1.23 + 1.22 + 0.21 + 0.20
8+4+0+0
12
Ou seja, cada bit foi multiplicado por uma potencia de dois. As conversoes
dos valores 1111 e 10001001 s
ao apresentadas a seguir
1.23 + 1.22 + 1.21 + 1.20
8+4+2+1
15
e, por u
ltimo
1.27 + 0.26 + 0.25 + 0.24 + 1.23 + 0.22 + 0.21 + 1.20
128 + 0 + 0 + 0 + 8 + 0 + 0 + 1
137
Um u
ltimo coment
ario importante que deve ser feito e com relacao `a quantidade de bits utilizadas para representar um valor. Nos exemplos anteriores
utilizamos quantos bits fora necessario para representar os valores naturais. Isso
n
ao ocorre na pr
atica, uma vez que fisicamente o chip nao aumenta ou diminui a
quantidade de bits. Voce provavelmente ja ouviu falar em processadores de 16,
32 ou 64 bits e quando se fala que um processador e de N bits estamos querendo
dizer que o processador em questao usa N bits para representar os valores.
Em um processador de 16 bits, por exemplo, os valores 12, 15 e 137 apresentados anteriormente seriam todos codificados com 16 bits, acrescentando-se
0s no incio para completar a quantidade de bits caso necessario. Ou seja, os
valores 12, 15 e 137 seriam representados como
O valor 12 como 0000000000001100
O valor 15 como 0000000000001111
E o valor 137 como 0000000010001001

1.3

Codificac
ao de n
umeros inteiros

A codificac
ao de n
umeros inteiros e um pouco mais complexa do que a codificac
ao dos n
umeros naturais. Exemplificaremos tres codificacoes: a de sinal de
magnitude, complemento de 1 e complemento de dois.
1.3.1

Sinal de magnitude

Esta codificac
ao e uma extensao da representacao dos n
umeros naturais. Ela
consiste em atribuir a um dos bits a funcao de sinal, onde esse bit costuma ser
o bit mais significativo do n
umero.
Todo valor que e representado com mais de um bit sempre possui dois bits

especiais conhecidos como bit mais significativo e bit menos significativo. E


comum usar as siglas em ingles para denotar esses bits, onde bit mais significativo possui a traduc
ao Most Significant Bit (MSB). Ja o bit menos significativo
possui traduc
ao de Least Significant Bit (LSB).
Os conceitos de bit mais significativo e menos significativo sao bem simples.
Para entender, observe a figura. Os bits mais significativos nada mais sao do
que aqueles que ocupam a posicao mais extrema do valor em binario, enquanto
que o bit menos significativo nada mais e do que o bit que ocupa a primeira
posic
ao no arranjo.
Sabendo o que e um bit MSB, podemos fazer a seguinte codificacao para
n
umeros inteiros: o bit MSB sera usado para representar o sinal do n
umero, ou
seja: positivo ou negativo. Os demais bits irao representar o valor natural em
si.
Como exemplo, considere a seguinte convencao para codificar em magnitude
de sinal usando um total de 8 bits
O bit mais significativo sera o de sinal
7 bits de valor
Positivo e representador por 0 e negativo por 1
Trata-se de uma representacao que usa 7 bits para representar o n
umero e
um bit a mais para representar o sinal, onde a convencao de sinal escolhida foi:
+ e 0 e - e 1.
Suponha que queremos representar os valores 8 e -10 no esquema proposto
acima. Primeiro e necess
ario representar os valores naturais 8 e 10 usando 7
bits. O n
umero 8 e codificado como 0001000 e o valor 10 como 0001010. Em
seguida devemos adicionar os sinais: + para o n
umero 8 e - para o n
umero 10.
Obtemos portanto os seguintes valores
00001000 (8)
10001010 (10)
Apesar de funcionar, a codificacao de n
umeros inteiros usando sinal de magnitude n
ao costuma ser usada na pratica pelos seguintes motivos:
N
ao e padronizada: cada fabricante pode escolher arbitrariamente a funcao
dos bits e assim ser incompativel com os demais.

Duplicac
ao do valor 0: existem os valores -0 e +0, porem na vida real so
existe o valor +0.
O primeiro item e de f
acil solucao: todos poderiam concordar em usar a
mesma codificac
ao. O segundo item porem e de difcil solucao e indesejavel: o
circuito somador agora precisa tratar casos que nao existem na vida real, onde
esses casos consistem em saber se esta se operando com +0 ou com -0.
1.3.2

Complemento de um

A codificac
ao de complemento tem como principal caraterstica a possibilidade
de se obter um hardware simplificado para a operacao com esses valores, porem
sofre do mesmo problema do sinal de magnitude: possuir dois zeros.
O complemento de um consiste basicamente em inverter os bits um a um,
onde a operac
ao de invers
ao pode ser feita usando portas NOT. Considere como
exemplo o valor 17 cuja codificacao em binario usando 8 bits e 00010001. Para
formar o valor -17 basta invertemos bit a bit, obtendo portanto 11101110.
Na codificac
ao complemento de um, o bit mais significativo representa o
sinal do valor: 0 indica positivo e 1 indica negativo. Como citado anteriormente,
esta codificac
ao tambem apresenta o problema de possuir dois zeros, ou seja:
00000000 (+0) tem seu respectivo negativo 11111111 (-0), fato que nao acontece
na vida real uma vez que n
ao existe -0.
1.3.3

Complemento de dois

O complemento de dois e a codificacao que iremos utilizar: ela nao permite


interpretac
oes ambguas como a magnitude de sinal (cada fabricante escolhendo
bits diferentes dos demais), n
ao possu o problema de ter dois zeros (um positivo
e outro negativo) e e largamente usado na ind
ustria por fabricantes como Intel,
Nvidia, ARM, etc.
O complemento de dois codifica n
umeros inteiros a partir dos n
umeros naturais usando uma interpretac
ao diferente. No complemento de dois, os n
umeros
que tem o MSB em 0 representam n
umeros positivos, enquanto que valores com
o MSB iguais a 1 representam n
umeros negativos. Uma outra caracterstica do
complemento de dois e o fato de existir um algortmo simples para a conversao
de um n
umero negativo para positivo e vice versa.
A convers
ao de inteiros para a representacao binaria em complemento de
dois se d
a da seguinte maneira: desconsidere o sinal e observe o valor. Faca a
convers
ao do valor inteiro como se ele fosse um n
umero natural, ou seja, aplique
as v
arias divis
oes necess
arias. Se o inteiro original e negativo, voce deve fazer
as seguintes etapas adicionais:
1. Inverter os bits da conversao
2. Adicionar 1.
Tomemos como exemplos os valores 12, 15 e 137 que foram convertidos em
sec
oes anteriores. Vamos supor estes valores codificados em binario usando
9 bits cada, portanto temos as seguintes codificacoes 000001100, 000001111 e
010001001, respectivamente. Observe que todos comecam com 0, uma vez que
o bit MSB igual `
a zero indica sinal positivo.

Agora suponha que queremos achar os valores -12, -15 e -137. Comecando
pelo valor 12 que e codificado como 000001100, o primeiro passo e fazer a invers
ao dos bits, ou seja, 000001100 se transforma em 111110011. O passo final
e fazer a soma em bin
ario entre 111110011 e 1, resultando em 111110011 + 1 =
111110100. Portanto, 12 na codificacao complemento de dois usando 9 bits e
000001100 e -12 e 111110100. Observando os bits mais significativos de ambos
os valores, podemos perceber que o valor 12 comeca com 0, indicando de fato
sinal positivo e que o valor 11110100 comeca com 1, indicando sinal negativo.
Como segundo exemplo vamos encontrar -15 na codificacao complemento de
dois. 15 e codificado como 000001111. Primeiro fazemos a inversao dos bits
obtendo 111110000 e somando com 1 obtemos 111110000 + 1 = 111110001. Ja
o valor 137, que possui codificacao 010001001, tem como valor negativo 137 =
101110111 = 101110110 + 1. Portanto, os valores -15 e -137 codificados usando
complemento de dois e 9 bits sao 111110001 e 101110111, respectivamente.
Nas sec
oes anteriores vimos que um dos problemas das codificacoes de magnitude de sinal e complemento de um era a duplicidade do valor zero. Isto nao
acontece em complemento de dois. Para verificarmos isto vamos tentar obter o
valor -0 a fim de verificar se o mesmo existe.
Primeiro vamos definir qual a quantidade de bits temos para representar o
valor zero. Suponhamos que seja 4 bits, entao o valor zero seria 0000. Para
obter -0 invertemos os bits e somamos mais um: 1111 + 1 = 10000. O resultado
10000 obtido possui cinco bits, entretanto sabemos que temos apenas 4 bits
para representar o resultado. Desconsiderando o bit MSB, ficamos com 0000
que e o valor inicial zero. Portanto, nao existe a possibilidade de existir -0 no
complemento de dois, uma vez que ao tentar se obter -0 o resultado extrapola
a quantidade de bits m
axima que temos para representar. Os bits restantes
acabam sendo todos 0s.
Uma desvantagem (que geralmente e insignificante na pratica) e que nem todos os valores possuem o respectivo positivo e negativo: existe um u
nico n
umero
alem do zero que n
ao possui seu respectivo negativo. Todavia, as vantagens da
codificac
ao complemento de dois superam e muito suas desvantagens, tornando
assim o padr
ao de codificac
ao mais usado na industria para representar n
umeros
inteiros. Dessa forma, construremos um somador para operar em n
umeros inteiros codificados em complemento de dois.

Circuito somador

Comecemos esta sec


ao relembrando como se faz somas com n
umeros naturais
onde a figura ?? apresenta a ideia geral. No item (a) e como costumamos fazer,
colocando um valor sobre o outro e realizando a soma diretamente. O item
(b) j
a apresenta um pouco mais do que realmente acontece, mostrando que na
verdade n
os adicionamos valores com a mesma quantidade de digitos, usando
zeros para completar quando necessario.
O item (c) apresenta um novo detalhe, que sao os vai um (que em ingles se
chama carry). O item (d) nos mostra que sempre existem carries e que as vezes
eles s
ao 0s e outras vezes s
ao 1s. O item (e) apresenta o fato de que a primeira
coluna possui sempre o primeiro carry igual a zero. O u
ltimo item (f) apresenta
todos os detalhes, no qual os valores em preto sao o resultado da soma e os em
vermelho s
ao os carries gerados, ou seja, os vai um.

74205
+
197
-----------74402
(a)

74205
+ 00197
-----------74402
(b)

11
74205
+ 00197
-----------74402

0011
74205
+ 00197
-----------74402

00110
74205
+ 00197
-----------74402

(d)

(c)

(e)

0
0
1
1
0
7
4
2
0
5
+0
0
1
9
7
--------------------------------07 04 04 10 12
(f)
Figura 3: Soma feita manualmente
O circuito que queremos implementar e baseado no comportamento apresentado na figura ??. O que esta figura mostra e que em cada coluna de digitos se
faz a soma de tres valores: o vai um da coluna anterior e os dois digitos atuais
dos n
umeros. A adic
ao produz dois valores que sao o dgito da soma em si e o
vai um que servir
a para a pr
oxima coluna.
O circuito na figura ?? apresenta o diagrama de blocos do circuito que queremos desenvolver. Ele possui tres entradas A, B e Ci, cada uma de um bit. As
entradas A e B representam os digitos da coluna atual ao passo que a entrada
Ci representa o carry vindo da coluna anterior.
As sadas S e Co tambem s
ao de um bit cada e representam, respectivamente,
o digito da soma para a coluna atual e o carry a ser usado na proxima coluna.
Este circuito ser
a concatenado com varios outros do mesmo tipo, formando
assim um somador completo. Esta ideia pode ser visualizada na figura ??, na
qual pode-se perceber a sada Co da coluna anterior sendo ligada `a entrada Ci
da coluna atual.

AB
Co
Ci

S
Figura 4: Circuito para realizar a soma de uma coluna

Ci

A B Ci
Co

Co

S
Figura 5: Varios somadores de 1 bit
Dessa forma, um somador de 8 bits, por exemplo, poderia ser formado concatenando 8 somadores de 1 bit como apresentado na figura ?? e a mesma logica
se segue para somadores com mais ou com menos bits.

Figura 6: Um somador de 8 bits


Precisamos construir a tabela verdade do circuito somador de uma coluna. A
l
ogica consiste em simplesmente realizar a adicao dos bits. A tabela ?? apresenta
a l
ogica da soma, tendo como entradas as variaveis A, B e Ci e as sadas S e Co
como discutido anteriormente. A linha de entrada 110, por exemplo, tem sada
10 uma vez que 1 + 1 + 0 = 2(10). Ja a linha 001 tem sada 1, uma vez que
0 + 0 + 1 = 1(01). Por fim, a linha 111 tem sada 11 porque 1 + 1 + 1 = 3(11).
De posse da tabela verdade, e possvel extrair as equacoes para as sadas Co
e S usando soma de produtos como apresentado abaixo

Co = ABC
i + ABCi + AB Ci + ABCi
i + AB
Ci + AB
Ci + ABCi
S = ABC
A equac
ao para Co pode ser simplificada atraves de mapa de Karnaugh ou
algebra booleana obtendo-se

Co = ABC
i + ABCi + AB Ci + ABCi
i + AB Ci
Co = (A + A)BCi + ABC
i + AB Ci
Co = BCi + ABC
i + B Ci )
Co = BCi + A(BC

10

A
0
0
0
0
1
1
1
1

B
0
0
1
1
0
0
1
1

Ci
0
1
0
1
0
1
0
1

Co
0
0
0
1
0
1
1
1

S
0
1
1
0
1
0
0
1

Tabela 2: Tabela verdade para somador de 1 bit


Co = BCi + ACi + AB
Co = BCi + A(Ci + B)
A equac
ao para S n
ao tem simplificacao atraves de mapa de Karnaugh, mas
podemos simplificar atraves de teoremas booleanos
i + AB
Ci + AB
Ci + ABCi
S = ABC
BC
i + B Ci ) + A(B
Ci + BCi )
S = A(

2.1

Implementac
ao em VHDL

Esta sec
ao do documento apresenta a codificacao em VHDL da teoria apresentada em sec
oes anteriores. Primeiro e apresentado o somador para realizar a
soma de dois bits e em seguida a implementacao de um somador para valores
de 4 bits.
2.1.1

Implementa
c
ao de somador de 1 bit

Do apresentado nas sec


oes anteriores, a implementacao se torna direta. O primeiro passo consiste em implementar o circuito responsavel por calcular a soma
para uma u
nica coluna. Esse circuito tera como entrada dois bits A e B representando os bits a serem somados, alem do bit Ci representando o vai um de
entrada.
As sadas do circuito s
ao o resultado da soma em si e o vai um da proxima
coluna que aqui ser
a nomeado de Co. A implementacao do circuito segue abaixo.
library i e e e ;
use i e e e . s t d l o g i c 1 1 6 4 . a l l ;
entity s o m a d o r 1 b i t i s
port (
A : in s t d l o g i c ;
B : in s t d l o g i c ;
Ci : in s t d l o g i c ;
S : out s t d l o g i c ;
Co : out s t d l o g i c
11

);
end s o m a d o r 1 b i t ;
architecture s o m a d o r 1 b i t of s o m a d o r 1 b i t i s
begin
S <= ( ( not A) and ( ( not B and Ci ) or (B and not Ci ) ) ) or
(A and ( ( not B and not Ci ) or (B and Ci ) ) ) ;
Co <= (A and ( Ci or B) ) or
(B and Ci ) ;
end s o m a d o r 1 b i t ;
2.1.2

Implementa
c
ao de somador de N bits

A implementac
ao de um somador de N bits consiste em agrupar varios somadores de 1 bit, onde cada um ficara responsavel por uma coluna. Para criar
as inst
ancias de cada somador de 1 bit usaremos o comando port map da linguagem VHDL. Exemplificaremos o conceito mostrando a construcao de um
somador para valores de 4 bits. Somadores com mais ou com menos bits seguem a mesma l
ogica.
O circuito apresentado abaixo possui duas entradas X e Y de 4 bits cada
uma. A sada Z tambem possui quatro bits e assim o circuito realizara a soma
Z = X + Y. Atenc
ao especial deve ser dada para o primeiro e u
ltimo port
map. O primeiro port map tem Ci = 0 e o u
ltimo port map tem Co = open,
onde esta sintaxe usando open indica que nao estamos conectando a sada Co
a lugar algum. Nos documentos referentes `a comparadores vamos perceber
que esta sada ser
a usada para implementar comparacoes. Por hora apenas a
ignoraremos deixando, portanto, em open.
library i e e e ;
use i e e e . s t d l o g i c 1 1 6 4 . a l l ;
entity s o m a d o r 4 b i t s i s
port (
X : in s t d l o g i c v e c t o r ( 3 downto 0 ) ;
Y : in s t d l o g i c v e c t o r ( 3 downto 0 ) ;
Z : out s t d l o g i c v e c t o r ( 3 downto 0 )
);
end s o m a d o r 4 b i t s ;
architecture s o m a d o r 4 b i t s of s o m a d o r 4 b i t s i s
s i g n a l vai um : s t d l o g i c v e c t o r ( 2 downto 0 ) ;
begin
S0 : entity work . s o m a d o r 1 b i t
port map (
A => X( 0 ) ,
B => Y( 0 ) ,
Ci => 0 ,
S => Z ( 0 ) ,
Co => vai um ( 0 )
12

);
S1 : entity work . s o m a d o r 1 b i t
port map (
A => X( 1 ) ,
B => Y( 1 ) ,
Ci => vai um ( 0 ) ,
S => Z ( 1 ) ,
Co => vai um ( 1 )
);
S2 : entity work . s o m a d o r 1 b i t
port map (
A => X( 2 ) ,
B => Y( 2 ) ,
Ci => vai um ( 1 ) ,
S => Z ( 2 ) ,
Co => vai um ( 2 )
);
S3 : entity work . s o m a d o r 1 b i t
port map (
A => X( 3 ) ,
B => Y( 3 ) ,
Ci => vai um ( 2 ) ,
S => Z ( 3 ) ,
Co => open
);
end s o m a d o r 4 b i t s ;

Circuito subtrator

O circuito para fazer operac


oes de subtracao e baseado em leves modificacoes
no circuito somador. A subtracao se baseia na seguinte ideia: sabe-se que fazer
A B e o mesmo que fazer A + (B), ou seja, a subtracao consiste em fazer
a soma de um n
umero positivo com um n
umero negativo. O problema agora
reside em como achar o valor B em complemento de dois e que e de facil
soluc
ao, uma vez que em sec
oes anteriores nos aprendemos como converter um
n
umero positivo em seu respectivo negativo.
Relembrando as etapas
1. Dado um valor B, inverta os seus bits. Chame o resultado da inversao de

B
para obter o negativo de B.
2. Adicione 1 `
aB
Ou seja, para obter o negativo de um n
umero em complemento de dois basta
+ 1. Precisamos entao fazer duas
executar os passos acima, ou seja, B = B
operac
oes: inverter os bits de B e somar com 1.

13

A invers
ao dos bits de B e trivial, sendo necessario apenas colocar uma porta
inversora em cada bit de B. Ja fazer a soma com 1 requer um pouco mais de
criatividade.
O leitor poderia ingenuamente pensar na seguinte estrategia: usar dois somadores como apresentado no esquema da figura ??. Um primeiro somador
realiza a soma entre B negado e 1, obtendo portanto -B. O segundo somador
realiza a soma entre o recem produzido -B e A implementando assim A - B.

B 1

+
+
Figura 7: Um possvel implementacao de um subtrator
Esse circuito de fato funciona, porem tem o inconveniente de necessitar de
dois somadores. Existe uma forma mais eficaz de implementar a soma com o
valor 1 que e utilizar o primeiro vai um do somador. A logica e a seguinte: em
uma soma o primeiro vai um e forcado para o valor 0, uma vez que e a primeira
coluna da soma e, portanto, n
ao existe vai um anterior. Entretanto, esse vai um
que geralmente e inutilizado contem toda a logica necessaria para fazer a adicao
com 1, ou seja, se trocarmos o valor fixo 0 no primeiro vai um para o valor fixo
em 1, estaremos automaticamente somando com 1.
Dessa forma, para implementar um subtrator a partir de um somador basta
inverter os bits de B e colocar o primeiro vai um em 1 e assim se implementa
+ 1 que e equivalente `
B
a B. A figura ?? apresenta a arquitetura do somador
modificado para implementar a subtracao. Note a inversao nas portas B e o
primeiro carry setado em 1.
X3 Y 3

X1 Y 1

X2 Y 2

X0 Y 0

'1'
Z3

Z2

Z1

Z0

Figura 8: Implementacao de um subtrator

14

3.1

Implementac
ao em VHDL

A implementac
ao n
ao requer muitas modificacoes aos circuitos somadores implementados ate o momento. O circuito somador1bit nao necessita de modificacoes
e as modificac
oes ocorrem apenas no somador4bits e consistem em
Inverter os bits de B
Colocar o primeiro carry em 1 ao inves de 0.
Basicamente, e necess
ario criar um novo arquivo chamado subtrator4bits.vhd,
copiar e colar o conte
udo do somador4bits e fazer as modificacoes necessarias.
Para inverter os bits de B criamos um signal chamado B invertido que recebe a
negac
ao de B. A sintaxe para tal e
B_invertido <= not B;
Como B e um vetor, o operador not trabalha bit a bit. Em outras palavras,
o comando acima e equivalente a fazer
B_invertido(0)
B_invertido(1)
B_invertido(2)
B_invertido(3)

<=
<=
<=
<=

not
not
not
not

B(0);
B(1);
B(2);
B(3);

J
a para fazer o primeiro vai um receber 1 ao inves de 0, basta modificar o
port map referente ao bit menos significativo da soma. O codigo e apresentado
a seguir.
S0 : entity work . s o m a d o r 1 b i t
port map (
A => X( 0 ) ,
B => Y i n v e r t i d o ( 0 ) ,
Ci => 1 , m o d i f i c a de 0 para 1
S => Z ( 0 ) ,
Co => vai um ( 0 )
);
O c
odigo completo encontra-se a seguir. Tente identificar no codigo o momento onde se faz a invers
ao dos bits de B e onde se coloca o primeiro vai um
para ser 1.
library i e e e ;
use i e e e . s t d l o g i c 1 1 6 4 . a l l ;
entity s u b t r a t o r 4 b i t s i s
port (
X : in s t d l o g i c v e c t o r ( 3 downto 0 ) ;
Y : in s t d l o g i c v e c t o r ( 3 downto 0 ) ;
Z : out s t d l o g i c v e c t o r ( 3 downto 0 )
);
end s u b t r a t o r 4 b i t s ;

15

architecture s u b t r a t o r 4 b i t s of s u b t r a t o r 4 b i t s i s
s i g n a l vai um : s t d l o g i c v e c t o r ( 2 downto 0 ) ;
s i g n a l Y i n v e r t i d o : s t d l o g i c v e c t o r ( 3 downto 0 ) ;
begin
Y i n v e r t i d o <= not Y;
S0 : entity work . s o m a d o r 1 b i t
port map (
A => X( 0 ) ,
B => Y i n v e r t i d o ( 0 ) ,
Ci => 1 , m o d i f i c a de 0 para 1
S => Z ( 0 ) ,
Co => vai um ( 0 )
);
S1 : entity work . s o m a d o r 1 b i t
port map (
A => X( 1 ) ,
B => Y i n v e r t i d o ( 1 ) ,
Ci => vai um ( 0 ) ,
S => Z ( 1 ) ,
Co => vai um ( 1 )
);
S2 : entity work . s o m a d o r 1 b i t
port map (
A => X( 2 ) ,
B => Y i n v e r t i d o ( 2 ) ,
Ci => vai um ( 1 ) ,
S => Z ( 2 ) ,
Co => vai um ( 2 )
);
S3 : entity work . s o m a d o r 1 b i t
port map (
A => X( 3 ) ,
B => Y i n v e r t i d o ( 3 ) ,
Ci => vai um ( 2 ) ,
S => Z ( 3 ) ,
Co => open
);
end s u b t r a t o r 4 b i t s ;

16

Circuito somador e subtrator

Voce deve ter percebido que o circuito somador e subtrator sao muito parecidos.
O n
ucleo de ambos s
ao identicos e as diferencas se resumem ao valor de B (se
e invertido ou n
ao) e ao valor do primeiro vai um (se e 0 ou 1). Podemos nos
aproveitar disso para criar um circuito capaz tanto de somar como de subtrair.
A ideia e criar uma entrada chamada soma subtrai. Se soma subtrai = 0 entao
ser
a feito uma adic
ao e se soma subtrai = 1 sera feita uma subtracao.
Os valores de B e do primeiro carry serao em funcao dessa entrada soma subtrai.
A tabela ?? apresenta a l
ogica do problema e contem tres entradas: S, B e V e
que s
ao, respectivamente soma subtrai, B e o primeiro carry. As sadas sao Bf
e V f que representam os valores finais de B e do primeiro vai um.
S
0
0
0
0
1
1
1
1

B
0
0
1
1
0
0
1
1

V
0
1
0
1
0
1
0
1

Bf
0
0
1
1
1
1
0
0

Vf
0
0
0
0
1
1
1
1

Tabela 3: Tabela verdade para somador/subtrator


Construindo o mapa de Karnaugh para as expressoes obtemos as seguintes
simplificac
oes.
BV
00

01

11

10

BV
00

01

11

10

A equac
ao para Vf e obtida dos mintermos correspondentes `a 100, 101, 111
e 110 que simplificando se obtem V f = S. Ja a equacao para Bf e extrada a
e SB,

partir dos agrupamentos 100 e 101 e; 011 e 010, que corresponde `a S B

resultando portanto em Bf = S B + SB.


As equac
oes obtidas s
ao, portanto

17

Vf = S
+ SB

Bf = S B
O circuito apresentado na figura ?? e um dos principais motivos para se
trabalhar com valores codificados em complemento de dois: o mesmo circuito
serve para realizar adic
oes e subtracoes tanto de n
umeros naturais como de
n
umeros inteiros e n
ao h
a casos especiais a serem tratados.
Y3

X3

Y3

X2

Y3

X1

Y3

X0
soma_subtrai

Z3

Z2

Z1

Z0

Figura 9: Implementacao de um somador/subtrator

18

4.1

Implementac
ao em VHDL

Mais uma vez n


ao ser
a necess
ario modficar o somador1bit. Comecamos criando
um novo arquivo chamado somador subtrator que possui a entidade apresentada
a seguir. Alem das entradas e sadas convencionais A, B e C, tambem foi
adicionada a entrada soma subtrai.
entity s o m a d o r s u b t r a t o r 4 b i t s i s
port (
s o m a s u b t r a i : in s t d l o g i c ;
X : in s t d l o g i c v e c t o r ( 3 downto 0 ) ;
Y : in s t d l o g i c v e c t o r ( 3 downto 0 ) ;
Z : out s t d l o g i c v e c t o r ( 3 downto 0 )
);
end s o m a d o r s u b t r a t o r 4 b i t s ;
A equac
ao extrada para Bf deve ser aplicada a cada bit de B e e apresentada
a seguir
Yf ( 0 )
Yf ( 1 )
Yf ( 2 )
Yf ( 3 )

<=
<=
<=
<=

( soma
( soma
( soma
( soma

subtrai
subtrai
subtrai
subtrai

and
and
and
and

not
not
not
not

Y( 0 ) )
Y( 1 ) )
Y( 2 ) )
Y( 3 ) )

or
or
or
or

( not
( not
( not
( not

soma
soma
soma
soma

subtrai
subtrai
subtrai
subtrai

and
and
and
and

O port map para o primeiro bit da adicao/subtracao fica como a seguir


S0 : entity work . s o m a d o r 1 b i t
port map (
A => X( 0 ) ,
B => Yf ( 0 ) ,
Ci => Vf ,
S => Z ( 0 ) ,
Co => vai um ( 0 )
);
O circuito completo e apresento a seguir
library i e e e ;
use i e e e . s t d l o g i c 1 1 6 4 . a l l ;
entity s o m a d o r s u b t r a t o r 4 b i t s i s
port (
s o m a s u b t r a i : in s t d l o g i c ;
X : in s t d l o g i c v e c t o r ( 3 downto 0 ) ;
Y : in s t d l o g i c v e c t o r ( 3 downto 0 ) ;
Z : out s t d l o g i c v e c t o r ( 3 downto 0 )
);
end s o m a d o r s u b t r a t o r 4 b i t s ;
architecture s o m a d o r s u b t r a t o r 4 b i t s of s o m a d o r s u b t r a t o r 4 b i t s i s
s i g n a l vai um : s t d l o g i c v e c t o r ( 2 downto 0 ) ;
s i g n a l Yf : s t d l o g i c v e c t o r ( 3 downto 0 ) ;
s i g n a l Vf : s t d l o g i c ;
begin
19

Y( 0 ) ) ;
Y( 1 ) ) ;
Y( 2 ) ) ;
Y( 3 ) ) ;

Yf ( 0 )
Yf ( 1 )
Yf ( 2 )
Yf ( 3 )

<=
<=
<=
<=

( soma
( soma
( soma
( soma

subtrai
subtrai
subtrai
subtrai

and
and
and
and

not
not
not
not

Vf <= s o m a s u b t r a i ;
S0 : entity work . s o m a d o r 1 b i t
port map (
A => X( 0 ) ,
B => Yf ( 0 ) ,
Ci => Vf ,
S => Z ( 0 ) ,
Co => vai um ( 0 )
);
S1 : entity work . s o m a d o r 1 b i t
port map (
A => X( 1 ) ,
B => Yf ( 1 ) ,
Ci => vai um ( 0 ) ,
S => Z ( 1 ) ,
Co => vai um ( 1 )
);
S2 : entity work . s o m a d o r 1 b i t
port map (
A => X( 2 ) ,
B => Yf ( 2 ) ,
Ci => vai um ( 1 ) ,
S => Z ( 2 ) ,
Co => vai um ( 2 )
);
S3 : entity work . s o m a d o r 1 b i t
port map (
A => X( 3 ) ,
B => Yf ( 3 ) ,
Ci => vai um ( 2 ) ,
S => Z ( 3 ) ,
Co => open
);
end s o m a d o r s u b t r a t o r 4 b i t s ;

20

Y( 0 ) )
Y( 1 ) )
Y( 2 ) )
Y( 3 ) )

or
or
or
or

( not
( not
( not
( not

soma
soma
soma
soma

subtrai
subtrai
subtrai
subtrai

and
and
and
and

Y( 0 ) ) ;
Y( 1 ) ) ;
Y( 2 ) ) ;
Y( 3 ) ) ;