Registres et compteurs

Registre

Un registre est un circuit qui permet de mémoriser plusieurs bits simultanément. Typiquement, on construit un registre en utilisant NN bascules D qui seront synchronisées sur le même signal d’horloge.

Si ces bascules D possèdent une entrée de validation EE, elles seront également reliées ensemble pour que toutes les bascules se mettent à jour sur les mêmes fronts d’horloge.

La figure ci-dessous représente un registre de 4 bits, son symbole à gauche et la structure interne à droite.

Registre D de 4 bits

Registre à décalage

Dans une période du signal d’horloge, la valeur de la sortie Q est égale à la valeur que son entrée D avait au front d’horloge précédent. Si D ne change pas plus d’une fois pendant chaque période d’horloge, la sortie Q suit les variations de D, mais avec un retard. Un exemple de scénario est représenté sur ce chronogramme :

Effet retard avec une bascule D

En mettant en cascade plusieurs bascules, chacune va introduire son propre retard. Ainsi, la sortie Q de la NNième bascule reproduit l’entrée D de la première bascule avec NN fronts d’horloge de retard. Le schéma et le chronogramme ci-dessous représentent la structure et le comportement d’un circuit composé de trois bascules en cascade.

Registre à décalage sur 3 bits (structure) Registre à décalage sur 3 bits (chronogramme)

Le circuit que nous venons de représenter s’appelle un registre à décalage. Il doit son nom au fait que la valeur du registre – c’est-à-dire le vecteur formé par les valeurs des sorties Q – se décale d’un bit à chaque front d’horloge. Ce registre est dit à chargement série, c’est-à-dire que pour écrire une valeur dans les trois bascules, il faut présenter les bits un par un sur l’entrée D0D_0 et attendre une période d’horloge entre deux bits successifs.

Dans un registre à décalage à chargement parallèle, il est possible d’écrire dans toutes les bascules simultanément. Une entrée de commande permet de sélectionner le mode chargement ou le mode décalage. Dans l’exemple représenté ci-dessous, ce rôle est joué par l’entrée LOADLOAD :

Registre à décalage sur 3 bits avec chargement parallèle (structure)

Compteur synchrone

Un compteur est un circuit logique qui produit une séquence prédéfinie de valeurs entières au cours du temps, au rythme d’un signal d’horloge. Ces valeurs entières sont représentées en binaire sur un nombre de bits fixé.

Dans le cas le plus fréquent, on utilise un compteur pour produire une séquence d’entiers dans l’ordre croissant en partant de zéro. On parle de compteur modulo N lorsque le compteur compte jusqu’à une valeur N-1 et revient à zéro ensuite. Un décompteur est un circuit qui produit la même séquence dans l’ordre décroissant.

Le fonctionnement d’un compteur synchrone peut être décrit de la manière suivante :

Exemple

Construisons un compteur modulo 6. Nous noterons kk sa valeur courante. La valeur suivante calculée par le circuit sera notée kk^*. Voici un algorithme qui détaille ce calcul :

répéter
    si k = 5 alors
        k* ← 0
    sinon
        k* ← k + 1
    fin si
fin répéter

La boucle répéter est là pour rappeler qu’un circuit logique est en permanence à l’écoute de ses entrées et recalcule ses sorties dès qu’il détecte un changement. Ici, dès que kk change, une nouvelle valeur de kk^* est automatiquement calculée.

La valeur courante du compteur sera mise à jour à chaque front montant d’un signal d’horloge que nous nommerons clkclk. kk devra rester stable entre deux fronts d’horloge pour que le calcul de kk^* donne un résultat correct. Nous souhaitons également pouvoir remettre kk à zéro dès qu’une commande resetreset est active.

répéter
    si reset = 1 alors
        k ← 0
    sinon, si front-montant(clk) alors
        k ← k*
    fin si
fin répéter

À partir de ces algorithmes, nous pouvons commencer à proposer la structure d’un circuit. Tout d’abord, nous représenterons les valeurs de kk et kk^* en binaire sur trois bits. Le calcul de kk^* utilisera les composants suivants :

Structure d'un compteur synchrone modulo 6

Pour aller plus loin, nous pouvons proposer une version plus légère de ce circuit. En effet, le calcul de kk^* peut être réécrit sous la forme d’une table de vérité :

k2k_2 k1k_1 k0k_0 k2k_2^* k1k_1^* k0k_0^*
0 0 0 0 0 1
0 0 1 0 1 0
0 1 0 0 1 1
0 1 1 1 0 0
1 0 0 1 0 1
1 0 1 0 0 0

À partir de cette table de vérité, nous proposons les équations suivantes :

k0=k0k1=k2(k1k0)k2=k2k0+k1k0\begin{aligned} k_0^* &= \overline{k_0} \\ k_1^* &= \overline{k_2} \cdot (k_1 \oplus k_0) \\ k_2^* &= k_2 \cdot \overline{k_ 0} + k_1 \cdot k_0 \end{aligned}

Structure d'un compteur synchrone modulo 6 (optimisé)

Le chronogramme ci-dessous représente un scénario de fonctionnement de ce compteur. Au démarrage, nous faisons l’hypothèse que le compteur est à zéro. À chaque front d’horloge (en orange), la valeur courante (k2,k1,k0)(k_2, k_1, k_0) est mise à jour. Cette mise à jour déclenche le calcul de la valeur suivante (k2,k1,k0)(k_2^*, k_1^*, k_0^*).

Ce calcul n’est pas instantané : le chronogramme représente en violet la durée pendant laquelle les valeurs binaires traversent les portes logiques jusqu’à produire une valeur stable en k2k_2^*, k1k_1^* et k0k_0^*. Pendant cette durée, ces trois signaux peuvent prendre des valeurs transitoires qui sont représentées par les zones hachurées. Pour ne pas surcharger le dessin, nous avons supposé que les trois signaux mettent autant de temps à se stabiliser mais ce n’est pas forcément le cas.

Chronogramme d'un compteur synchrone modulo 6

Un tel compteur est dit synchrone car tous les bits qui composent sa valeur sont mis à jour simultanément sur le même front d’horloge. Cette technique de construction de compteurs se distingue des compteurs asynchrones dans lesquels la sortie de chaque bascule sert d’horloge pour la bascule suivante.

Ainsi, dans un compteur asynchrone, les bits de la valeur courante sont mis à jour un par un après le front d’horloge. Si le compteur est connecté à d’autres circuits qui doivent déclencher des actions en fonction de la valeur courante, les états transitoires du compteur peuvent avoir des effets inattendus.

Pour cette raison, l’utilisation de compteurs asynchrone est déconseillée et ne sera pas détaillée dans ce cours.

Le chronogramme peut devenir difficile à lire lorsque le circuit contient des vecteurs avec un grand nombre de bits. Dans ce cas, il est d’usage de regrouper tous les bits d’un vecteur sur une seule ligne. Si ce vecteur représente un nombre entier, le chronogramme sera plus lisible en représentant ce nombre en décimal ou en hexadécimal.

Chronogramme d'un compteur synchrone modulo 6 (condensé)

Résumé

Un registre est un groupe de bascules D qui permet de mémoriser une information représentée sur plusieurs bits. Toutes ses bascules sont synchronisées sur le même signal d’horloge.

Un registre à décalage est un registre dont les bascules sont reliées en cascade. À chaque front d’horloge, la valeur du registre se décale d’un bit.

Un compteur modulo NN est un circuit logique qui produit la séquence des valeurs entières de zéro à N-1 au rythme d’un signal d’horloge.