Em braços robóticos e sistemas CNC (Comando Numérico Computadorizado), a posição angular de um eixo é rastreada por um encoder incremental. O encoder gera pulsos digitais: ao girar no sentido horário, o controlador incrementa o contador; ao girar no sentido anti-horário, o contador é decrementado. O valor acumulado representa a posição absoluta do eixo em relação a um ponto de referência (home). Um contador Up/Down síncrono de 3 bits é utilizado nesse sistema.
(a) Explique o princípio de funcionamento do contador Up/Down:
(i) O que diferencia a contagem crescente da decrescente no nível dos flip-flops JK? Mencione o papel das saídas Q e \bar{Q}.
(ii) Qual sinal de controle seleciona o modo de operação? Como ele atua no circuito para alternar entre os dois modos?
(iii) Por que é necessário usar portas lógicas adicionais (além dos FFs ) nesse tipo de contador?
(b) Complete a tabela de estados do contador Up/Down de 3 bits conforme a sequência de operações descrita. O eixo robótico parte do ponto de referência (home =000 ):
Evento Modo Q_{C} Q_{B} Q_{A} Posição (decimal)
Inicial (home) - 0 0 0 0
Pulso 1 Up
Pulso 2 Up
Pulso 3 Up
Pulso 4 Up
Pulso 5 Down
Pulso 6 Down
Pulso 7 Up
Pulso 8 Up
O eixo mudou de direção nos pulsos 5-6 e voltou a avançar nos pulsos 7-8. Qual é a posição final do eixo?

Passo 1

O enunciado pede duas coisas principais e dá as seguintes informações:
  • Pedido (a): explicar o princípio de funcionamento de um contador Up/Down síncrono de 3 bits, dividindo a explicação em três pontos:
    (i) o que diferencia a contagem crescente da decrescente no nível dos flip-flops JK, mencionando o papel das saídas Q e \bar{Q};
    (ii) qual sinal de controle seleciona o modo de operação e como ele atua no circuito para alternar entre os modos Up e Down;
    (iii) por que é necessário usar portas lógicas adicionais além dos flip-flops.
  • Pedido (b): completar a tabela de estados do contador síncrono de 3 bits, partindo de \,000 (home), seguindo a sequência de pulsos: Pulso 1 a 4 em modo Up, Pulso 5 e 6 em modo Down (mudança de direção), Pulso 7 e 8 voltam a Up. Deve-se listar Q_C,\;Q_B,\;Q_A e a posição em decimal após cada pulso, e informar a posição final.
Informações dadas/assumidas:
  • O contador é síncrono (todos os flip-flops recebem o mesmo clock).
  • São usados flip-flops do tipo JK.
  • Bit mais significativo é Q_C, bit menos significativo é Q_A.
  • Inicial: \,Q_CQ_BQ_A = 000 (posição decimal 0).
  • Modos: Up (incrementa a cada pulso) e Down (decrementa a cada pulso).

Passo 2

Entendendo o comportamento do flip-flop JK (o “motorzinho” do contador).
  • O flip-flop JK tem duas entradas de controle chamadas J e K, e duas saídas: Q e \bar{Q} (complemento de Q). O papel de Q é guardar o estado atual do bit; \bar{Q} é a negação desse estado e é útil para formar lógica que detecta zeros ou uns.
  • Tabela de funcionamento do JK (excutada na borda de clock, comportamento síncrono):
    • J=0,\;K=0 \Rightarrow mantém o estado (não muda): Q_{\text{próx}} = Qó.
    • J=1,\;K=0 \Rightarrow seta: Q_{\text{próx}} = 1ó.
    • J=0,\;K=1 \Rightarrow reseta: Q_{\text{próx}} = 0ó.
    • J=1,\;K=1 \Rightarrow toggle: Q_{\text{próx}} = \bar{Q}ó (inverte o bit).
  • Como usamos isso no contador:
    • Para um bit que deve “mudar de valor a cada pulso” (por exemplo o LSB em um contador binário), colocamos J=K=1 — assim ele sempre toggla a cada clock.
    • Para bits mais significativos, escolhemos J e K de modo que fiquem em 1 (toggle) somente quando as condições das bits menos significativos exigem uma “propagação” (por exemplo, em contagem crescente o próximo bit muda só quando todos os bits menos significativos estão em 1).
Explicação do papel de Q e \bar{Q}:
  • Q expressa o valor atual do bit (0 ou 1).
  • \bar{Q} facilita detecção de condição “todas zeros” sem inverter explicitamente com portas extras, porque muitas portas lógicas usam diretamente Q e \bar{Q} para formar termos como “todas iguais a 1” ( Q_A\land Q_B) ou “todas iguais a 0” ( \bar{Q_A}\land\bar{Q_B}).
  • Em resumo: as saídas Q e \bar{Q} são usadas pelos blocos combinacionais que decidem os sinais J e K para cada flip-flop.

Passo 3

Qual sinal seleciona o modo Up/Down e como ele atua (descrição prática do circuito síncrono).
  • Introduzimos um sinal de controle S (por exemplo): \,S=1 para modo Up e \,S=0 para modo Down.
  • Ideia de projeto para um contador síncrono de 3 bits (bits A = LSB, B = meio, C = MSB):
    • Sempre que chegar um pulso de clock, A deve togglar independentemente do modo (porque LSB muda em todo incremento ou decremento). Assim: J_A = K_A = 1.
    • O bit B deve togglar quando, na contagem Up, A=1 (pois ao passar de \,01 para \,10 o B muda), e, na contagem Down, quando A=0 (pois ao passar de \,10 para \,01 o B muda). Isso pode ser descrito por uma expressão que escolhe entre Q_A e \bar{Q_A} conforme S: J_B = K_B = (S\land Q_A)\;\lor\;(\bar{S}\land \bar{Q_A}).
      • Se S=1 (Up) a expressão vira Q_A — então B toggla quando A=1.
      • Se S=0 (Down) a expressão vira \bar{Q_A} — então B toggla quando A=0.
    • O bit C deve togglar quando, na contagem Up, B=1 e A=1 (ou seja, quando os dois menos significativos são 1), e, na contagem Down, quando B=0 e A=0. Assim: J_C = K_C = (S\land Q_B\land Q_A)\;\lor\;(\bar{S}\land \bar{Q_B}\land \bar{Q_A}).
      • Se S=1 (Up) a expressão é Q_B\land Q_A — toggla quando BA=11.
      • Se S=0 (Down) a expressão é \bar{Q_B}\land\bar{Q_A} — toggla quando BA=00.
  • Em palavras: o sinal S atua como um seletor (multiplexador) na lógica que decide se a condição de toggle do próximo bit deve ser a condição “todos os menos significativos = 1” (caso Up) ou “todos os menos significativos = 0” (caso Down). Essa seleção é feita combinando termos AND e OR com S e \bar{S}.
Observação didática rápida sobre por que as expressões usam J=K (toggle): colocar J=K=1 no momento do clock inverte o bit; então em cada flip-flop colocamos J e K iguais a uma expressão booleana que é 1 exatamente quando o bit deve inverter naquele clock.

Passo 4

Por que são necessárias portas lógicas adicionais (além dos flip-flops)?
  • Os flip-flops JK apenas guardam um bit e permitem set/reset/toggle condicionado por suas entradas J e K. Eles não calculam por si só “quando” um bit mais significativo deve mudar — isso é decisão combinacional sobre os estados atuais dos bits menos significativos e sobre o sinal S.
  • Para detectar condições como “todos os bits menos significativos são 1” ou “todos são 0” e para multiplexar entre essas condições conforme S, são necessárias portas lógicas (AND para detectar conjuntos de 1s, AND sobre \bar{Q} para detectar zeros, OR para combinar termos, e possivelmente inversores). Portanto usa-se um bloco combinacional (portas AND/OR/NOT) que gera os sinais J e K para cada flip-flop a partir de Q, \bar{Q} e S.
  • Além disso, em implementações práticas, o uso de portas reduz problemas de tempo (no contador síncrono todas as decisões são feitas antes da borda e aplicadas simultaneamente), evitando os glitches e atrasos dos contadores assíncronos.

Passo 5

Resumo prático das fórmulas usadas no projeto (para referência rápida):
J_A = K_A = 1,
J_B = K_B = (S\land Q_A)\;\lor\;(\bar{S}\land \bar{Q_A}),
J_C = K_C = (S\land Q_B\land Q_A)\;\lor\;(\bar{S}\land \bar{Q_B}\land \bar{Q_A}).
Essas expressões mostram explicitamente o uso de Q e \bar{Q} e onde entram portas AND/OR/NOT.

Passo 6

Agora vamos completar a tabela de estados passo a passo. Lembrando: inicial \,000 (posição 0). Contagem binária natural para Up e Down com 3 bits (módulo 8).
Tabela inicial fornecida:
\begin{array}{|l|l|c|c|c|c|} \hline \text{Evento} & \text{Modo} & Q_C & Q_B & Q_A & \text{Posição (decimal)}\\\ \hline \text{Inicial (home)} & - & 0 & 0 & 0 & 0\\\ \hline \end{array}
Preenchendo cada pulso:
  • Pulso 1, modo Up: incrementa de \,000 para \,001. Portanto Q_C=0,\;Q_B=0,\;Q_A=1. Posição decimal 1.
  • Pulso 2, modo Up: incrementa \,001 \to 010. Portanto Q_C=0,\;Q_B=1,\;Q_A=0. Posição decimal 2.
  • Pulso 3, modo Up: incrementa \,010 \to 011. Portanto Q_C=0,\;Q_B=1,\;Q_A=1. Posição decimal 3.
  • Pulso 4, modo Up: incrementa \,011 \to 100. Portanto Q_C=1,\;Q_B=0,\;Q_A=0. Posição decimal 4.
  • Pulso 5, modo Down: agora decrementar \,100 \to 011. Portanto Q_C=0,\;Q_B=1,\;Q_A=1. Posição decimal 3.
  • Pulso 6, modo Down: decrementar \,011 \to 010. Portanto Q_C=0,\;Q_B=1,\;Q_A=0. Posição decimal 2.
  • Pulso 7, modo Up: voltar a Up e incrementar \,010 \to 011. Portanto Q_C=0,\;Q_B=1,\;Q_A=1. Posição decimal 3.
  • Pulso 8, modo Up: incrementar \,011 \to 100. Portanto Q_C=1,\;Q_B=0,\;Q_A=0. Posição decimal 4.
Agora apresento a tabela completa com as linhas pedidas.

Passo 7

Tabela completa finalizada (cada linha é o estado após o pulso correspondente):
\begin{array}{|l|l|c|c|c|c|} \hline \text{Evento} & \text{Modo} & Q_C & Q_B & Q_A & \text{Posição (decimal)}\\\ \hline \text{Inicial (home)} & - & 0 & 0 & 0 & 0\\\ \hline \text{Pulso 1} & \text{Up} & 0 & 0 & 1 & 1\\\ \hline \text{Pulso 2} & \text{Up} & 0 & 1 & 0 & 2\\\ \hline \text{Pulso 3} & \text{Up} & 0 & 1 & 1 & 3\\\ \hline \text{Pulso 4} & \text{Up} & 1 & 0 & 0 & 4\\\ \hline \text{Pulso 5} & \text{Down} & 0 & 1 & 1 & 3\\\ \hline \text{Pulso 6} & \text{Down} & 0 & 1 & 0 & 2\\\ \hline \text{Pulso 7} & \text{Up} & 0 & 1 & 1 & 3\\\ \hline \text{Pulso 8} & \text{Up} & 1 & 0 & 0 & 4\\\ \hline \end{array}

Resposta

Q_CQ_BQ_A = 100 \Rightarrow Posição final 4

Exercícios relacionados