16 / 37 · Concetto
Contatori modulari, saturanti e impulso terminale
Progettare la gestione del massimo e il ciclo esatto del terminal count.
Le lezioni sono gratuite. Iscriviti per salvare i progressi.
Tre politiche diverse per il superamento del campo
Lo stesso registroRegistro Memorizza uno stato di più bit. I registri sincroni del corso acquisiscono gli ingressi specificati al fronte di clock. Approfondisci a N bit può ritornare a zero, saturare al massimo o segnalare un errore: lo decide la specifica.
Un contatore modulare a otto bit passa da 255 a 0, uno saturante resta a 255: sono funzioni diverse. Un accumulatore con valori positivi e negativi richiede anche campo signed e due limiti di saturazione.
Ogni colonna registra un fronte di salitaFronte di salita Passaggio del clock da 0 a 1, distinto dall’intero intervallo di livello CLK=1. Approfondisci. Gli ingressi sono quelli immediatamente precedenti; gli stati con „after“ quelli subito dopo l’aggiornamento. Le colonne indicano l’ordine dei campioni, non il ritardo fisico di propagazioneRitardo di propagazione Tempo dalla variazione d’ingresso all’assestamento corretto dell’uscita. Equivalenza logica e proprietà temporali sono distinte. Approfondisci. Inizialmente count=8, reset=0, enable=1. Con gli stessi ingressi, modulo 10, wrap a quattro bit e saturazione a quattro bit seguono traiettorie diverse.
Mostra i dati della forma d’onda
| Segnale | Forma d’onda | Valori del bus |
|---|---|---|
| edge | 234523452 | E0 → E1 → E2 → E3 → E4 → E5 → E6 → E7 → E8 |
| mod10 after | 234523452 | 9 → 0 → 1 → 2 → 3 → 4 → 5 → 6 → 7 |
| wrap4 after | 234523452 | 9 → 10 → 11 → 12 → 13 → 14 → 15 → 0 → 1 |
| sat4 after | 2345234.. | 9 → 10 → 11 → 12 → 13 → 14 → 15 |
Confrontare l'ultimo stato modulo M
Per un impulso ogni dieci avanzamenti si usano gli stati 0–9 contando solo i fronti abilitati. Un pulse registrato può significare: «a questo fronte si è consumato 9 ed è avvenuto il ritorno 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
endL'assegnazione predefinita riporta pulse a 0 al fronte successivo. L'uscita semplice count==9 può invece restare 1 per più cicli se enable=0. Distinguete stato terminale ed evento di completamento.
Da dove si conta il periodo
Dopo reset a count=0, il primo pulse richiede dieci fronti con enable=1. Più che chiamare il primo fronte 0 o 1, conta usare definizioni coerenti nella tabella di ingressi, stato e uscite.
Il laboratorio è un contatore modulo 16. Da 1110 passa a 1111 e poi 0000. Fermatelo a 1111 con enable=0: mantenimento e saturazione sembrano uguali ma differiscono alla ripresa. Quale valore dovrebbe dare un contatore saturante?
Il reset sincrono ha priorità su enable. Con enable=0, il valore memorizzato viene mantenuto. q=1110; q_next = (q + 1) mod 16
Prova tu
Da count=9, pulse=0 seguono due fronti con en=0 e uno con en=1. Come cambiano count e pulse?
Leggi la spiegazione
Nei due fronti fermi restano count=9, pulse=0. Al terzo diventano count=0, pulse=1. Al successivo l’assegnazione predefinita riporta pulse a 0.