Aprenda › Tema 7
Somadores binários: meio somador, completo e em cascata
Leitura de 8 min · Equipe bitGateLab
Somar é a operação mais importante de um computador: com ela se subtrai, se multiplica, se calculam endereços de memória e se contam eventos. Aqui você vai construir um somador do zero: primeiro o meio somador de um bit, depois o somador completo, que aceita um carry (o "vai-um"), em seguida o somador de vários bits em cascata e, por fim, como o mesmo circuito subtrai usando complemento de 2.
Somar em binário à mão
As regras para somar dois bits são quatro: 0 + 0 = 0, 0 + 1 = 1, 1 + 0 = 1 e 1 + 1 = 102, ou seja, 0 com carry de 1 para a coluna seguinte. Se, além disso, chega um carry, 1 + 1 + 1 = 112: resultado 1 e carry 1. Como em decimal, soma-se coluna por coluna, da direita para a esquerda, passando o carry para a esquerda.
Meio somador
O meio somador soma dois bits, A e B, e entrega duas saídas: a soma S e o carry C.
| A | B | C | S |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 0 |
A coluna S é a tabela de uma XOR e a coluna C é a de uma AND. Portanto:
S = A ⊕ B C = AB
Ele se chama "meio" porque não tem entrada para o carry que vem de uma coluna anterior, de modo que só serve para o bit menos significativo.
Somador completo
O somador completo soma três bits: A, B e o carry de entrada Cin. Entrega a soma S e o carry de saída Cout. Repare que o par (Cout, S) é, em binário, a quantidade de uns presentes nas entradas.
| A | B | Cin | Cout | S |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 | 1 |
| 0 | 1 | 0 | 0 | 1 |
| 0 | 1 | 1 | 1 | 0 |
| 1 | 0 | 0 | 0 | 1 |
| 1 | 0 | 1 | 1 | 0 |
| 1 | 1 | 0 | 1 | 0 |
| 1 | 1 | 1 | 1 | 1 |
S vale 1 quando há uma quantidade ímpar de uns: S = Σm(1, 2, 4, 7) = A ⊕ B ⊕ Cin. Cout vale 1 quando há dois ou mais uns: Cout = Σm(3, 5, 6, 7), que, simplificada, é a função maioria:
Cout = AB + ACin + BCin
Se você tentar agrupar no mapa de Karnaugh de S, verá que nenhum 1 tem um vizinho com 1: é o padrão de tabuleiro de xadrez típico da XOR, que não se simplifica em soma de produtos.
Somador completo com dois meios somadores
Uma forma prática de montá-lo é encadear dois meios somadores e uma OR:
- Primeiro meio somador: P = A ⊕ B e G = AB.
- Segundo meio somador, com P e Cin: S = P ⊕ Cin e um carry parcial P·Cin.
- Cout = G + P·Cin = AB + (A ⊕ B)Cin.
Essa expressão é equivalente à da maioria: se A e B valem 1, AB já gera o carry; se exatamente um deles vale 1, o carry depende de Cin. G é chamado de sinal de geração e P, de sinal de propagação.
Somador com carry em cascata
Para somar números de n bits, conectam-se n somadores completos em fila: o Cout de cada estágio entra como Cin do seguinte. O Cin do primeiro estágio é colocado em 0, e o Cout do último é o carry final. Essa estrutura é chamada de somador com carry em cascata ou ripple carry, porque o carry "se propaga" de estágio em estágio como uma onda. Na família 74HC existe um chip que contém quatro somadores completos já conectados assim (o 74HC283).
Exemplo 1: 1011 + 0110 com um somador de 4 bits. Em decimal é 11 + 6.
| Estágio | Ai | Bi | Cin | Si | Cout |
|---|---|---|---|---|---|
| 0 | 1 | 0 | 0 | 1 | 0 |
| 1 | 1 | 1 | 0 | 0 | 1 |
| 2 | 0 | 1 | 1 | 0 | 1 |
| 3 | 1 | 0 | 1 | 0 | 1 |
Soma: S3S2S1S0 = 0001 com carry final 1, ou seja, 100012 = 17. Correto: 11 + 6 = 17, que não cabe em 4 bits, e por isso aparece o carry final.
O custo é o tempo. O estágio 3 não pode dar o seu resultado definitivo até receber o carry do estágio 2, que por sua vez espera o do estágio 1. Se cada estágio leva dois níveis de porta para produzir o seu carry, um somador de n bits leva da ordem de 2n atrasos de porta no pior caso. Para 64 bits isso é lento demais; por isso os processadores usam somadores com carry antecipado, que calculam os carries em paralelo a partir dos sinais G e P. No cronograma do simulador você pode ver como as saídas mudam passo a passo até se estabilizarem.
Subtrair com o mesmo somador
Como se explica em sistemas de numeração, em complemento de 2 o negativo de B é B + 1. Então:
A − B = A + B + 1
Para obter isso, basta colocar uma XOR em cada bit de B, com a outra entrada conectada a uma linha de controle M, e conectar M também ao Cin do primeiro estágio. Com M = 0 as XOR deixam B passar e Cin = 0: o circuito soma. Com M = 1 as XOR invertem B e Cin = 1 fornece o "+1": o circuito subtrai.
Exemplo 2: subtrações de 4 bits.
- 9 − 5: A = 1001, B = 0101, B = 1010. 1001 + 1010 + 1 = 1 0100. Descarta-se o carry final: 0100 = 4.
- 5 − 9: A = 0101, B = 1001, B = 0110. 0101 + 0110 + 1 = 0 1100. Sem carry final. 1100 em complemento de 2 vale −8 + 4 = −4.
Quando você subtrai números sem sinal, o carry final indica se houve empréstimo: 1 significa que A ≥ B e 0 significa que A < B.
Erros comuns
- Usar um meio somador nos estágios intermediários. Todo estágio que recebe um carry precisa de um somador completo.
- Deixar flutuando o Cin do primeiro estágio. Ele deve ir a 0 para somar, ou a M em um somador-subtrator.
- Confundir carry final com overflow. Em números com sinal, o carry final é descartado; o overflow é detectado com C3 ⊕ C4.
- Esquecer o "+1" ao subtrair e conectar apenas os inversores: o resultado sai uma unidade abaixo.
- Escrever S = A + B + Cin com OR. A soma de um bit é uma XOR, não uma OR.
Experimente no simulador
Montar um somador no editor é a melhor ponte entre as portas e a aritmética. Comece com um bit e vá crescendo até quatro.
- Coloque duas entradas, uma XOR e uma AND, e conecte-as como no diagrama do meio somador. Gere a tabela-verdade dele.
- Monte um somador completo com dois meios somadores e uma OR, e confira suas 8 linhas com a tabela deste artigo.
- Copie o somador completo quatro vezes e encadeie os carries. Coloque o primeiro Cin em 0.
- Mude as entradas para 1011 e 0110 e observe se a saída é 0001 com carry final 1.
- Abra o cronograma, mude uma entrada que obrigue o carry a percorrer os quatro estágios (por exemplo 1111 + 0001) e observe como as saídas se estabilizam.
Exercícios
- Calcule S e Cout de um somador completo com A = 1, B = 0, Cin = 1.
Resposta
Há dois uns: S = 0 e Cout = 1 (1 + 0 + 1 = 102).
- Some 0111 + 0101 com um somador de 4 bits e indique os carries de cada estágio.
Resposta
Estágio 0: 1 + 1 = 0, carry 1. Estágio 1: 1 + 0 + 1 = 0, carry 1. Estágio 2: 1 + 1 + 1 = 1, carry 1. Estágio 3: 0 + 0 + 1 = 1, carry 0. Resultado 1100 = 12 (7 + 5).
- Com um somador-subtrator de 4 bits, calcule 6 − 3 e escreva qual é o valor de M.
Resposta
M = 1. 0110 + 1100 + 1 = 1 0011. Descarta-se o carry: 0011 = 3.
- Interpretando como números com sinal de 4 bits, há overflow em 0111 + 0101?
Resposta
Sim. 7 + 5 = 12 não cabe na faixa de −8 a +7. O resultado 1100 seria lido como −4. Os carries são C3 = 1 e C4 = 0, e V = 1 ⊕ 0 = 1.