sábado, 17 de abril de 2021

Somadores

 Olá a todos! No último post aqui do blog, pudemos ver um pouco mais sobre conversão numérica e circuitos lógicos. Porém, creio que seja interessante demonstrar um pouco melhor alguns usos para essas conversões e circuitos lógicos e como elas podem ser usadas para facilitar a vida do ser humano. Neste post, iremos ver um pouco sobre somadores, que nada mais são do que circuitos lógicos capazes de fazer a soma de números binários.

A soma de números binários é muito parecida com a soma de decimais que já estamos acostumados. A diferença, porém, é que, ao invés de termos dez algarismos, agora temos apenas dois. Vamos observar um exemplo:


Neste exemplo, temos a soma de dois números decimais. Observe que, quando somamos oito com dois, obtemos o número dez. Isso faz com que o número 1 (de 10) seja "carregado" para o algarismo seguinte, fazendo com que em seguida seja feita a soma de 2 + 2 + 1 (que veio da soma anterior). Agora vamos analisar a mesma soma feita com número binários. Fazendo a conversão de decimal para binário, vamos encontrar os seguintes números para nossa soma: 



Estes números equivalem a 28+22, porém desta vez em binário. Caso haja alguma dúvida na parte de conversão de decimais em binário, é possível encontrar neste mesmo blog um post sobre conversão de unidades. Podemos perceber que a soma é muito parecida, porém, agora, quando temos a soma de 1 + 1, temos o número 1 sendo "carregado" para a próxima parte da soma. Isso acontece pois em binário, 1 + 1 daria "1 0" (2 em decimal), algo muito parecido com o 8 + 2 na soma com decimais, onde teríamos o surgimento de um número com 2 algarismos (10). Como estamos trabalhando com números binários, se torna possível usar portas lógicas para desenvolver circuitos que fazem a soma automaticamente, acabando assim com a necessidade de fazermos somas manuais.

Para desenvolvermos um circuito lógico, iremos usar as mesmas técnicas aprendidas em nosso último post. Para começar, vamos desenvolver uma tabela verdade. Primeiramente, vamos desenvolver um circuito somador capaz de fazer a soma de uns e zeros e de "carregar" um número, caso a soma seja entre dois uns. Para o 1 "carregado", daremos o nome de Cout (carry out). A tabela verdade deste circuito ficará assim:


ABCoutSoma
0000
10 01
0101
1110

Analisando esta tabela verdade, podemos notar algo interessante: a coluna "Cout" funciona como uma porta "AND". Perceba que a saída apenas é 1 quando as duas entradas são iguais a 1. Observando esta tabela verdade, também é possível notar algo interessante sobre a coluna "soma": ela funciona como uma porta "XOR". Caso seja necessário, é possível rever o funcionamento de cada porta lógica em um post do blog chamado "portas lógicas e seus circuitos".

Sendo assim, o desenvolvimento deste circuito se torna bastante simples: a saída "soma" ficaria ligada a uma porta XOR e a saída Cout ficaria ligada a  uma porta AND. Observe:


Este circuito faz exatamente o que precisávamos. Porém ele não está completo, pois ainda não tem como receber o número carregado de somas anteriores. Caso este circuito seja o responsável por fazer a primeira soma de um conjunto, ele pode ser útil, mas caso ele esteja no meio de um processo de soma, ele seria falho justamente por não receber números carregados de somas anteriores. Por este motivo, este circuito é chamado de "meio somador" ou "half adder".


Caso o circuito seja responsável por fazer a primeira soma, ele funciona perfeitamente

Para permitir que o circuito receba números carregados de uma soma anterior, precisamos adicionar mais uma entrada. A tabela verdade seria algo assim:


Para desenvolver um circuito utilizando esta tabela verdade, podemos usar algumas técnicas. É possível desenvolver uma expressão booleana utilizando os resultados das saídas e simplificá-la para obter um circuito ou também é possível utilizar a lógica para desenvolver o circuito. Na tabela, podemos ver que todas as saídas que não envolvem Cin (carry in) na entrada continuam iguais ao circuito anterior. Então tudo o que precisamos fazer é adaptar o circuito para que o Cin  cumpra seu papel. Podemos perceber então o seguinte: 


ABCinCoutSoma
00101
01 110
10110
11111

Com isso podemos perceber o seguinte: a saída "soma" fica invertida quando adicionamos o "Cin". Uma forma interessante de inverter a saída apenas quando tivermos um sinal no Cin é utilizando uma porta "xor":


Agora, sempre que tivermos um sinal vindo de Cin, o sinal vindo da primeira porta xor será invertido.

Na parte de Cout, precisamos agora adicionar algumas portas para que o funcionamento seja o que esperamos. Podemos perceber que o último caso (A = 1, B = 1 e Cin = 1) já está feito, visto que, de qualquer forma, quando A e B forem iguais a 1, Cout será igual a 1. O mesmo ocorre quando A e B são iguais a 0. Porém, agora precisamos adaptar o circuito para que a saída Cout seja igual a 1 quando A ou B forem iguais a 0, e Cin for igual a 1. Para isso, podemos fazer o seguinte: se A XOR B = 1 e Cin = 1, o Cout também será igual a 1. Perceba que precisaremos de apenas mais uma porta AND, visto que já temos uma porta XOR recebendo A e B.


Agora temos duas condições para que o Carry Out seja 1: quando A e B forem 1 e quando A XOR B e Cin forem 1. Sabemos que quando qualquer uma dessas condições for verdadeira, Cout será 1. Sendo assim, precisamos apenas colocar uma porta OR na saída. 



Pronto! Temos agora o nosso circuito somador. Dessa forma é possível fazer a soma de binários de forma automática.

Como sempre, deixo abaixo o link de um vídeo muito interessante sobre somadores que foi utilizado como fonte para algumas das informações contidas neste post (assim como o desenvolvimento do circuito sem utilização de álgebra de Boole):


Espero que tenham gostado deste post. Até a próxima :-)

Nenhum comentário:

Postar um comentário

Projeto utilizando lógica sequencial e combinacional: Garra automática

Olá a todos! A postagem de hoje aqui no blog será um pouco diferenciada. Hoje iremos utilizar todos os nossos aprendizados para desenvolver ...