Professor: Gabriel Soares Baptista
Até agora: circuitos combinacionais.
Hoje: circuitos que conseguem lembrar.
Um latch ou flip-flop é um elemento de memória de 1 bit. Ele mantém um estado interno, normalmente representado por $Q$.
Base: Capítulo 5.1 a 5.10 de Sistemas Digitais: Princípios e Aplicações (Tocci, Widmer, Moss).
Em circuitos sequenciais, a saída atual depende de duas coisas:
Isso muda a pergunta de projeto.
Antes:
$$ \text{saída} = f(\text{entradas atuais}) $$
Agora:
$$ \text{saída} = f(\text{entradas atuais},\ \text{estado anterior}) $$
Exemplo mental: alarme de porta.
Circuito combinacional:
Circuito sequencial:
Leitura do diagrama:
Se duas situações têm as mesmas entradas externas agora, mas chegaram a esse ponto por histórias diferentes, o circuito deve responder igual?
Circuitos combinacionais:
Circuitos sequenciais:
Um flip-flop costuma ter duas saídas complementares:
$$ Q \qquad \text{e} \qquad \overline{Q} $$
$$ \begin{array}{c|c|c} Q & \overline{Q} & \text{Estado} \\ \hline 1 & 0 & \text{setado ou armazenando }1 \\ 0 & 1 & \text{resetado ou armazenando }0 \end{array} $$
Terminologia básica:
Quando um latch ou flip-flop é energizado, nem sempre é possível prever se começará em $Q=0$ ou $Q=1$.
Se o circuito precisa começar em um estado específico:
O latch mais simples pode ser feito com duas portas NAND realimentadas.
Ideia do circuito:
No latch NAND, usamos:
A barra indica nível ativo baixo.
$$ \begin{array}{c|c||c} \overline{S} & \overline{R} & \text{Efeito em }Q \\ \hline 1 & 1 & \text{mantém estado anterior} \\ 0 & 1 & Q=1\ \text{set} \\ 1 & 0 & Q=0\ \text{reset} \\ 0 & 0 & \text{condição inválida} \end{array} $$
Linha mais importante:
$$ \overline{S}=1,\ \overline{R}=1 \Rightarrow \text{mantém} $$
Isso é a memória.
Leitura por ação:
Em latch NAND, repouso não é $0,0$. Repouso é $1,1$.
Latch NAND começa com $Q=0$.
$$ \begin{array}{c|c|c} \text{Passo} & \overline{S} & \overline{R} \\ \hline 1 & 1 & 1 \\ 2 & 0 & 1 \\ 3 & 1 & 1 \\ 4 & 1 & 0 \\ 5 & 1 & 1 \end{array} $$
Pergunta:
Sequência final:
$$ Q: \quad 0,\ 1,\ 1,\ 0,\ 0 $$
Moral: entrada ativa muda o estado; repouso preserva o último estado válido.
Também podemos construir um latch S-R com duas portas NOR realimentadas.
Diferença principal:
No latch NOR, o repouso é $S=0$ e $R=0$.
$$ \begin{array}{c|c||c} S & R & \text{Efeito em }Q \\ \hline 0 & 0 & \text{mantém estado anterior} \\ 1 & 0 & Q=1\ \text{set} \\ 0 & 1 & Q=0\ \text{reset} \\ 1 & 1 & \text{condição inválida} \end{array} $$
Leitura:
Latch NAND
$$ \begin{array}{c|c|c} \overline{S} & \overline{R} & \text{ação} \\ \hline 1 & 1 & \text{mantém} \\ 0 & 1 & \text{set} \\ 1 & 0 & \text{reset} \\ 0 & 0 & \text{inválida} \end{array} $$
Latch NOR
$$ \begin{array}{c|c|c} S & R & \text{ação} \\ \hline 0 & 0 & \text{mantém} \\ 1 & 0 & \text{set} \\ 0 & 1 & \text{reset} \\ 1 & 1 & \text{inválida} \end{array} $$
Pergunta correta:
esta entrada é ativa em nível alto ou baixo?
Latches mudam assim que uma entrada ativa aparece.
Isso pode ser ruim em sistemas maiores:
Solução em sistemas síncronos:
Termos importantes:
Um clock é um trem periódico de pulsos.
Período:
$$ T = \text{tempo de um ciclo completo} $$
Frequência:
$$ f = \frac{1}{T} $$
Em sistemas síncronos:
<img src="../static/tocci_fig_5_18_setup_hold.png" width=50%" style="display: block; margin: 0 auto;">
Para um flip-flop responder de forma confiável:
Termos:
A borda do clock não é mágica. O circuito interno precisa de sinais estáveis perto da borda ativa.
Versão sincronizada do latch S-R.
Ideia:
Considerando disparo na borda de subida:
$$ \begin{array}{c|c|c||c} S & R & CLK & Q^+ \\ \hline 0 & 0 & \uparrow & Q_0 \\ 1 & 0 & \uparrow & 1 \\ 0 & 1 & \uparrow & 0 \\ 1 & 1 & \uparrow & \text{ambíguo} \end{array} $$
Onde:
Importante:
Problema mantido do S-R:
$$ S=R=1 \Rightarrow \text{condição ambígua} $$
O S-R é didático, mas não é o mais versátil.
FF S-R disparado na borda de subida começa com $Q=0$.
$$ \begin{array}{c|c|c} \text{Borda} & S & R \\ \hline 1 & 0 & 0 \\ 2 & 1 & 0 \\ 3 & 1 & 0 \\ 4 & 0 & 1 \end{array} $$
Resolução:
$$ Q: \quad 0,\ 1,\ 1,\ 0 $$
O J-K resolve a condição ambígua do S-R.
Semelhança:
Diferença:
Considerando borda de subida:
$$ \begin{array}{c|c|c||c} J & K & CLK & Q^+ \\ \hline 0 & 0 & \uparrow & Q_0 \\ 1 & 0 & \uparrow & 1 \\ 0 & 1 & \uparrow & 0 \\ 1 & 1 & \uparrow & \overline{Q_0} \end{array} $$
Última linha:
Essa operação é chamada toggle ou comutação.
Com $J=K=1$:
Comparação rápida:
FF J-K começa com $Q=0$.
Entradas fixas:
$$ J=1, \qquad K=1 $$
Como $J=K=1$, cada borda inverte o estado.
$$ \begin{array}{c|c|c} \text{Borda} & \text{Estado anterior} & \text{Novo estado} \\ \hline 1 & 0 & 1 \\ 2 & 1 & 0 \\ 3 & 0 & 1 \\ 4 & 1 & 0 \end{array} $$
Sequência:
$$ Q: \quad 1,\ 0,\ 1,\ 0 $$
O flip-flop D é o mais direto para armazenar dados.
Ideia:
Considerando borda de subida:
$$ \begin{array}{c|c||c} D & CLK & Q^+ \\ \hline 0 & \uparrow & 0 \\ 1 & \uparrow & 1 \end{array} $$
Leitura prática:
Vários flip-flops D lado a lado formam um registrador. O mesmo clock armazena vários bits simultaneamente.
O latch D também armazena dados, mas não é disparado por borda.
Diferença principal:
$$ \begin{array}{c|c||c} EN & D & Q^+ \\ \hline 0 & X & Q_0 \\ 1 & 0 & 0 \\ 1 & 1 & 1 \end{array} $$
Quando $EN=1$:
Quando $EN=0$:
Leitura:
Enquanto $EN=1$, mudanças em $D$ passam para $Q$. Isso pode deixar mudanças indesejadas atravessarem o latch.
Situação:
Flip-flop D:
Latch D com $EN=1$:
Entradas síncronas:
Entradas assíncronas:
Mais comuns:
Muitos CIs usam entradas assíncronas ativas em nível BAIXO:
Bolinha no símbolo:
Entradas assíncronas ativas em nível BAIXO:
$$ \begin{array}{c|c||c} \overline{PRE} & \overline{CLR} & \text{Efeito em }Q \\ \hline 1 & 1 & \text{operação síncrona normal} \\ 0 & 1 & Q=1\ \text{imediatamente} \\ 1 & 0 & Q=0\ \text{imediatamente} \\ 0 & 0 & \text{condição inválida} \end{array} $$
Palavra-chave:
imediatamente.
Não espera borda de clock.
FF J-K com entradas assíncronas ativas em baixo.
Estado inicial:
$$ Q=1,\quad J=1,\quad K=1,\quad \overline{PRE}=1,\quad \overline{CLR}=1 $$
Agora $\overline{CLR}$ vai momentaneamente para $0$.
Resultado:
$PRE$ e $CLR$ não são entradas normais de dados. Elas se sobrepõem à lógica síncrona.
Usos típicos:
Se $\overline{CLR}=0$:
$$ \begin{array}{c|c|c|c} \text{Dispositivo} & \text{Disparo} & \text{Entrada} & \text{Ideia central} \\ \hline \text{Latch NAND S-R} & \text{nível} & \overline{S},\overline{R} & \text{ativos em }0 \\ \text{Latch NOR S-R} & \text{nível} & S,R & \text{ativos em }1 \\ \text{FF S-R} & \text{borda} & S,R & \text{set/reset sincronizados} \\ \text{FF J-K} & \text{borda} & J,K & \text{S-R com toggle} \\ \text{FF D} & \text{borda} & D & \text{armazena }D \\ \text{Latch D} & \text{nível} & D,EN & \text{transparente com }EN=1 \end{array} $$