Circuitos Aritméticos Somadores Por Bruno Silva Guedes 1 - 159033 1. Introdução Circuitos aritméticos somadores são circuitos combinacionais básicos, cujo desenvolvimento ocorre desde os primórdios da informática. Neste trabalho, são analisados o funcionamento e o princípio de cinco circuitos básicos, desde os mais simples até os mais elaborados. Primeiramente, serão apresentados os elementos básicos presentes nestes circuitos (baseando-se em portas lógicas), como o full adder. Depois, um estudo detalhado será feito dos somadores Ripple Carry Adder (simples, envolve apenas uma soma simples como a que executamos com papel e caneta), o Carry Select Adder e o Carry Skip Adder, somadores mais elaborados que partem do princípio de dividir um problema para resolvê-lo mais rapidamente, e por fim o Parallel Prefix Adder e o Carry Look-Ahead, mais complexos, envolvendo conceitos de propagação e geração de carry, que também serão abordados. 2. Elementos básicos Iniciaremos a construção de circuitos aritméticos somadores com base nas portas lógicas básicas: AND, OR e NOT (representadas pelos símbolos da Figura 2.1). Vale ressaltar que todos os somadores aqui descritos são somadores de parcelas de 16 bits, ou seja, somam números em base 2 com 16 algarismos (que podem ser 0 ou 1) cada. O princípio de uma soma binária é exatamente o mesmo de uma soma decimal, como exemplificado na Figura 2.2. 1 1 1 0 1 1 1 0 + 1 0 1 1 1 1 0 0 1 Fig. 2.1 – (a) Porta AND de duas entradas, (b) porta OR de duas entradas e (c) porta NOT (inversora). A função AND possui saída 1 quando ambas as entradas possuem valor 1, caso contrário valor 0. A função OR possui saída 1 quando ao menos uma das entradas possui valor 1, caso contrário valor 0. Já a função NOT inverte o sinal de entrada, retornando 1 para uma entrada 0, e retornando 0 quando entra 1. Fig. 2.2 – Aqui temos a soma de 14 com 11 (representação decimal). Note que uma soma de um dígito 0 com um dígito 1 é sempre 1, e uma soma de dois dígitos 1 é 0 (com um “vai-um” para o bit seguinte). O “vai-um” é geralmente chamado de carry out, enquanto que o “vem-um” (o bit que está “chegando” para ser somado no próximo dígito) é o carry in. Vamos considerar a soma de um único par de bits (como na coluna da direita na figura 2.2). Temos quatro situações de soma, dependendo do primeiro bit e do segundo bit. Quando tivermos ambos os bits em 0, a soma será 0. Quando tivermos apenas um bit em 0, e o outro em 1, a soma será 1. E quando tivermos ambos os bits em 1, teremos a soma deles igual a 0 e um carry out igual a 1. As quatro situações estão representadas na Figura 2.3. Seria conveniente encontrar funções lógicas que, a partir das entradas A e B, derivassem as saídas Soma e C out , que nos interessam. A saída C out é claramente a função AND 1 Graduando em Engenharia de Computação Universidade Federal do Rio Grande do Sul E-mail: [email protected]
17
Embed
Circuitos Aritméticos Somadores - inf.ufrgs.brinf.ufrgs.br/~bsguedes/disc/3/inf01058/Circuitos%20Aritm%e9ticos.pdf · chamaremos de Full Adder (somador completo). Resolvendo mais
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Circuitos Aritméticos Somadores
Por Bruno Silva Guedes1 - 159033
1. Introdução
Circuitos aritméticos somadores são circuitos combinacionais básicos, cujo
desenvolvimento ocorre desde os primórdios da informática. Neste trabalho, são analisados o
funcionamento e o princípio de cinco circuitos básicos, desde os mais simples até os mais
elaborados.
Primeiramente, serão apresentados os elementos básicos presentes nestes circuitos
(baseando-se em portas lógicas), como o full adder. Depois, um estudo detalhado será feito
dos somadores Ripple Carry Adder (simples, envolve apenas uma soma simples como a que
executamos com papel e caneta), o Carry Select Adder e o Carry Skip Adder, somadores mais
elaborados que partem do princípio de dividir um problema para resolvê-lo mais rapidamente,
e por fim o Parallel Prefix Adder e o Carry Look-Ahead, mais complexos, envolvendo conceitos
de propagação e geração de carry, que também serão abordados.
2. Elementos básicos
Iniciaremos a construção de circuitos aritméticos somadores com base nas portas
lógicas básicas: AND, OR e NOT (representadas pelos símbolos da Figura 2.1). Vale ressaltar
que todos os somadores aqui descritos são somadores de parcelas de 16 bits, ou seja, somam
números em base 2 com 16 algarismos (que podem ser 0 ou 1) cada. O princípio de uma soma
binária é exatamente o mesmo de uma soma decimal, como exemplificado na Figura 2.2.
1 1 1 0 1 1 1 0 + 1 0 1 1
1 1 0 0 1
Fig. 2.1 – (a) Porta AND de duas entradas, (b) porta OR de duas entradas e (c) porta NOT (inversora). A função AND possui saída 1 quando ambas as entradas possuem valor 1, caso contrário valor 0. A função OR possui saída 1 quando ao menos uma das entradas possui valor 1, caso contrário valor 0. Já a função NOT inverte o sinal de entrada, retornando 1 para uma entrada 0, e retornando 0 quando entra 1.
Fig. 2.2 – Aqui temos a soma de 14 com 11 (representação decimal). Note que uma soma de um dígito 0 com um dígito 1 é sempre 1, e uma soma de dois dígitos 1 é 0 (com um “vai-um” para o bit seguinte). O “vai-um” é geralmente chamado de carry out, enquanto que o “vem-um” (o bit que está “chegando” para ser somado no próximo dígito) é o carry in.
Vamos considerar a soma de um único par de bits (como na coluna da direita na
figura 2.2). Temos quatro situações de soma, dependendo do primeiro bit e do segundo bit.
Quando tivermos ambos os bits em 0, a soma será 0. Quando tivermos apenas um bit em 0, e
o outro em 1, a soma será 1. E quando tivermos ambos os bits em 1, teremos a soma deles
igual a 0 e um carry out igual a 1. As quatro situações estão representadas na Figura 2.3.
Seria conveniente encontrar funções lógicas que, a partir das entradas A e B,
derivassem as saídas Soma e Cout, que nos interessam. A saída Cout é claramente a função AND
Fig. 2.5 – (a) Tabela verdade do Full Adder. A saída é um XOR das três entradas, enquanto o carry out é a soma dos produtos das entradas, duas a duas. (b) Full Adder em esquema de portas lógicas. Uma porta OR de três entradas é utilizada no cálculo do Cout.
O Full Adder será representado daqui em diante pelo símbolo da Figura 2.6.
Fig. 2.6 – Símbolo do Full Adder (bloco que executa as mesmas funções).
a b Soma Cout 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1
Fig. 2.3 – Chamando a primeira parcela de a e a segunda parcela de b, temos a soma e o carry-out conforme disposto acima.
Fig. 2.4 – Half Adder (meio somador). Soma dois bits e gera o carry desta soma.
O Carry Skip Adder usa uma abordagem semelhante à do Carry Select Adder: ele
procura dividir o problema em partes menores para juntar o resultado depois. A diferença
básica entre os dois, no entanto, reside no fato de o Carry Skip Adder não precisar de
multiplexadores na sua implementação, pois ele tenta “prever” o carry que chegará em cada
soma parcial do circuito.
Funcionamento. Neste exemplo de Carry Skip Adder de 16 bits, dividiremos a soma
em 4 somas menores de 4 bits. O que o Carry Skip Adder irá procurar são padrões que
garantem a geração de um carry out de valor 1 para a soma parcial seguinte. Caso haja um
jeito fácil de garantir a existência desse Cout em 1, poderemos economizar tempo em relação
ao atraso que a saída estará estabilizada e correta.
Na soma de dois números de 4 bits cada, sempre analisamos parcela por parcela.
Dizemos que um carry out foi gerado nessa soma caso tenhamos uma das duas situações: ou
os bits das casas mais significativas destes números são 1 (ambos), ou então um deles apenas
está em 1, porém recebeu na sua soma um carry in de valor 1. Esse carry in é o carry out do bit
imediatamente anterior, no qual faremos uma análise similar. Analisando recursivamente,
chegamos à seguinte conclusão: todos os pares, bit-a-bit, têm que possuir ao menos um bit 1
para transmitir um valor 1 de carry out no agrupamento todo. Além disso, é necessário que um
carry out no valor 1 chegue à este agrupamento (este sinal que será “propagado” pelos bits em
forma de carry).
Para fazer esta análise, utilizamos um circuito de detect como o da Figura 5.1(a). A
relação “ter que possuir ao menos um bit em 1” é dada pela porta OR.
(a)
(b)
Fig. 5.1 – (a) Circuito Detect, e (b) seu símbolo. Temos uma porta AND com seis entradas analisando a condição de propagação bit a bit (uma das entradas está fixada em valor lógico 1, já que uma porta de 5 entradas AND seria suficiente para este caso).
Este circuito apresenta alguns problemas de implementação que só serão resolvidos
nos dois somadores seguintes. Primeiro, nem sempre o detect detecta que realmente houve
um carry out igual a 1. Isso ocorre porque, por exemplo, poderíamos ter, na Figura 5.1(a), as
entradas i3 e j3 em 1, e todas as outras em 0 (incluindo Cin), que mesmo assim teríamos um
carry out gerado por esse trecho do circuito. Para estes casos, circuitos mais complexos
precisam ser elaborados para satisfazer casos distintos.
Pela análise feita no parágrafo acima, nota-se que não podemos garantir com certeza
que o carry out gerado pelo circuito de detect está correto. Assim, temos que fazer
O Parallel Prefix Adder (PPA) busca incrementar a implementação do Carry Skip
Adder em relação a “prever” os carries gerados por um par de bits anteriores que foi
propagado por uma cadeia de bits. Se houver uma maneira de saber qual é exatamente o carry
in de cada soma por dígito, então bastaria somar cada dígito da saída num simples full adder,
paralelamente, com um excelente ganho de tempo (claro, se a identificação dos carries in
corretos seja rápida). O PPA trabalha com os conceitos de Generate e Propagate, que serão
definidos como se segue:
Definição 6.1. (Carry Generate). Dizemos que um sinal de carry generate Gi (ou
simplesmente generate), é de valor lógico 1 se e somente se os i-ésimos bits das parcelas da
soma ai e bi possuem valor lógico 1 (em outras palavras, eles geram um carry out igual a 1
independentemente dos dígitos anteriores). Podemos simplesmente escrever Gi = ai . bi.
Definição 6.2. (Carry Propagate). Dizemos que um sinal de carry propagate Pi (ou
simplesmente propagate), é de valor lógico 1 se e somente se ao menos um bit das parcelas da
soma ai e bi possuem valor lógico 1 (em outras palavras, se um carry in igual a 1 é somado com
ai e bi, então esse carry in será propagado para o carry out desta soma). Podemos
simplesmente escrever Pi = ai + bi.
Note que, pela definição, Gi e Pi são sinais estritamente relacionados com os
correspondentes bits ai e bi das parcelas. Basta agora construir, com estes sinais Gi e Pi, alguma
maneira que faça valer a pena o seu uso para reduzir o tempo de uma soma.
Funcionamento. O PPA e o Carry Look-Ahead adotam a abordagem de analisar a
geração e a propagação de carries ao longo da soma. Ambos criam, para os n bits que cada
parcela possuem, os n sinais correspondentes de G e P. Estes sinais podem ser facilmente
obtidos por meio das fórmulas apresentadas nas Definições 6.1 e 6.2. De fato, criaremos um
símbolo gen_prop como o da Figura 6.1(a) que receberá 4 bits de cada vez das entradas e
gerará os 4 sinais de generate e propagate correspondentes, pelas definições 6.1 e 6.2. A
implementação para este bloco está na Figura 6.1(b).
(a)
(b)
Fig. 6.1 – (a) Símbolo do circuito gen_prop, e (b) a operação que ele executa. Neste artigo usaremos gen_prop que trabalha de quatro em quatro bits, pois este circuito será reaproveitado no Carry Look-Ahead.
O cérebro de um somador que utiliza os conceitos de propagate e generate está no
modo como ele interpreta estes sinais. No caso do PPA, teremos uma rede de unidades
Fig. 6.4 – (a) Árvore geradora dos generates e propagates em relação ao bit 0, e (b) seu símbolo.
Fig. 6.5 – “Cérebro” do somador Parallel Prefix Adder. Cada célula pg_ball é uma das células pretas que aparecem no esquema deste circuito na Figura 6.4(a), e estão implementadas na Figura 6.6(a).
(a)
(b)
Fig. 6.6 – (a) Implementação de pg_ball, e (b) seu símbolo, usado no circuito da Figura 6.5.
Falta apenas mais uma parte para concluir o PPA, e é a mais simples: utilizar estes
carries gerados no passo anterior e somá-los aos bits de entrada. Para isto, podemos utilizar
vários full adders trabalhando em paralelo, já que não haverá dependência de carries entre os
bits. Assim, temos, na Figura 6.7(a), um circuito que faz essa soma de 4 em 4, e seu símbolo.
(a)
(b)
Fig. 6.7 – (a) Implementação do circuito out_generate, e (b) o seu símbolo. Os carries out gerados pelos full adders deste circuito são ignorados, já que apenas precisamos dos bits de saída que são retornados imediatamente (agora já possuímos os carries in corretos). Já o carry out da soma toda será o C16 gerado pelo bloco ppa, o nosso “cérebro” da Figura 6.5. Ele não precisa ser calculado novamente.
A implementação final do PPA está exibida na Figura 6.8.
Fig. 6.8 – Somador Parallel Prefix Adder de 16 bits.
Fig. 7.2 – (a) Montagem da Carry Look Ahead Unit. Ela por si só é um somador de 4 bits, bastando apenas acrescentar uma saída para representar seu carry out. (b) Símbolo da unidade.
Para obter um CLA de 16 bits, basta usar quatro unidades como a da Figura 7.2
trabalhando em paralelo para gerar os pedaços da saída. Os carries in destas unidades serão
enviados por um bloco um grau acima na hierarquia do somador. Este bloco pode ser um
bloco Look Ahead como o da Figura 7.1, recebendo, como sinais de generate e propagate
aqueles gerados por cada uma das Look Ahead Units. O carry out da soma será o C4 gerado por
este último bloco.
A implementação do CLA de 16 bits está na Figura 7.3.