Você já deve ter ouvido falar que computadores somente entendem e processam códigos binários, os famosos 0 e 1s do sistema numérico de base 2. O que a grande maioria não sabe é como e porque os computadores trabalham dessa maneira e é isso que vamos tentar entender no decorrer desse texto.
Desde criança, sempre gostei de joguinhos multi peças que me possibilitassem montar coisas, e meu favorito era de longe o LEGO. Era fascinante o que se podia fazer encaixando pecinhas umas nas outras. Ao ficar mais velho e escolher uma profissão na área técnica notei que podia voltar a montar coisas usando peças, só que agora eu deixaria a mecânica simples do LEGO de lado e entraria no domínio da eletrônica digital.
Na eletrônica digital, que rege o comportamento dos computadores e afins, os equivalentes dos bloquinhos de lego são as portas lógicas, e precisamos de apenas 3 tipos básicos para projetar nosso circuito digital, seja ele complexo como for (o que inclui microprocessadores).
Na lógica clássica se aplicam dois estados possíveis para as proposições, verdadeiro ou falso. No caso da lógica binária dos computadores lidamos com zeros e uns, e quando falamos de circuitos eletrônicos isso se traduz em níveis elétricos altos e baixos, que é o que realmente torna possível tornar um modelo teórico de computador algo real e prático.
Escondendo o complicado
Em engenharia (e também em outras áreas) para tornar as coisas mais simples e de mais fácil entendimento usamos algo chamado abstração, onde dividimos um sistema em níveis, chamados níveis de abstração. Isso nos permite generalizar e trabalhar somente com a informação necessária ao problema em análise no momento, escondendo informação desnecessária. Por exemplo, só preciso saber que meu carro precisa de gasolina para ele andar e não quais são os compostos químicos contidos nela, nem como eles reagem no meu motor. Caso quisesse saber porque meu carro anda com gasolina, teria de descer até um nível de abstração mais baixo no projeto do carro e analisar as informações contidas nele. É a famosa abordagem “dividir para conquistar”, onde quando temos um problema complexo o dividimos em níveis para entendê-lo melhor ou extrair somente a informação ou característica que nos interessa num dado momento. Conforme vamos nos aprofundando no hardware, mais baixo descemos nos níveis de abstração. Veja o exemplo da figura abaixo, onde dividimos um processador em níveis usando esse raciocínio.
Processador dividido em vários níveis de abstração
Portas lógicas
As portas lógicas são abstrações de algo mais complexo que é a união de transistores usados para construí-las. Para nossa conveniência didática podemos classificá-las como nível de abstração 2, os transistores como nível 1 e o silício que compõe os transistores como o nível 0. É claro que sempre podemos descer a níveis mais baixos e ir parar dentro dos átomos, mas chegaríamos ao ponto em que precisaríamos de mecânica quântica e muito chá do chá do Santo Daime para tentar entender alguma coisa. Quando estamos no nível das portas lógicas só nos interessa o que elas fazem, e não como elas fazem.
Como já havia dito, em essência, para projetar circuitos digitais necessitamos de 3 tipos diferentes de portas lógicas, as portas NÃO, E e OU ou respectivamente NOT, AND e OR na nomenclatura inglesa (que é normalmente a mais usadas nos projetos). Suas representações gráficas ANSI estão na figura abaixo.
Representação gráfica para as portas lógicas NOT, AND e OR
Dependendo do seu tipo, as portas lógicas podem ter uma ou mais entradas, porém todas possuem sempre uma única saída (nos símbolos da imagem acima, as entradas são representadas pelas linhas horizontais à esquerda e as saídas as linhas à direita). As entradas podem aceitar somente dois estados, 0 ou 1, e o mesmo vale para as saídas.
A figura abaixo mostra duas representações em níveis de abstração diferentes para a mesma porta NOT. Nota-se que quanto maior o nível, mais simples tendem a se tornar as representações, escondendo a complexidade do que vem por baixo.
Representações de alto e baixo nível para uma mesma porta NOT
Na representação em forma de porta lógica, vemos uma entrada e uma saída onde os sinais assumem 0 ou 1. Já no circuito elétrico também temos uma entrada e uma saída, porém elas assumem valores de 0 ou 5 volts, que é uma forma de representar os 0s e 1s eletricamente.
A Porta NOT
A porta NOT tem como saída a inversão de sua única entrada, ou seja, se sua entrada for o nível lógico 1, sua saída será 0 e vice versa. Para visualizar todas as possíveis entradas e suas respectivas saídas resultantes, utilizamos uma tabela chamada de tabela verdade. Aqui damos o nome de A para sua entrada e NOT A para a sua saída.
Tabela verdade da porta NOT
A Porta AND
Essa porta realiza a operação AND que consiste em uma multiplicação binária de suas duas ou mais entradas (que na prática é a mesma da realizada com números decimais, ao qual você já está acostumado). Caso tenhamos duas entradas e elas sejam iguais a 1 e 1 teremos 1 na saída porque 1 x 1 = 1, para todas as outras possibilidades teremos 0 na saída, já que pelo menos uma das entradas será sempre 0, e quando multiplicamos algo por 0 o resultado é sempre 0 (veja a tabela verdade abaixo).
Tabela verdade da porta AND
A Porta OR
Ao realizar uma operação OR a porta lógica executa uma adição binária de suas duas ou mais entradas. Cuidado ao realizar a soma, pois nesse tipo de adição 1+1 não é igual a 2 (já que o número 2 não existe em um sistema binário), e sim igual a 1. Dessa maneira, em uma porta com duas entradas e com valores 0 e 1 teremos como saída 1, já que 0 + 1 = 1. Somente teremos zero em sua saída quando todas as entradas forem iguais a 0. Em resumo, enquanto houver pelo menos um valor 1 em qualquer uma de suas entradas a saída será sempre 1 (como na tabela verdade logo abaixo).
Tabela verdade da porta OR
Além dessas existem as portas NOR, NAND, XOR e XNOR que são usadas para otimizar o projeto, pois possuem características interessantes. Essas portas construídas através de combinações das outras três que vimos até agora. Não irei incluí-las no artigo para não complicar o texto desnecessariamente, já que esse é um texto básico sobre o assunto, mas é bom salientar que elas também são muito usadas em projetos.
Como uso minhas “pecinhas” lógicas para construir algo?
Bom, como num brinquedo LEGO, as coisas por aqui são construídas baseadas em regras. No LEGO algumas peças se encaixam e outras não, e os encaixes podem ocorrer de várias maneiras.
No âmbito dos circuitos lógicos, todas as portas lógicas se “encaixam” umas com as outras e a única restrição é a seguinte: saídas não devem ser ligadas com outras saídas. Primeiro, isso ocorre porque não faz sentido ligar a saída de uma porta lógica em outra, devido ao fato de que as saídas não foram feitas para receber informação e sim para fornecer informação já processada. Segundo, num nível mais baixo, as saídas dos circuitos ao serem ligadas em curto geram um problema elétrico. O resto é perfeitamente válido, ou seja, ligar saídas com entradas e entradas com entradas.
Observe a “montagem” abaixo, isso é uma representação de um circuito lógico de 3 bits de entrada que detecta a presença de números primos num intervalo de 0 a 7. A animação mostra como o circuito se comporta para cada entrada (linha) da tabela verdade. Nesse caso, a tabela verdade é usada para demonstrar todos os possíveis estados do conjunto, e não só o de uma porta em particular. Coloquei uma coluna a mais na tabela com os valores em decimal para facilitar o entendimento. Caso um número primo seja inserido nas entradas A B C, o valor da saída X será igual a 1, caso contrário será 0. Observe que o circuito reconhece todos os números primos (2,3,5,7) do intervalo de 0 a 7 porque foi projetado de maneira com que as portas lógicas OU, AND e NOT, ligadas entre si, atribuíssem essa característica ao circuito.
Detector de números primos
Nessa ilustração, as letras significam os nomes das entradas/saída, os números em preto significam a identificação das portas e os números em vermelho os sinais que fluem pelo circuito (que só podem ser zeros e uns). Os sinais se propagam seguindo os “fios” e entram nas portas lógicas para serem processados, o resultado pode ser inserido em outras portas para serem processados novamente e por aí vai, até o fim do circuito onde o sinal pode ser 0 ou 1. Nesse caso, os “fios” em azul representam os sinais que ainda não passaram por nenhum processamento (não atravessaram nenhuma porta ainda), os vermelhos representam os sinais que já foram processados pelo menos uma vez. Esse desenho de interligação de portas também é conhecido como diagrama esquemático, ou simplesmente esquemático.
Note que no projeto do circuito acima a regra de não ligar saídas com saídas não foi quebrada. Por exemplo, ligamos a entrada da porta 1 (NOT) em uma das duas entradas da porta 3 (AND), isso significa que ambas as entradas sempre receberão o mesmo valor (0 ou 1). Fizemos o que se chama de “ligação em paralelo” (sempre que ouvir que algo está ligado em paralelo, significa que está recebendo o mesmo sinal que o outro ao qual está ligado). Também ligamos a saída da porta 1 na entrada da porta 2 e a saída da porta 2 na entrada da porta 4, além de outras ligações. Desse modo, usamos somente as regrinhas permitidas, que são ligar entradas com entradas e saídas com entradas. Observe também que podemos repetir portas de acordo com a necessidade (as portas 2 e 3 do detector são idênticas, mas recebem sinais diferentes).
Circuitos lógicos também podem ter mais de uma única saída, na figura abaixo você pode ver uma ULA que trabalha com operandos de 4 bits. O diagrama esquemático possui alguns símbolos que não expliquei aqui (portas NOR, XOR, buffers, entre outros), mas a ideia é a mesma do exemplo da figura acima, só que em uma escala maior. Neste circuito, as entradas da ULA estão à extrema esquerda e as saídas à extrema direita.
Circuito lógico de uma ULA
Infelizmente projetar circuitos lógicos não é tão simples quanto construir usando bloquinhos de LEGO. Quando construímos algo com LEGO, podemos literalmente ver o resultado do que estamos construindo. Se quero construir um carro de corrida, meus bloquinhos unidos devem se parecer com um carro de corrida. No caso das nossas portas lógicas, na maioria das vezes, não dá para saber a aparência que o circuito terá durante o projeto. Como nossa busca é funcional e não visual, começar a ligar as portas umas nas outras observando como o diagrama se parece não vai funcionar, pelo menos não para circuitos mais complicados. Por isso, para projetar circuitos lógicos recorremos a métodos gráficos como o mapa de Karnaugh, e matemáticos como a Álgebra de Boole, além de outros. Mas isso já é assunto pra um outro dia ;).
Conclusão
Todo o tipo de processamento realizado pelos processadores na verdade é isso aí que você acabou de ver: zeros e uns passando dentro de várias portinhas lógicas como as mostradas no exemplo do detector de números primos. É isso que seu microprocessador faz o tempo todo em que seu computador está ligado. Obviamente em uma escala muito maior e mais complexa.
Se você entendeu o espírito da coisa acaba de compreender a base de projeto dos circuitos lógicos que compõem os mais complexos chips digitais do mundo. Todos os circuitos seguem essas mesmas regras básicas, desde simples registradores até mesmo ULAs, controladores de memória, unidades de cálculo em ponto flutuante, pipelines, timers, etc. E agora você também sabe porque os computadores só trabalham com zeros e uns. Caso não tenha entendido, não tem problema algum, a maioria das pessoas tem inicialmente uma certa dificuldade em compreender tantos zeros e uns pra lá e pra cá indo de porta em porta, mas não desanime, ao final do artigo deixo algumas referências para estudos mais aprofundados caso seja de seu interesse.
Para saber mais
- Ronald J. Tocci, Neal S. Widmer e Gregory L. Moss. Sistemas digitais: princípios e aplicações. 10a ed, Prentice-Hall, 2008. – Ótimo livro sobre circuitos lógicos.
- INE5365 – Web site disciplina de Teoria de circuitos lógicos, Universidade Federal de Santa Catarina.
- Logsim – Ferramenta de projeto e simulação de circuitos lógicos.
- The Logic Lab – Simulador online que permite criar e testar circuitos lógicos.
- Como funciona a lógica booleana – Artigo sobre o tema de lógica booleana e portas lógicas.
André Luiz Delai
Possui nível técnico em eletrônica pelo Instituto Politécnico de Londrina (1998), graduação em Engenharia de Computação pela Universidade Norte do Parana (2004) e mestrado em Engenharia Elétrica pela Universidade Estadual de Campinas (2008). Tem experiência na área de Ciência da Computação, com ênfase em Hardware, atuando principalmente nos seguintes temas: hardware evolutivo, dispositivos embarcados (microcontroladores), dispositivos lógicos programáveis (FPGAs). Atualmente realiza seu doutorado em Engenharia Elétrica pela Universidade Estadual de Campinas e trabalha no desenvolvimento de sistemas eletrônicos de comunicação.
Contato: adelai@gmail.com
Deixe seu comentário