Computadores XII: Aprendendo a Somar A4 – Texto 3 http://www.bpiropo.com.br/fpc20051017.htm Sítio Fórum PCs /Colunas Coluna: B. Piropo – Publicada em 17/10/2005 Autor: B.Piropo Na coluna anterior, < http://www.forumpcs.com.br/viewtopic.php?t=131250 > “Diagramas Lógicos”, discutimos a simbologia gráfica e algébrica usada para representar as operações lógicas, uma ferramenta essencial para que possamos analisar circuitos digitais. Agora que dispomos dela, poderemos usá-la para facilitar nossa jornada pelos caminhos da organização interna dos computadores. Então vamos adiante. Hoje em dia, por quaisquer dez mérreis compra-se em um camelô uma máquina de calcular eletrônica capaz de efetuar as quatro operações elementares, raiz quadrada, elevar ao quadrado, calcular porcentagem e, de lambuja, oferece ainda uma memória para armazenar resultados. As primeiras, lançadas há cerca de trinta anos, faziam mais ou menos a mesma coisa e custavam quase mil dólares americanos. Você já pensou em como é que uma maquineta daquelas consegue “fazer contas”? Como, usando apenas circuitos eletrônicos contendo portas lógicas, é possível efetuar cálculos? Que mistério é esse? Mistério nenhum. Na verdade é uma singela combinação de circuitos que resulta nesse aparente milagre tecnológico. Uma combinação que se baseia nos circuitos “somadores”, ou seja, que fazem somas. Como a multiplicação é uma sucessão de somas, tendo-se um circuito que some, fica fácil desenvolver um que multiplique. Ou que subtraia, já que a subtração é uma soma “ao contrário”. Ou que divida, já que a divisão é o oposto da multiplicação. E assim por diante. Então, se conseguirmos desenvolver um circuito que seja capaz de somar usando portas lógicas, teremos a chave da questão. Mas para entendermos um circuito capaz de somar precisamos, primeiro, aprender a somar. Como? O nobre leitor ou briosa leitora já sabe somar desde criança? Ótimo. Então faça a seguinte soma: (1001 + 0101) onde ambas as parcelas estão representadas em binário (ou seja, no sistema numérico posicional de base dois). Ah, em binário é mais difícil? Pois é justamente isso que eu queria dizer com “aprender a somar” (não vale converter as parcelas para decimal, somá-las, e depois converter a soma para binário; o resultado, evidentemente, é o mesmo, mas seria ininteligível para um computador). Para entender como computadores somam, precisamos somar em binário. Então mãos à obra (os que já sabem alguma aritmética binária podem saltar este trecho e seguir diretamente para a descrição dos circuitos somadores). Na verdade, a primeira impressão é enganosa. Pois somar em binário é MUITO mais fácil que em decimal. E se você acha que estou exagerando é apenas porque está acostumado a somar em decimal desde criancinha. Porque um raciocínio elementar prova que tenho razão: como o sistema binário usa apenas dois algarismos, o “zero” e o “um”, só existem quatro combinações possíveis (além do “vai um” que veremos adiante): (0 + 0), (0 + 1), (1 + 0) e (1 + 1). Essa é toda a “taboada de somar” dos números binários (se é que ainda existe a velha “taboada” que fui obrigado a decorar no curso primário). A soma (zero mais zero) dará sempre zero, seja qual for a base. Assim como, em toda base, somar (zero mais um) ou (um mais zero) dará sempre um. O problema começa quando somamos, em binário, (um mais um). Porque (1 + 1 = 2) e em binário não há algarismo para representar dois. Na verdade, em nenhum sistema numérico posicional existe um algarismo para representar a base. Então, como representaremos “dois” em binário? Ora, do mesmo jeito que representamos a base em qualquer sistema numérico posicional: movendo o “um” uma “casa” para a esquerda e acrescentando um “zero’ à sua direita. Em decimal, isso dá “10” que vale dez. Mas notou que o “10” está entre aspas? Isso porque ele só representa “dez” em decimal. Na base oito, “10” representa oito, o valor da base. Na base dezesseis, “10” representa dezesseis; na base vinte, “10” representa vinte e assim por diante. Portanto, na base dois, “10” só pode representar dois. Logo, em binário: (1 + 1 = 10). E resista à tentação de ler isso que está entre parênteses como “um mais um é igual a dez”. Não é. Lembre-se que tudo ali está em binário, portanto deve ser lido “um mais um é igual a dois”, como em qualquer outra base. Afinal, se tem uma coisa que sabemos desde criancinha é que um mais um é igual a dois. Então, somando parcelas algarismo a algarismo (ou bit a bit, já que um bit é justamente um “binary digit”, ou algarismo binário), sempre na mesma coluna ou “casa”, a coisa fica como mostrado na Figura 1: Figura 1: Soma de dígitos binários (bits) Mas que diabos significa esse “Vai 1”? Ora, a mesma coisa que na soma de decimais. Quando a soma de dois algarismos que estão na mesma posição (ou “casa”) decimal resulta em um valor igual ou superior à base (no caso, dez), colocamos no resultado o que “sobra” de dez e somamos uma unidade à posição imediatamente superior. Veja um exemplo na Figura 2. Figura 2: Soma na base dez O algoritmo para somar números expressos em sistemas numéricos posicionais é sempre o mesmo: coloca-se os números um acima do outro, alinhados pela direita, ou seja, com as posições correspondentes aos algarismos menos significativos de cada parcela diretamente acima uma da outra e soma-se os algarismos, “casa” a “casa”, ou seja, coluna a coluna, da direita para a esquerda. Sempre que a soma de dois algarismos ultrapassar o valor da base (dez, no caso do exemplo da Figura 2), anota-se na soma o valor do resto e soma-se uma unidade à casa vizinha da esquerda (o popular “vai um”). Antes de prosseguir, um lembrete importante: acostumemo-nos a numerar as posições, ou “casas” da direita para a esquerda a partir de zero. A posição de ordem 0 é a da extremidade direita, correspondente ao algarismo menos significativo. Portanto a de ordem 1 é a segunda a partir da direita e assim por diante. Agora, voltemos ao assunto do “Vai 1”. No exemplo da Figura 2 ele ocorreu na casa de ordem 1, onde (7 + 8 = 15; resto 5), na de ordem 3, onde (6 + 4 = 10; resto zero) e na de ordem 5 (8 + 4 = 12; resto 2). Note que o último “vai um”, o da casa de ordem mais alta, a de ordem 5, foi simplesmente acrescentado à esquerda da soma, já que não havia nada com que somá-lo na casa de ordem 6. Agora, apliquemos o mesmo algoritmo para somas em binário, ou seja, na base dois. Veja dois exemplos na Figura 3, o da esquerda mais simples, o da direita um pouco mais complicado (já veremos o porquê dessa complicação). Figura 3: Soma na base dois Examine primeiro a soma da esquerda, (1001 + 0101 = 1110). Note que o algoritmo é o mesmo usado para a soma em decimal: soma-se os dois algarismos (no caso, os dois “bits”, ou dígitos binários, já que os números são expressos em binário) em cada “casa” ou coluna da mesma ordem a partir da direita, ou seja, começando pela coluna de ordem zero, correspondente ao algarismo menos significativo. Note que na coluna de ordem 0 do exemplo da esquerda temos (1 + 1 = 0; Vai 1), pois a soma “um mais um” é igual a dois e dois é a base. Esse “um” que “vai” é somado com os dois zeros da casa de ordem 1 (a segunda a partir da esquerda), ficando: (“Vem 1” + 0 + 0 = 1). Continue repetindo o algoritmo, coluna a coluna, e veja o resultado se formar. Agora repare na soma do exemplo da direita. O “complicador” está na coluna de ordem 1, a segunda a partir da esquerda. Ela representa a soma de (1 + 1) à qual se deve acrescentar uma unidade devido ao “Vai 1” da coluna de ordem zero. Então, proceda assim: primeiro, some o “Vem 1” com o primeiro bit 1 e chegue ao resultado parcial (“Vem 1” + 1 = 0; Vai um). Pegue esse um do “Vai 1” e passe para cima da coluna de ordem 2. Agora, some o “0” do resultado parcial com o segundo bit 1, o que resulta em (0 + 1 = 1). Escreva esse “um” no resultado e prossiga. Parece complicado, mas se você treinar um pouco verá que é de uma simplicidade franciscana. Para quem, como você, acostumou-se a somar números expressos na base dez, somar na base dois é moleza. Agora, que já sabemos somar, vamos aos circuitos somadores. A primeira coisa que temos que considerar é que a coluna mais fácil de somar é a coluna (ou “casa”) de ordem zero, a que corresponde aos algarismos menos significativos. E a razão é simples: como ela é sempre a primeira a ser somada, para ela nunca “Vem 1”, já que não há coluna alguma antes dela. Então, se construirmos a tabela dos valores possíveis para a soma de dois bits da coluna de ordem zero teremos o resultado exibido na Figura 4. Figura 4: Tabela de um somador simples O circuito, então, deverá ter duas entradas, A e B, correspondentes aos bits a serem somados, e duas saídas, S (correspondente à soma dos bits A e B) e “Vai 1”, um bit a ser acrescentado à próxima coluna quando o resultado da soma for igual à base (dois, no caso). O diagrama lógico deste circuito é mostrado na Figura 5. Como ele apenas é usado para somar os bits menos significativos, ou seja, os da coluna de ordem zero, as entradas estão assinaladas como Ao e Bo. Figura 5: Diagrama lógico de um circuito somador parcial Como você vê, somar dois bits é mais simples do que parecia. Basta combinar duas portas lógicas, uma XOR e uma AND, e o problema está resolvido. Verifique, na Animação 1, como a coisa funciona. Clique nos botões retangulares (não nos círculos) para “ligar” (ou atribuir o valor “um”) e “desligar” (ou atribuir o valor “zero”) os bits Ao e Bo da entrada e veja como isso se reflete nos valores da saída e do “Vai 1”. Mas não se limite a observar os indicadores acenderem e apagarem: acompanhe, com os conhecimentos sobre portas lógicas e suas tabelas verdade, os trechos energizados (em vermelho piscante) e não energizados (em preto) de cada estado do circuito e procure entender porque eles estão nestes estados (se precisar refrescar a memória, consulte as colunas anteriores desta série). Garanto que é um bom exercício mental. ANIMAÇÃO 1: CLIQUE NOS BOTÕES “LIGAR” E “DESLIGAR” PARA VERIFICAR O FUNCIONAMENTO DO CIRCUITO DO SOMADOR PARCIAL Mas como somar os demais bits de um número, aqueles nas posições (ou “casas”) de ordem maior que 0? O complicador, naturalmente, decorre do fato de ser necessário saber se “Veio 1” ou não da soma dos bits da posição anterior. O circuito terá então três entradas: os bits A e B a serem somados e o eventual “Vem 1” da posição de ordem imediatamente inferior. E duas saídas, S, o resultado da soma, e o “Vai 1” caso a soma iguale ou exceda o valor da base. As combinações de valores são as representadas pela Tabela da Figura 7. Figura 7: Tabela de um somador completo O circuito correspondente, com as entradas, An, Bn (os bits a serem somados) e “Vem 1” (de um eventual “Vai 1” da coluna de ordem imediatamente inferior), e duas saídas, S, (a soma dos bits An, Bn e “Vem 1”), e “Vai 1” (o bit a ser acrescentado à próxima coluna quando o resultado da soma for igual ou superior à base) tem seu diagrama lógico mostrado na figura 8. Figura 8: Diagrama lógico de um circuito somador completo Também neste caso, apesar da complicação adicional trazida pelo “Vem 1”, somar dois bits continua sendo uma tarefa simples. O número de portas lógicas a serem combinadas agora são cinco, duas XOR, duas AND e uma OR. Também nesse caso você pode verificar na Animação 2 como a coisa funciona. Clique nos botões para “ligar” (ou atribuir o valor “um”) e “desligar” (ou atribuir o valor “zero”) aos bits An, Bn e “Vem 1” e veja como isso se reflete nos valores da saída e do “Vai 1”. Mas, novamente, não se limite a observar as luzes acenderem e apagarem: acompanhe, com os conhecimentos sobre portas lógicas e suas tabelas verdade, os trechos energizados (em vermelho piscante) e não energizados (em preto) de cada estado do circuito. ANIMAÇÃO 2: CLIQUE NOS BOTÕES “LIGAR” E “DESLIGAR” PARA VERIFICAR O FUNCIONAMENTO DO CIRCUITO DO SOMADOR COMPLETO Agora que sabemos como funcionam os somadores parcial e completo, fica fácil combiná-los para somar dois números de dois bits cada. Os bits menos significativos (de ordem 0) são somados usando um circuito somador parcial e os bits de ordem imediatamente superior (ordem 1) precisam utilizar um somador completo devido à possibilidade de “vir 1” da soma dos bits menos significativos. A Figura 10 mostra o diagrama lógico deste circuito. Figura 10: Diagrama lógico de um circuito somador de dois bits Repare como a coisa é simples. Imagine que os números sejam ordenados um acima do outro, de forma que os bits menos significativos fiquem um sobre o outro, no caso Ao e Bo, somados pelo somador parcial à direita da figura. Veja que o “Vai 1” desta soma é encaminhado diretamente (como a entrada “Vem 1”) ao somador completo, à esquerda. Os bits dos resultados das somas das duas colunas são mostrados em baixo, na saída. Caso haja um “estouro” (o resultado não couber em um número de dois bits, ou seja, se for maior que três) isso se refletirá na saída “Vai 1” à esquerda, que assumirá o valor “um”. Veja como este circuito funciona na Animação 3. Altere os valores das parcelas clicando sobre os botões retangulares “Ligar” e “Desligar” para atribuir valores “zero” e “um” a cada bit das parcelas A e B (os valores resultantes são mostrados em binário e decimal á direita da figura, tanto para A e B quanto para a soma S; neste último caso, quando o valor da soma exceder a três, ou seja, quando a saída “Vai 1” estiver ativa, o bit “1” correspondente é mostrado entre parênteses à esquerda dos dois bits da soma). Repare como, apesar da aparente complexidade, somar dois números é uma tarefa relativamente simples com o uso de circuitos digitais que empregam portas lógicas. ANIMAÇÃO 3: CLIQUE NOS BOTÕES “LIGAR” E “DESLIGAR” PARA VERIFICAR O FUNCIONAMENTO DO CIRCUITO DO SOMADOR DE DOIS BITS Os valores possíveis de números de dois bits vão de zero a quatro. O número total de combinações de somas é de dezesseis (4 x 4 = 16). Já um circuito somador de duas parcelas de oito bits cada resultaria em somas de dois números que variam de zero a 255 e a combinação de todas as parcelas possíveis atingiria a 65.536 (256 x 256). O circuito não é muito complicado, mas resultaria em um emaranhado de ligações que acabaria dificultando a compreensão. Mas, para facilitar o entendimento e mostrar como pode-se combinar qualquer número de somadores, abaixo vocês verão o diagrama lógico de um circuito capaz de somar duas parcelas de quatro bits cada. Fico devendo a animação, pois o número de total de combinações chegaria a 256 e não me imagino criando uma animação em Flash com 256 quadros. Mas o diagrama lógico está aqui na Figura 12: Figura 12: Diagrama lógico de um circuito somador de quatro bits Como você vê, não há mistério nos circuitos digitais. Basta um pouco de paciência para entendê-los. Isso que está aí em cima é o diagrama lógico de um dispositivo capaz de efetuar somas de duas parcelas de quatro bits cada (ou seja, de dois números menores que 16). Uma somazinha besta, naturalmente, que qualquer criança pode fazer “de cabeça”. Mas o importante não é o tamanho das parcelas, o importante é o funcionamento do circuito. Se você entendeu como ele funciona, entenderá o funcionamento de um circuito capaz de fazer somas de parcelas de qualquer tamanho, já que basta continuar combinando circuitos somadores bit a bit para aumentar o tamanho das parcelas. E se você entendeu como somar, entenderá como subtrair, multiplicar e dividir, já que como vimos todas essas operações são baseadas na soma. Em resumo, hoje demos um passo sumamente importante: aprendemos como é possível efetuar cálculos numéricos usando apenas circuitos digitais. E, melhor ainda: vimos que não se trata de nenhuma proeza, muito pelo contrário. Trata-se de uma tarefa perfeitamente ao alcance de nossa compreensão e baseada exclusivamente nos conhecimentos que adquirimos até agora. Eu não disse que era fácil? E daqui para a frente, ficará ainda mais fácil. Espere e veja se não tenho razão.