“Os que tocaram, e viram a face das Górgonas, não voltaram, ou voltaram sem palavras”

Primo Levi

11 - Circuitos Digitais

11.1 - Sistemas de Numeração e Códigos.

O sistema decimal utiliza 10 dígitos (0 até 9) e uma estrutura posicional para escrever qualquer número, ou seja, 289 pode ser escrito como

$2\cdot 10^2+8\cdot10^1+9\cdot 10^0=200+80+9=289$

de forma que podemos separar os dígitos e multiplicá-los para potências de 10 para encontrar o valor desejado. Esse sistema é chamado de base 10 ou Radix de 10. Outros sistemas comuns são base 2 ou binário, base 8 ou octal e base 16 ou hexadecimal. A base 2, de alfabeto {0,1}, é utilizada na computação digital e em componentes eletrônicos, todo programa deve ser convertido para uma sequência de 0s e 1s para ser processada pelos circuitos. Para escrever um número em binário também utilizamos a estrutura posicional, aumentando as casas da direita para a esquerda e podemos converter o número para decimal utilizando a estratégia que usamos para a base decimal, ou seja, o número 1110 é

$1\cdot 2^3+1\cdot 2^2+1\cdot 2^1+0\cdot 2^0=8+4+2=14$

No caso de conversão para frações, usamos a mesma estratégia, diminuindo as potências de 2 para números negativos ao chegar no $2^0$ . Por exemplo, o número 1110.101 é

$1\cdot 2^3+1\cdot 2^2+1\cdot 2^1+0\cdot 2^0+1\cdot2^{-1}+0\cdot 2^{-2}+1\cdot 2^{-3}=8+4+2+0.5+0.125=14.625$

No caso da conversão de decimal para binário dividimos o número na base 10 por 2 e guardamos o resto até que ele seja zero e utilizamos a sequência de restos na ordem inversa (o primeiro por último) para gerar o número binário. Um número decimal fracionário deve ser multiplicado por 2 até que o resto seja 1.

A base 16 ou hexadecimal tem 16 caracteres para representar um número, 0-9, A, B, C, D, E e F. A grande vantagem é a fácil conversão de 4-bit para 1 hexadecimal. Também é utilizada a estrutura posicional que vimos antes, ou seja, o número 10 em hex convertido na base decimal é:

$1\cdot 16^1+0\cdot 16^0=16+0=16$

Outro exemplo, 2B6:

$2\cdot 16^2+B\cdot16^1+6\cdot 16^0=2\cdot256+11\cdot16+6\cdot16=512+176+6=694$

Para converter de hexadecimal para binário basta se lembrar do fato de que um carácter hexadecimal tem uma representação em 4 bits: Em hex 3B9, em binário:

3 = 0011
B = 1011
9 = 1001
Então 3B9 = 001110111001

Para representarmos números positivos e negativos em uma cadeia de bits utilizamos a notação de complemento de 2. Por exemplo, para 1 byte ou 8 bits, o primeiro dígito à esquerda é chamado de mais significativo, representa o sinal, se for 0 é positivo e se for 1 é negativo, os outros 7 bits representam a magnitude, ou o valor numérico. Porém, como temos um bit a menos agora, para escrever o maior valor em 1 byte escrevemos 01111111 = +127 e seu par negativo é o inverso ou complemento 10000000=128.

Alguns números binários chamados de códigos são especiais para processar certas funções em um sistema computacional. BCD, ou binary-coded decimal (decimal em código binário) ou 8421 BCD é uma operação de conversão para decimais mais fácil. É uma tabela de representação e uma técnica para identificar rapidamente um número decimal pelo seu binário. Por exemplo, 150 ficaria

1 = 0001
5 = 0101
0 = 0000
150 = 0001 0101 0000

Há também os números binários não ponderados, como excess-3 (XS3) e gray. O primeiro é parecido com o 8421 BCD, mas usa sempre 3 mais que o BCD.

62 em XS3 = 62 em BCD + 0011 em cada dígito

Sua utilidade é em aritmética de circuitos pois é fácil calcular o complemento, calculando não com 2, mas com 9.

O código gray não é do tipo BCD, cada incremento só altera uma mudança de bit. Isso é importante em algumas aplicações de eletrônica digital, como correção de erros e sensores.

Também podemos utilizar os bits para representar outros caracteres além de dígitos. Usando a tabela ASCII (American Standard Code for Information Interchange) temos como cada sequência de bits é transformada em um carácter. Ela é muito utilizada em pequenos computadores, principalmente em traduzir comandos via teclado.

EBCDIC (Extended Binary-Coded Decimal Interchange Code): Outro padrão para tradução de sequências de bits em carácteres alfanuméricos.

11.2 - Aritmética Binária.

Portas lógicas são abstrações de certas operações possíveis de se executar com bits nos circuitos eletrônicos. Quando há pulso elétrico no circuito (com tensão normalmente de 5V), dizemos que é o valor binário 1, caso contrário 0. Todo e qualquer circuito é construído com base em apenas três portas lógicas: AND, OR e NOT. Esses objetos são estudados com a teoria da álgebra boolena onde são geradas tabelas verdade para analisar como a combinação de certas entradas resulta em uma determinada saída. Por exemplo, usando duas entradas binárias A e B e a porta lógica AND, só temos o valor 1 como resultado quando ambas as entradas forem 1. A expressão é dada por $A\cdot B=Y$. Normalmente temos três variáveis, A, B e C, com saída Y, $A\cdot B\cdot C=Y$, no caso da porta lógica AND.

No caso do OR, usamos $A+B+C=Y$, onde a saída é zero somente se $A=B=C=0$, caso contrário, Y vale 1.

O operador NOT inverte um bit, se é 0 vira 1 e se é 1 vira 0. A entrada é sempre de uma variável, assim como a saída.

Podemos combinar as portas lógicas para formar novos padrões, por exemplo, passando as variáveis por duas portas AND que são entradas depois de uma porta OR. Disso poderíamos escrever, com três variáveis, $(A\cdot B)+(B\cdot C)= Y$, dada pela representação:

Exemplo de circuito com portas lógicas. Fonte [1]
Exemplo de circuito com portas lógicas. Fonte [1]

Antigamente portas lógicas eram implementadas com válvulas termiônicas ou tubos de vácuos, ou ainda por relês. Atualmente são utilizados circuitos integrados, ou componentes equivalentes à resistores, diodos e transistores.

TTL: Transistor-transistor logic

CMOS: Complementary Metal Oxide Semiconductor

Outras portas lógicas, usando apenas as três já mencionadas AND, OR e NOT são: NAND, NOR, Exclusive-OR, Exclusive-NOR.

As regras da soma de dois bits são as seguintes:

a - 0+0 = 0
b - 0+1 = 1
c - 1+0 = 1
d - 1+1 = 0 e sobra 1 = 10

Com isso conseguimos escrever a tabela verdade com duas variáveis e a sobra e desenhar um circuito adequado, por exemplo, uma função XOR que produza a soma respectiva de duas variáveis e uma porta lógica AND para a sobra.

Circuito para meia soma. HA = Half Adder. Fonte [1]
Circuito para meia soma. HA = Half Adder. Fonte [1]

Quando há necessidade de somar três 1, ou seja, 3 em decimal, um circuito de meia soma como o anterior não fucionária, disso utilizamos um de soma completa.

Circuito para soma completa. FA = Full Adder. HA = Half Adder. Co = Carry out (sobra). Cin=Carry in (sobra entrada). Fonte [1]
Circuito para soma completa. FA = Full Adder. HA = Half Adder. Co = Carry out (sobra). Cin=Carry in (sobra entrada). Fonte [1]

As regras de subtração são as seguintes:

a - 0-0 = 0
b - 0-1 = 1 e empresta 1
c - 1-0 = 1
d - 1-1 = 0

Da mesma forma que na soma, montamos a tabela verdade com duas variáveis e desenhamos dois circuitos: meia (HS) e subtração completa (FS).

Adição binária pode ser feita de duas formas diferentes, usando circuitos paralelos e seriais. No modo serial é como se usámos o algoritmo conhecido da soma no papel, coluna por coluna e demora mais, no caso paralelo separamos os bits em palavras binárias (grupo de bits) e aplicamos as regras às entradas, são mais complexos porém mais rápidos. O mesmo pode ser feito com a subtração. Tanto a sobra como o empréstimo são usados como saída de um componente e entrada em outro, para que as contas sejam feitas corretamente.

Um somador paralelo de 4 bits. Fonte [1]
Um somador paralelo de 4 bits. Fonte [1]

Também é comum construir um circuito integrado de soma apenas utilizando FAs ao invés de uma combinação de HAs e FAs, basta que o primeiro componente tenha a entrada de sobra ligada à terra. Com algumas mudanças tabmém é possível utilizar somadores para executar subtrações, bastantando inverter (NOT gate) algumas entradas e usar a regra de complemento de 2 para obter o comportamento desejado.

Quando utilizamos números negativos precisamos novamente da regra de complemento de 2 para resolver as contas. Esse processo é muito utilizado em microprocessadores.

Mapa de ícones de um circuito digital comum. Fonte: Wikipédia.
Mapa de ícones de um circuito digital comum. Fonte: Wikipédia.
11.3 - Representação e Manipulação de Circuitos Combinatórios.

Circuitos combinatórios são aqueles cujo sinal de saída depende apenas das entradas, ele não tem memória de outras execuções, é composto apenas de portas lógicas. São exemplos: Codificador, decodificador, somador, comparador, multiplexador, demultiplexador.

Quando criamos expressões booleanas e analisamos a tabela verdade gerada podemos notar que em alguns casos é possíveis substituir circuitos complexos por outros mais simples, ou seja, aqueles cujo resultado é o mesmo, mas combinamos um número menos de portas lógicas. Por exemplo, a expressão $A\cdot \bar{B}+\bar{A}\cdot B+A\cdot B=Y$ pode ser simplificada como $A+B=Y$. Em problemas mais complexos podems ser utilizados multiplexadores (seletores de dados), decodificadores, PLA (programmable logic arrays), ROMs e PROMS.

Há duas formas padrão de expressar as funções booleanas:

  • Mintermo (produto padrão): É um soma de produtos (SdP) contendo as variáveis em sua forma complementada ou não.
  • Maxtermo (soma padrão): É um produto das somas (PdS) também contendo as variáveis em forma complementada ou não.

Para $n$ variáveis, temos $2^n$ combinações de mintermos. Por exemplo, com duas variáveis, temos:

$$ \bar{A}\bar{B}, \bar{A}B, A\bar{B}, AB $$

Um mintermo sempre usa uma porta tipo AND.

No maxtermo, temos a porta tipo OR, em uma soma do tipo: $A+B+C$.

Um maxtermo / mintermo pode ser convertido para mintermo / maxtermo, são complementares um ao outro. Exemplo, provar que $M_1=m_1$, onde $M$ é maxtermo e $m$ é um mintermo:

$$ M_1=A+B+\bar{C} \\ \bar{M_1}=\bar{A+B+\bar{C}}=\bar{A}\bar{B}C=m_1 $$

Onde utilizamos o teorema de DeMorgan. Qualquer função booleana pode ser expressa através da soma de mintermos ou produto de maxtermos, nesse caso, é chamada de forma canônica.

Podemos usar a notação $f(A,B,C)$ para a expressão. Por exemplo : $f(A,B,C)=A+\bar{B}C$, que pode ser reescrita como:

$$ f(A,B,C)=A(B+\bar{B})+(A+\bar{A})\bar{B}C \\ =AB+A\bar{B}+A\bar{B}C+\bar{A}\bar{B}C \\ =\bar{A}\bar{B}C+A\bar{B}\bar{C}+A\bar{B}C+AB\bar{C}+ABC \\ =m_1+m+4+m_5+m_6+m_7= \Sigma (1,4,5,6,7) $$
11.4 - Minimização e Otimização de Funções Combinatórias.

Não sempre a expressão booleana que encontramos é a mínima possível, como vimos com o Mapa de Karnaugh. Podemos minimizar a função de várias formas diferentes: literais da função, número de portas, portas em cascata, entradas em cada porta.

Podemos usar a álgebra booleana e os teoremas de Morgan para simplificar e converter da forma soma de produtos para produto das somas e vice-versa, além de se livrar de inversões indesejadas. Os quatro passos para usar os teoremas são:

  1. Mudar todos os ORs e ANDs para ANDs e ORs;
  2. Complementar cara variável individual (adicionar a barra em cada);
  3. Complementar a função inteiro (adicionar uma barra em tudo);
  4. Eliminar todos os grupos com duas barras.

Como forma de reduzir os custos e disponibilidade de certas portas lógicas, a porta NAND é comumente uilizada para substituir AND, OR e NOT. Os passos para converter uma função AND-OR para NAND é:

  1. Desenhar o circuito AND-OR;
  2. Adicionar uma bolha (círculo) na saída de cada porta AND;
  3. Adicionar uma bolha em cada entrada de porta OR;
  4. Verifique se os níveis de lógica vindos de uma entrada estão indo para a saídas.
Exemplo de transformação de AND OR para NAND. Fonte [1].
Exemplo de transformação de AND OR para NAND. Fonte [1].

Nem sempre isso resulta em um circuito mais simples, mas pode ser preferido por usar menos portas.

No caso de um circuito OR-AND usamos uma porta do tipo NOR para substituição.

Implicante primário: No mapa de Karnaugh é o agrupamento de células com tamanho máximo;

Don’t care: a saída para certas combinações não importa (0 ou 1).

Método Tabular ou Algoritmo Quine-McCluskey: procedimento para extração de implicantes primários e pode ser usada para construir algoritmo iterativo;

11.5 - Projeto de Circuitos Combinatórios.

O projeto de um circuito combinacional tem como finalizada a criação do diagração do circuito ou suas equações. Deve se escolher um símbolo de entrada e saída em cada porta, determinar a tabela verdade, obter as equações simplificadas, mapear o circuito para a biblioteca de portas e montar o desenho final. Para isso, utiliza-se um mapa de Karnaugh para simplificar determinadas expressões e agrupá-las em portas AND e OR, como soma de produtos ou produto das somas. O mapa é uma transformação aplicada à tabela verdade, tendo como resultado uma nova tabela que deve então ser analisada para se obter a expressão final mais simples, donde o circuito pode ser desenhado.

11.6 - Análise e Síntese de Componentes Sequenciais e de Memória.

Um componente sequencial deve ser capaz de reutilizar uma saída de outro componente para calcular um novo processamento, ou seja, é como um armazenador de estado, uma memória, o circuito formado com esses componentes pode guardar as informações para processamento posterior, o que aumenta a complexidade das combinações.

11.7 - Projeto de Circuitos Sequenciais.

Circuitos sequencias são aqueles cujo saída depende não só das entradas mas de estados anteriores, são chamados também de circuitos com memória, além de suas portas lógicas. São exemplos deste tipo: Contador, registrador, controlador e multiplicador. Para armazenar os dados o circuito utiliza de latches ou flip-flops.

Um flip-flop J-K é um tipo de circuito lógico sequencial que pode armazenar e manipular informações binárias. É composto de múltiplas portas lógicas e é comumente usado em eletrônica digital e sistemas de computador para diversos fins, incluindo armazenamento de dados, divisão de frequência e geração de sinal de controle.

O flip-flop J-K tem duas entradas: J (set) e K (reset). Também possui duas saídas: Q (saída normal) e Q̅ (saída complementar). O estado do flip-flop é determinado por suas entradas atuais (J e K) e seu estado anterior.

O comportamento de um flip-flop J-K pode ser resumido da seguinte forma:

Quando as entradas J e K são 0, o flip-flop permanece em seu estado atual (sem alteração).
Quando J é 1 e K é 0, o flip-flop define o estado "SET", onde Q torna-se 1 e Q̅ torna-se 0.
Quando J é 0 e K é 1, o flip-flop é redefinido para o estado "RESET", onde Q torna-se 0 e Q̅ torna-se 1.
Quando as entradas J e K são 1, o flip-flop alterna ou altera seu estado. Se o estado anterior era "SET", ele se tornará "RESET" e vice-versa.

O flip-flop J-K pode ser pensado como uma extensão do flip-flop SR (Set-Reset) mais simples. Ele supera o problema da combinação de entrada proibida (entradas S e R sendo 1), que pode causar comportamento imprevisível no flip-flop SR. O flip-flop J-K introduz a funcionalidade de alternância, permitindo que a combinação de entrada de J e K seja 1.

Ao conectar vários flip-flops J-K juntos, é possível criar circuitos sequenciais mais complexos, como contadores, registradores de deslocamento e unidades de memória. Esses circuitos encontram aplicações em vários sistemas digitais, incluindo microprocessadores, dispositivos de comunicação e sistemas de controle.

11.8 - Modelo de Máquinas de Estado Finito (FSM).

Uma FSM é um modelo abstrato de máquina que só pode um conjunto finito de estados em um dado tempo t. A máquina pode mudar de um estado para outro, chamado de transição, onde identificamos a FSM por sua lista de estados, seu estado inicial e as entradas para disparar cada transição. Podem ser de dois tipos: determinísticas e não determinísticas.

Uma implementação de FSM tem menos poder computacional que uma máquina de Turing, ou seja, há algumas tarefas que uma máquina de Turing pode executar e o FSM não, isso decorre do fato da limitada memória do FSM e quantos estados pode armazenar.

Um exemplo de FSM é uma catraca, equipamento utilizado para controle de acesso.

Diagrama de estado para catraca. Fonte: Wikipedia.
Diagrama de estado para catraca. Fonte: Wikipedia.

O diagrama de estados pode ser representado por um grafo direcionado, com cada estado um nó e os vértices sendo as transições.

Classificação de FSM:

acceptors: produzem resposta binária indicando se a entrada é válida ou não;

transducers: produzem resposta com base na entrada ou estado através de ações. usando em computação linguística.

sequencers (generators): subtipo de acceptors e transducers que tem um único carácter de alfabeto como entrada. produzem uma única sequência de resultado que pode ser vista como saída de um acceptor ou transducer.

11.9 - Circuitos Sequenciais Síncronos e Assíncronos.

Um circuito sequencial assíncrono tem elementos que dependem do atraso das entradas e podem ser alterados em qualquer momento, devido às mudanças das entradas. A propagação de atraso não é fixa, depende de várias outras partes. É um tipo de circuito que pode ser visualizado como um combinacional com realimentação.

Um circuito sequencial fixo deve utilizar um sinal de relógio, ou clock, que organiza as chamadas para troca de estado em cada mudança do sinal. O clock tem uma forma de onda específica, chamada monótona, com nível 0 e nível 1. Toda atualização acontece de forma sincronizada com o período do relógio, que é o inverso de sua frequência de operação.

11.10 - Componentes de Armazenamento.

O elemento usado como memória em um circuito sequencial é chamado de flip-flops, é um tipo de circuito digital com duas entradas, duas saídas e pode armazenar um bit de informação, as duas entradas não podem ser trocadas, já que uma recebe o clock e a outra o bit de armazenamento, sendo que o sinal de clock é utilizado para executar a amostragem do valor recebido, por borda de saída ou descida, dependendo de como foi construído. A sequência de instruções pode ser representada por uma máquina de estados. Se o flip-flop receber continuamente energia, poderá manter os estados indefinidamente até que receba um dado de mudança.

O tipo mais básico de flip-flop é chamado de latch, e são sensíveis ao nível de entrada, a partir deles podemos construir circuitos mais sofisticados, mas são pouco práticos em comparação com os flips-flops. Tipos:

Latch RS: 2 portas NOR de entrada e realimentações entre elas;

Latch D:

Latch de ativação direta:

Flip-flop D:

Flip-flop sensível à borda:

A cada transição de estados podemos montar uma tabela de transição, para cada tipo de flip-flop. Certos estados são denominados proibidos ou indeterminados, além dos estados de reset 0 e set 1.

11.11 - Projeto de Sistemas Digitais: Hierárquico e Modular.

Sistemas hierárquicos foram criado para lidar com a complexidade crescente de circuitos muito grandes, dividindo-os em blocos ou módulos menores que podem ser projetos então de forma separada para interligação posterior. Cada módulo é um subprojeto com seu próprio esquema de componentes.

Uma estratégia para particionar o sistema em módulos é através do “dividir e conquistar”, ou seja, quebrar o sistema original em partes menores e interligá-los. Deve-se separar primeiramente em fluxo de dados e unidade de controle.

Classificação dos recursos no fluxo de dados: funcionais, memória e interface.

No projeto de unidade de controle temos o diagrama ASM (algorithmic state machine) que é similar à máquina de estados finita. Principais elementos: bloco de estado, decisão e saída condicional. A implementação pode ser feita usando AHDL (Altera hardware description language).

11.12 - Princípios e Técnicas de Projeto. Conceitos de Controle e de Tempo.

Tópico confuso. Ainda tentando entender o que é isso.

11.13 - Famílias Lógicas.

Fabricantes de circuitos integrados (CI) desenvolveram diversas famílias de circuitos que podem ser usados em conjunto para construir o sistema digital. CIs podem ser bipolar ou unipolar. O TTL (transistor-transistor logic) é o mais popular do tipo bipolar. Complexidade:

SSI (Small-scale integration): menos do que 12 portas.

MSI (Medium-scale integration): de 12 até 99 portas. Usado em somadores, contadores, decodificadores, encodificadores, multiplexadores e registros.

LSI (large-scale integration): de 100 até 9999 portas. Relógios digitais, chips de memória, calculadoras.

VLSI (very-large-scale integration): de 10000 até 99999 portas. Microprocessadores, chips grandes de memória e calculadoras avançadas.

ULSI (ultra-large-scale integration): mais de 100000 portas. Microprocessadores avançados.

Famílias bipolares:

RTL (Resistor-transistor logic)
DTL (diode-transistor logic)
TTL (Transistor-transistor logic)
ECL (Emitter-coupled logic)
HTL (High-threshold logic)
ITL (Integrated-injection logic)

Famílias MOS (Metal-oxide semiconductor):

PMOS (P-channel metal-oxide semiconductor)
NMOS (N-channel metal-oxide semiconductor)
CMOS (complementary metal-oxide semiconductor)

11.14 - Dispositivos Lógicos Programáveis (PLD).

É um tipo de dispositivo eletrônico utilizado para construir circuitos digitáis reconfiguráveis. Utiliza uma função indefinida no tempo de manufatura, ou seja, deve ter a implementação codificada com a funcionalidade desejada, com isso, é possível facilitar o desenho de circuitos mais sofisticados de forma mais fácil. São categorizados em:

SPLDs (Simple Programmable Logic Devices): Contendo PAL (programmable array logic) e GAL (generic array logic).

CPLDs (Complex Programmable Logic Devices)

FPGAs (Field-Programmable Gate Arrays)

EPLDs (Erasable programmable logic device)

Referências:

  1. Digital Circuits - Schaum
  2. Circuitos Combinacionais - UFPR
  3. Circuitos sequenciais - UFSC
  4. Programmable Logic Device - Wikipedia
  5. Projeto de sistemas digitas - USP
  6. Capítulo 09: Mintermos, Maxtermos e Mapa de Karnaugh - Engenharia Elétrica - Departamento de Engenharia Elétrica - FEIS - UNESP