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 |
---|---|---|---|
Entrée | Bit | Signal d’horloge à 1 kHz | |
Sortie | Vecteur | La valeur des millisecondes courantes | |
Sortie | Vecteur | La valeur des secondes courantes | |
Sortie | Vecteur | La valeur des minutes courantes | |
Sortie | Vecteur | La valeur des heures courantes | |
Entrée | Vecteur | La valeur des minutes pour l’alarme | |
Entrée | Vecteur | La valeur des heures pour l’alarme | |
Sortie | Bit | La commande de la sonnerie | |
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 :
L’horloge à 1 kHz produit un front montant toutes les millisecondes. Elle servira à commander un compteur modulo 1000 qui produira la sortie . Le circuit sera également constitué de trois autres compteurs : modulo 60 pour les secondes (), modulo 60 pour les minutes () et modulo 24 pour les heures ().
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 est activée. Elle revient à zéro lorsque 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 |
---|---|---|
Bit | Indique que le compteur des millisecondes a atteint sa valeur maximale. Déclenche l’incrémentation des secondes. | |
Bit | Indique que le compteur des secondes a atteint sa valeur maximale. Déclenche l’incrémentation des minutes. | |
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.
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.
À 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 , nous pouvons observer le comportement suivant :
À 7:59:59, au moment où revient à zéro, il déclenche le retour à zéro de , qui déclenche le retour à zéro de , qui déclenche l’incrémentation de . 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.
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 |
---|---|---|
Bit | Indique que le compteur des millisecondes a atteint sa valeur maximale. Autorise l’incrémentation des secondes. | |
Bit | Indique que le compteur des secondes a atteint sa valeur maximale. Autorise l’incrémentation des minutes. | |
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 soit à 1 et qu’il y ait un front montant sur . Les compteurs des minutes et des heures seront gérés de la même manière.
Dans le circuit, tous les registres sont synchronisés sur les fronts montants de . L’entrée 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 :
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.
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 des bascules permet de sélectionner les fronts sur lesquels la mise à jour sera autorisée.
Les verrous RS et D sont interdits.
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 :
La partie combinatoire du premier circuit introduit un délai entre la mise à jour de et le front de . 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 pour autoriser la mise à jour de au front d’horloge suivant. La logique combinatoire utilise la valeur suivante de , disponible sur l’entrée . 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.
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 :