Altifigence Academy

16 / 37 · Concept

Compteurs modulo, saturation et impulsion terminale

Définir le traitement du maximum et le cycle exact du signal terminal-count.

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.

Cnextwrap=(C+1) mod 2NC_{next}^{wrap}=(C+1)\bmod2^N
Cnextsat=min⁡(C+1,2N−1)C_{next}^{sat}=\min(C+1,2^N-1)

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.

Trois politiques après la valeur maximale
Voir les données du chronogramme
Données du chronogramme : chaque caractère représente un intervalle ; un point maintient l'état précédent ; p représente un cycle d'horloge.
SignalForme d'ondeValeurs du bus
edge234523452E0 → E1 → E2 → E3 → E4 → E5 → E6 → E7 → E8
mod10 après2345234529 → 0 → 1 → 2 → 3 → 4 → 5 → 6 → 7
wrap4 après2345234529 → 10 → 11 → 12 → 13 → 14 → 15 → 0 → 1
sat4 après2345234..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 ».

SystemVerilog
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
end

L'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.

Arrêt ou retour à zéro au maximum sur 4 bits

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.

Votre choix s’applique à ce navigateur. Modifiez-le à tout moment en bas de page.