16 / 37 · Concept
Compteurs modulo, saturation et impulsion terminale
Définir le traitement du maximum et le cycle exact du signal terminal-count.
Les leçons sont gratuites. Inscrivez-vous pour enregistrer vos progrès.
Trois politiques distinctes au dépassement
Avec le même registreRegistre Circuit stockant plusieurs bits d'état. Les registres synchrones du cours capturent leur entrée définie sur un front d'horloge. En savoir plus de N bits, reboucler, conserver le maximum ou signaler une erreur relève de la spécification.
Sur huit bits, passer de 255 à 0 en modulo et rester à 255 par saturation sont deux fonctions différentes. Un accumulateur signé doit aussi définir sa plage et ses deux limites de saturation.
Chaque colonne observe un front montantFront montant Instant où l'horloge passe de 0 à 1, distinct du niveau désignant tout l'intervalle CLK=1. En savoir plus : entrées avant, états after après. L'alignement indique les échantillons, pas un retard physiqueRetard de propagation Temps nécessaire après un changement d'entrée pour que la sortie se stabilise à sa valeur correcte. Équivalence logique et caractéristiques temporelles sont distinctes. En savoir plus. Avec count initial=8, reset=0 et enable=1, modulo-10, rebouclage quatre bits et saturation quatre bits produisent des trajectoires différentes.
Voir les données du chronogramme
| Signal | Forme d'onde | Valeurs du bus |
|---|---|---|
| edge | 234523452 | E0 → E1 → E2 → E3 → E4 → E5 → E6 → E7 → E8 |
| mod10 après | 234523452 | 9 → 0 → 1 → 2 → 3 → 4 → 5 → 6 → 7 |
| wrap4 après | 234523452 | 9 → 10 → 11 → 12 → 13 → 14 → 15 → 0 → 1 |
| sat4 après | 2345234.. | 9 → 10 → 11 → 12 → 13 → 14 → 15 |
Comparer le dernier état de modulo-M
Pour une impulsion tous les dix incréments, utilisez 0–9 et ne comptez que les fronts acceptés avec enable. Une impulsion enregistrée peut signifier « ce front a consommé 9 et est revenu à 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'affectation par défaut remet pulse à 0 au front suivant. Une simple sortie count==9 peut rester à 1 plusieurs cycles si enable=0. Distinguez état terminal et événement d'achèvement.
Définir le point de départ de la période
Après reset à count=0, il faut dix fronts avec enable=1 pour le premier pulse. L'essentiel n'est pas de numéroter le premier front 0 ou 1, mais de garder cohérente la table entrées/état/sortie.
La manipulation est modulo-16. À partir de 1110, un front donne 1111, le suivant 0000. Arrêtez à 1111 avec enable=0. Maintien et saturation peuvent sembler identiques, mais divergent à la reprise. Comparez avec ce que ferait un compteur saturant.
Le reset synchrone est prioritaire sur enable. Si enable=0, conserver la valeur mémorisée. q=1110; q_next = (q + 1) mod 16
Essayez vous-même
Avec count=9,pulse=0, appliquez deux fronts avec en=0, puis un avec en=1. Comment évoluent count et pulse ?
Lire l’explication
Pendant les deux fronts arrêtés, count=9 et pulse=0. Au troisième, count=0 et pulse=1. Au front suivant, l'affectation par défaut remet pulse à 0.