5 / 24 · Concept
Lire les transferts entre registres aux fronts d’horloge
Distinguez l’état précédent de l’état suivant et suivez la conservation des valeurs stockées par les signaux d’activation.
Les leçons sont gratuites. Inscrivez-vous pour enregistrer vos progrès.
Tous les registres lisent l’état précédent
Commencez par identifier l’information qui doit subsister entre les cycles. Un accumulateur, des opérandes capturés, un compteur de boucle et le signal de validité de sortie sont des états. La somme de l’accumulateur courant et de l’opérande est une valeur combinatoire. Écrire une variable n’explique pas à lui seul son stockage ; précisez l’événement qui capture sa valeur.
Cet accumulateur ajoute x uniquement aux fronts montants où en est actif. Lorsque en est bas, il conserve sa valeur. Un résultat intermédiaire sur neuf bits rend l’addition explicite ; la sélection de ses huit bits de poids faible définit un comportement modulo 256. Les affectations non bloquantes dans always_ff planifient l’état suivant à partir des valeurs lues au front courant. Interpréter ce bloc comme des affectations logicielles immédiates conduit à une lecture incorrecte lorsque plusieurs registres interviennent.
logic [7:0] acc;
logic [8:0] next_sum;
assign next_sum = {1'b0, acc} + {1'b0, x};
always_ff @(posedge clk) begin
if (rst) acc <= 8'd0;
else if (en) acc <= next_sum[7:0];
endLa réinitialisation est synchrone et prioritaire sur l’activation. L’absence d’affectation séquentielle lorsque en est bas signifie que le registre conserve sa valeur. L’absence d’affectation dans un chemin combinatoire peut en revanche inférer un verrou involontaire. Dans une logique combinatoire d’état suivant, fournissez des valeurs par défaut, puis remplacez-les pour les conditions particulières.
| Front | rst | en | x | Ancien acc | Nouvel acc |
|---|---|---|---|---|---|
| 0 | 1 | 1 | 9 | Inconnu | 0 |
| 1 | 0 | 1 | 7 | 0 | 7 |
| 2 | 0 | 0 | 100 | 7 | 7 |
| 3 | 0 | 1 | 250 | 7 | 1 |
Au front 2, l’entrée visible 100 n’a pas été acceptée. Au front 3, 7+250=257 est réduit à 1. Distinguer la présentation de l’acceptation reste essentiel lorsque en devient ensuite valid ET ready.
Pour a<=x; b<=a;, les anciennes valeurs a=5 et x=9 produisent a=9 et b=5. Si b doit recevoir 9, connectez son entrée à x. Complétez d’abord la colonne de l’état précédent, puis calculez toutes les valeurs de l’état suivant ensemble ; cela révèle les décalages d’un cycle entre données et commande.
Essayez vous-même
Initialement, a=4 et b=0. Les entrées x valent 8 puis 12, avec a<=x; b<=a à chaque front. Que valent a et b après le deuxième front ?
Lire l’explication
Après le premier front, a=8 et b=4. Après le deuxième, a=12 et b=8. Chaque mise à jour de b utilise l’ancien a : x=12 ne traverse donc pas les deux registres au même front.