LOGIQUE PROGRAMMABLE EN VERILOG
Chapitre 1. Introduction
Chapitre 2. Traitement combinatoire et syntaxe du langage
Chapitre 3. L'usage de l'outil QUARTUS II
Chapitre 4. Description comportementale
4.1. Le bloc always et le type reg
4.2. Les opérateurs conditionnels
4.3. La mémoire élémentaire
4.4. L'alternative multiple
4.5. Exemple de description par table de vérité
4.6. Traitement séquentiel par l'exemple
4.7. Exercices
4.8. Solutions des exercices
4.8.1. Bascule JK
4.8.2. Compteur-décompteur 4 bits BCD avec chargement synchrone
4.8.3. Bascule 74LS73A
4.8.4. Compteur BCD modulo 100
4.8.5. Le compteur 74LS168
4.8.6. Le registre universel 74LS194
Chapitre 5. Projets : énoncés
Chapitre 6. Projets : vers la solution
Page d'accueil Table des matières Niveau supérieur Page précédente Bas de la page Page suivante

4.8.4. Compteur BCD modulo 100

Un compteur BCD modulo 100 dont on ne précise pas d'autres informations ne possède qu'une entrée d'horloge nommée CLK et une sortie 8 bits (4 par digit) nommée Q.

Le comptage doit s'effectuer de 0 à 99 et ainsi de suite.

Les opérations se font en binaire dans le composant programmable.

La valeur 99 en sortie se représente et vaut 99H et non 99d,

L'hexadécimal connait 16 valeurs (tous les codes binaires sur 4 bits), le BCD n'en connait que 10 (écart de 6) sur le même nombre de bits.

 

2 solutions se présentent :

  1. Compter de 0 à 99 en binaire et convertir le nombre binaire en BCD (division par 10),
  2. Compter en BCD de 0 à 99 directement.

Si on choisit le 1ère solution :

module CptModulo100(clk, Q) ;

input clk ;

output [7 ; 0] Q ;

reg [6 : 0] N ;

wire [3 :0] Dizaine, Unite ;

always @ (posedge clk)

begin

N = N+1 ;

if (N==100)

N = 0 ;

end

assign Dizaine = N /10 ; // Division entière

assign Unite = N %10 ; // Reste de la division entière

assign Q = {Dizaine, Unite} ;

endmodule

 

Si on choisit la 2nde solution :

module CptModulo100(clk, Q) ;

input clk ;

output [7 ; 0] Q ;

reg [7 : 0] Q ;

always @ (posedge clk)

begin

Q = Q+1 ;

if ((Q & 8'h0f) >9) // détection de dépassement

begin

Q = Q + 6 ; // pour compenser

if (Q > 8'h99)

Q = 0;

end

end

endmodule

 
Page d'accueil Table des matières Niveau supérieur Page précédente Haut de la page Page suivante