16 / 37 · Conceito
Contadores modulares, saturação e pulsos de término
Projete a política do máximo e o ciclo exato do sinal de fim de contagem.
As aulas podem ser lidas gratuitamente. Inscreva-se para salvar o progresso.
Três políticas diferentes ao exceder o intervalo
Com o mesmo registradorRegistrador Circuito que armazena vários bits de estado. Os registradores síncronos deste curso capturam a entrada especificada na borda de clock. Saiba mais de N bits, a especificação decide se retorna, satura ou indica erro ao atingir o máximo.
Em oito bits, passar de 255 para 0 e permanecer em 255 são funções diferentes. Um acumulador que trate positivos e negativos também precisa do intervalo signed e de saturação nos dois limites.
Cada coluna abaixo registra uma borda de subidaBorda de subida Instante em que o clock passa de 0 para 1. É diferente do nível alto, que abrange todo o intervalo com CLK=1. Saiba mais; entradas anteriores e estados «depois» posteriores. O alinhamento ordena amostras, não representa propagação físicaAtraso de propagação Tempo entre uma mudança de entrada e a estabilização da saída no valor correto. Equivalência lógica e comportamento temporal são propriedades distintas. Saiba mais. Com count=8, reset=0, enable=1 iniciais, módulo 10, retorno de quatro bits e saturação de quatro bits produzem trajetórias diferentes.
Ver os dados da forma de onda
| Sinal | Forma de onda | Valores do barramento |
|---|---|---|
| borda | 234523452 | E0 → E1 → E2 → E3 → E4 → E5 → E6 → E7 → E8 |
| mod10 depois | 234523452 | 9 → 0 → 1 → 2 → 3 → 4 → 5 → 6 → 7 |
| wrap4 depois | 234523452 | 9 → 10 → 11 → 12 → 13 → 14 → 15 → 0 → 1 |
| sat4 depois | 2345234.. | 9 → 10 → 11 → 12 → 13 → 14 → 15 |
Compare o último estado do módulo M
Para um pulso a cada dez incrementos, use estados 0–9 e conte apenas bordas habilitadas. Pode-se registrar pulse com o significado «nesta borda, 9 foi consumido e houve retorno a 0».
always_ff @(posedge clk) begin
if (rst) begin
count <= 4'd0;
pulse <= 1'b0;
end else begin
pulse <= 1'b0;
if (en) begin
if (count == 4'd9) begin
count <= 4'd0;
pulse <= 1'b1;
end else count <= count + 4'd1;
end
end
endA atribuição padrão retorna pulse a 0 na próxima borda. Já uma saída count==9 pode durar vários ciclos se enable=0 parar o contador. Distinga estado terminal de evento de conclusão.
De onde o período é contado
Após reset e partindo de count=0, são necessárias dez bordas com enable=1 para o primeiro pulse. Mais do que chamar a primeira borda de 0 ou 1, importa definir entradas, estados e saídas consistentemente.
O controle abaixo é módulo 16. Partindo de 1110, uma borda dá 1111 e a próxima, 0000. Pare em 1111 com enable=0. Manutenção e saturação podem mostrar o mesmo valor, mas diferem ao retomar. Compare qual valor um contador saturante deveria ter nessas condições.
O reset síncrono tem prioridade sobre enable. Com enable=0, o valor armazenado é mantido. q=1110; q_next = (q + 1) mod 16
Experimente
Com count=9 e pulse=0, passam duas bordas com en=0 e outra com en=1. O que ocorre com count e pulse?
Ler a explicação
Nas duas bordas paradas, mantêm-se count=9 e pulse=0. Na terceira, passam para count=0 e pulse=1. Na borda seguinte, a atribuição padrão retorna pulse a 0.