Clock como referência temporal
Em muitos circuitos digitais, não basta saber se um sinal é 0 ou 1: também importa quando ele muda. O clock é um sinal periódico usado como referência de tempo para coordenar atualizações de estado. Em vez de cada parte do circuito “decidir” em momentos diferentes, o clock cria instantes bem definidos (as bordas) em que registradores e flip-flops capturam valores.
Pense no clock como um “metrônomo” do circuito: a cada batida (borda), certos elementos armazenam novos dados, e entre batidas a lógica combinacional tem tempo para calcular o próximo valor.
Combinacional vs. sequencial (diferença prática)
- Circuito combinacional: a saída depende apenas das entradas atuais. Se uma entrada muda, a saída muda após um certo atraso. Não há memória.
- Circuito sequencial: a saída depende das entradas atuais e de um estado armazenado (memória). Esse estado costuma ser atualizado em instantes definidos pelo clock (ex.: em uma borda).
Consequência prática: em um sistema sequencial, você quer que as entradas de um registrador estejam estáveis ao redor do instante de captura (borda do clock). Se não estiverem, o registrador pode capturar um valor errado.
Bordas do clock: subida e descida
Um clock ideal alterna entre 0 e 1 com transições instantâneas. Na prática, as transições têm inclinação, mas ainda chamamos de:
- Borda de subida (rising edge): transição de 0 para 1.
- Borda de descida (falling edge): transição de 1 para 0.
Muitos flip-flops são sensíveis a apenas uma borda (por exemplo, “acionado na borda de subida”). Isso significa que o valor de entrada é amostrado naquele instante, e o estado interno muda logo depois (com um pequeno atraso).
- Ouça o áudio com a tela desligada
- Ganhe Certificado após a conclusão
- + de 5000 cursos para você explorar!
Baixar o aplicativo
Período e frequência
- Período (T): tempo de um ciclo completo do clock.
- Frequência (f): quantos ciclos por segundo. Relação:
f = 1/T.
Exemplo: se T = 20 ns, então f = 50 MHz.
Duty cycle (ciclo de trabalho)
O duty cycle é a porcentagem do período em que o clock fica em nível alto. Um clock “50%” fica metade do tempo em 1 e metade em 0.
Por que importa? Alguns circuitos usam a fase alta e a fase baixa para gerar sinais internos, ou dependem de tempos mínimos em nível alto/baixo. Duty cycle muito distorcido pode reduzir a “janela” disponível para a lógica estabilizar entre bordas relevantes.
Jitter (variação temporal)
Jitter é a variação do instante real das bordas em relação ao instante ideal. Em termos simples: o clock “não bate sempre exatamente no mesmo tempo”.
- Jitter baixo: bordas bem regulares.
- Jitter alto: bordas “tremidas” no tempo, reduzindo margens de segurança.
Consequência prática: jitter reduz a folga de tempo para a lógica combinacional terminar antes da próxima captura, aumentando risco de erro em altas frequências.
Tempo de propagação e por que ele causa erros
Quando uma entrada de uma porta lógica muda, a saída não muda instantaneamente. O tempo entre a mudança na entrada e a mudança observável na saída é o tempo de propagação (geralmente indicado como t_pd).
tPLH e tPHL (subida e descida podem ser diferentes)
tPLH: atraso para a saída ir de 0 para 1 após a entrada causar essa mudança.tPHL: atraso para a saída ir de 1 para 0.
Em muitos componentes, tPLH e tPHL não são iguais. Isso pode afetar forma de onda, duty cycle e alinhamento entre sinais.
Acúmulo de atrasos em cascata
Em um caminho com várias portas em série, os atrasos se somam aproximadamente:
t_total ≈ t_pd1 + t_pd2 + ... + t_pdn
Isso é a base para estimar a frequência máxima de um sistema síncrono: a lógica entre registradores precisa “caber” dentro de um ciclo de clock (considerando margens).
Glitches (pulsos espúrios) em lógica combinacional
Mesmo que a função lógica final esteja correta, diferentes caminhos podem ter atrasos diferentes. Quando entradas mudam quase ao mesmo tempo, a saída pode passar por valores intermediários por alguns nanossegundos, gerando um glitch (um pulso curto indesejado).
Consequência prática: se um glitch atingir a entrada de um registrador perto da borda de captura, o registrador pode amostrar o valor errado, mesmo que “em média” a lógica esteja correta.
Noções de setup e hold (sem fórmulas pesadas)
Para um registrador capturar corretamente um dado, a entrada precisa estar estável em uma janela ao redor da borda do clock:
- Setup time (t_setup): tempo mínimo que o dado deve estar estável antes da borda ativa do clock.
- Hold time (t_hold): tempo mínimo que o dado deve permanecer estável depois da borda ativa.
Se o dado muda dentro dessa janela, podem ocorrer:
- Contagem errada em contadores e máquinas de estado (captura de bit incorreto).
- Comportamento intermitente: falha que “vai e volta” dependendo de temperatura, tensão, ruído e variações de fabricação.
- Glitches capturados: um pulso curto pode ser registrado como se fosse um nível válido.
Como visualizar a janela de captura
Imagine a borda do clock como um “clique” de câmera. O setup é o tempo para o objeto parar de se mexer antes da foto; o hold é o tempo para continuar parado logo após. Se mexer durante a foto, a imagem sai borrada (dado incerto).
Passo a passo: estimando atrasos e verificando se “cabe no clock”
1) Desenhe o caminho entre registradores
Identifique um registrador de origem (que lança o dado) e um registrador de destino (que captura). Entre eles haverá um bloco combinacional (portas, multiplexadores, comparadores etc.).
2) Conte os níveis lógicos (estimativa rápida)
Uma estimativa inicial é contar quantas “camadas” de portas o sinal atravessa no pior caso. Exemplo: AND → OR → XOR = 3 níveis.
3) Multiplique por um atraso típico (estimativa grosseira)
Se você tiver um valor típico de atraso por porta (por exemplo, consultado em datasheet da família usada), estime:
t_logic ≈ N_niveis × t_pd_por_porta
Exemplo: 3 níveis × 8 ns ≈ 24 ns.
4) Compare com o período do clock
Para funcionar com folga, o tempo disponível entre bordas deve ser maior que o atraso total do caminho (incluindo atrasos do registrador e margens). Como regra prática para iniciantes: se sua estimativa de lógica já está perto do período do clock, você está em zona de risco.
5) Procure caminhos “mais longos” e sinais críticos
O caminho que tem mais níveis lógicos, mais fan-out (muitas entradas sendo dirigidas) ou mais carga tende a ser o limitante. Esse é o candidato a precisar de reestruturação (pipeline) ou redução de lógica.
Passo a passo: organizando sinais em blocos para estabilidade
Uma forma prática de evitar glitches capturados e facilitar o sincronismo é estruturar o projeto em blocos:
- Registradores de entrada: capturam sinais vindos de fora do bloco (ou de outro clock).
- Lógica combinacional: calcula o “próximo valor”.
- Registradores de saída: armazenam o resultado na borda do clock.
1) Defina o que deve ser registrado
Qualquer sinal que será usado em decisões importantes (habilitar contagem, selecionar caminho, gerar pulso) tende a ser mais seguro quando registrado, porque passa a mudar apenas nas bordas do clock.
2) Separe “estado atual” e “próximo estado”
Mesmo sem entrar em formalismos, use a ideia:
- Estado atual: saídas dos registradores.
- Próximo estado: resultado da lógica combinacional.
Assim, a lógica pode ter glitches internamente, mas o estado só muda na borda, quando o próximo estado já deveria estar estável.
3) Evite usar sinais combinacionais como “clock”
Um erro comum é gerar um “clock” a partir de portas (gating) para acionar flip-flops. Como portas têm atrasos e podem gerar glitches, isso cria bordas extras ou deslocadas. Prefira usar enable (habilitação) com clock único, quando possível.
4) Se um sinal é crítico, registre-o
Se um sinal combinacional alimenta diretamente algo sensível (como um contador habilitado por pulso), considere registrar esse pulso (ou gerar pulso síncrono) para garantir largura mínima e alinhamento com o clock.
Atividades práticas
Atividade 1 — Estimativa de atraso em cascata
Você tem um caminho combinacional com 5 portas em série. O datasheet indica atraso típico de 6 ns por porta (use como aproximação) e pior caso de 10 ns por porta.
- Calcule o atraso típico:
t_typ ≈ 5 × 6 ns. - Calcule o pior caso:
t_wc ≈ 5 × 10 ns. - Para um clock de 20 MHz (
T = 50 ns), discuta: o típico “cabe”? e o pior caso “cabe” com folga?
Atividade 2 — Qual é a frequência máxima aproximada?
Considere um caminho entre registradores com atraso combinacional estimado de 32 ns. Assuma que você quer pelo menos 20% de folga no período (margem para variações e jitter).
- Encontre um período mínimo aproximado:
T_min ≈ 32 ns / 0,8. - Converta para frequência:
f_max ≈ 1/T_min.
Atividade 3 — Identificando risco de glitch
Um sinal de saída é Y = A XOR B, e A e B vêm de caminhos com atrasos diferentes (A chega 8 ns antes de B). Se A e B mudam “ao mesmo tempo” na origem, descreva o que pode acontecer em Y durante esses 8 ns.
- Explique por que isso pode virar um pulso curto.
- Diga uma forma de evitar que esse pulso seja capturado por um registrador (dica: registrar Y ou registrar A e B antes do XOR).
Atividade 4 — Organize em blocos (combinacional + registradores)
Você tem um circuito que soma dois valores, compara com um limite e, se passar do limite, incrementa um contador. Reorganize em blocos síncronos:
- Liste quais sinais devem ser registrados na entrada (ex.: operandos, limite).
- Defina um bloco combinacional (soma + comparação).
- Defina quais saídas devem ser registradas (ex.: resultado da comparação, enable do contador).
Objetivo: garantir que o contador só veja um enable estável e alinhado ao clock, reduzindo risco de contagem errada por glitches.
Atividade 5 — Janela de setup/hold (raciocínio qualitativo)
Um registrador captura na borda de subida. Você observa que um sinal de dado muda muito perto dessa borda e, às vezes, o sistema falha.
- Explique com suas palavras o que significa violar setup e hold.
- Cite duas ações práticas para aumentar a chance de o dado estar estável na borda (ex.: registrar o sinal um estágio antes; reduzir níveis lógicos no caminho; diminuir a frequência do clock).