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 :
- Compter de 0 à 99 en binaire et
convertir le nombre binaire en BCD (division par 10),
- 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