Conception de circuits synchrones

Exemple : conception d’un réveil numérique

Nous allons réaliser la partie commande d’un réveil numérique. Ce circuit aura les fonctionnalités suivantes :

Les entrées/sorties de ce circuit sont détaillées dans ce tableau :

Signal Direction Type Rôle
clkmsclk_{ms} Entrée Bit Signal d’horloge à 1 kHz
msms Sortie Vecteur La valeur des millisecondes courantes
secsec Sortie Vecteur La valeur des secondes courantes
minmin Sortie Vecteur La valeur des minutes courantes
hrhr Sortie Vecteur La valeur des heures courantes
minamin_a Entrée Vecteur La valeur des minutes pour l’alarme
hrahr_a Entrée Vecteur La valeur des heures pour l’alarme
buzzbuzz Sortie Bit La commande de la sonnerie
bpbp Entrée Bit L’état du bouton d’arrêt de l’alarme

Voici un scénario de fonctionnement en supposant que l’alarme a été programmée à 7:00 :

Réveil numérique : chronogramme de principe

Réalisation asynchrone

L’horloge à 1 kHz produit un front montant toutes les millisecondes. Elle servira à commander un compteur modulo 1000 qui produira la sortie msms. Le circuit sera également constitué de trois autres compteurs : modulo 60 pour les secondes (secsec), modulo 60 pour les minutes (minmin) et modulo 24 pour les heures (hrhr).

Les compteurs sont mis en cascade de manière à respecter le comportement suivant :

Lorsque l’heure courante est égale à l’heure programmée, la sortie buzzbuzz est activée. Elle revient à zéro lorsque bpbp passe à 1.

Dans cette première version du circuit, nous choisissons de créer des signaux d’horloge intermédiaires pour les compteurs des secondes, minutes et heures :

Signal Type Rôle
clksecclk_{sec} Bit Indique que le compteur des millisecondes a atteint sa valeur maximale. Déclenche l’incrémentation des secondes.
clkminclk_{min} Bit Indique que le compteur des secondes a atteint sa valeur maximale. Déclenche l’incrémentation des minutes.
clkhrclk_{hr} Bit Indique que le compteur des minutes a atteint sa valeur maximale. Déclenche l’incrémentation des heures.

Come le montre le chronogramme ci-dessous, les compteurs des secondes, minutes et heures se mettent à jour sur des fronts descendants des trois signaux d’horloge intermédiaires.

Réveil numérique : chronogramme avec cascade asynchrone

Le circuit est construit en respectant le principe de construction de compteurs expliqué dans la section précédente. Ici, les compteurs des secondes, minutes et heures utilisent des registres qui réagissent sur fronts descendants. Le comparateur en sortie de chaque compteur produit l’horloge du compteur suivant.

Réveil numérique : structure avec cascade asynchrone

À première vue, ce circuit réalise bien la fonction demandée. Il compte le temps correctement et déclenche l’alarme à l’heure programmée. Cependant, si nous regardons plus en détail les valeurs transitoires après un front montant de l’horloge clkmsclk_{ms}, nous pouvons observer le comportement suivant :

Réveil numérique : chronogramme avec cascade asynchrone (détail)

À 7:59:59, au moment où msms revient à zéro, il déclenche le retour à zéro de secsec, qui déclenche le retour à zéro de minmin, qui déclenche l’incrémentation de hrhr. Les compteurs se mettent à jour l’un après l’autre. Pendant une courte durée, l’heure affichée sera 7:59:00, puis 7:00:00, et enfin 8:00:00.

Ces valeurs transitoires sont invisibles pour un observateur humain. L’affichage du réveil semble passer instantanément de 7:59:59 à 8:00:00. Cependant, dans cet exemple, l’état transitoire à 7:00:00 peut suffire à déclencher l’alarme.

Réalisation synchrone

Nous allons modifier le circuit de manière à garantir que les compteurs des secondes, minutes et heures ont toujours des valeurs cohérentes. Le nouveau circuit reposera sur deux principes :

Nous allons renommer les signaux intermédiaires et leur donner un rôle différent :

Signal Type Rôle
ensecen_{sec} Bit Indique que le compteur des millisecondes a atteint sa valeur maximale. Autorise l’incrémentation des secondes.
enminen_{min} Bit Indique que le compteur des secondes a atteint sa valeur maximale. Autorise l’incrémentation des minutes.
enhren_{hr} Bit Indique que le compteur des minutes a atteint sa valeur maximale. Autorise l’incrémentation des heures.

Pour que le compteur des secondes se mette à jour, il faudra que ensecen_{sec} soit à 1 et qu’il y ait un front montant sur clkmsclk_{ms}. Les compteurs des minutes et des heures seront gérés de la même manière.

Réveil numérique : chronogramme avec cascade synchrone

Dans le circuit, tous les registres sont synchronisés sur les fronts montants de clkmsclk_{ms}. L’entrée EE de chaque registre permet d’autoriser sa mise à jour à chaque fois que le compteur précédent a atteint sa valeur maximale. Les portes ET assurent les conditions suivantes :

Réveil numérique : structure avec cascade synchrone

En regardant le chronogramme au moment où le réveil passe de 7:59:59 à 8:00:00, nous observons que les états transitoires ont lieu avant le front d’horloge. Au moment du front d’horloge, tous les signaux se sont stabilisés et les registres prennent simultanément leur valeur définitive.

Réveil numérique : chronogramme avec cascade synchrone (détail)

Règles de conception de circuits synchrones

Synchronisation sur fronts

Dans un circuit synchrone, chaque élément de mémorisation doit mettre sa valeur à jour sur des fronts d’un signal d’horloge et maintenir sa valeur stable entre les fronts. L’élément de mémorisation de base est la bascule D, à partir de laquelle on peut construire des registres. L’utilisation de l’entrée EE des bascules permet de sélectionner les fronts sur lesquels la mise à jour sera autorisée.

Les verrous RS et D sont interdits.

Mise à jour simultanée de tous les éléments de mémorisation

Dans un circuit synchrone, tous les éléments de mémorisation doivent se mettre à jour simultanément. Cela signifie en particulier qu’il est interdit de créer des horloges conditionnées (gated clock) comme illustré par le premier circuit sur cette figure :

Horloge conditionnée

La partie combinatoire du premier circuit introduit un délai entre la mise à jour de Q1Q_1 et le front de CLK2CLK_2. Les deux registres ne se mettent pas à jour simultanément. Dans l’exemple du réveil présenté plus haut, les horloges conditionnées engendrent des états transitoires qui peuvent déclencher des actions imprévues – l’activation de l’alarme entre 7:59:59 et 8:00:00.

Le second circuit de la figure ci-dessus calcule E2E_2 pour autoriser la mise à jour de Q2Q_2 au front d’horloge suivant. La logique combinatoire utilise la valeur suivante de Q1Q_1, disponible sur l’entrée D1D_1. Les deux registres sont reliés au même signal d’horloge et se mettent à jour simultanément.

En pratique, dans un circuit synchrone tous les éléments de mémorisation sont synchronisés sur le même front du même signal d’horloge.

Principe de fonctionnement d’un circuit synchrone

Lorsque toutes les bascules du circuit sont commandées par le même signal d’horloge, le circuit est toujours dans un état cohérent. Son fonctionnement est alors guidé par les principes suivants :

Anatomie d'un circuit synchrone