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
Chapitre 5. Projets : énoncés
Chapitre 6. Projets : vers la solution
6.1. Gestion de feux de carrefour tricolores
6.2. Réalisation d'un compte-tours
6.3. Conversion analogique numérique à simple rampe numérique
6.4. Conversion analogique numérique à rampe avec suivi
6.5. Conversion analogique numérique à approximations successives
6.6. Radar de parking
Page d'accueil Table des matières Niveau supérieur Page précédente Bas de la page Page suivante

6.1. Gestion de feux de carrefour tricolores

 

1ère partie :

On a choisi de compter en BCD (ceci évitera de faire une conversion pour l'afficheur, mais le comptage en binaire pur était tout aussi réalisable). Pour compter de 0 à 28h, il faut un compteur 6 bits que l'on remet à 0 après avoir eu l'état 28h.

Les feux piétons seront gérés par rapport aux feux verts, des voies correspondantes.

 

module FeuxTric(horl, V1, O1, R1, V2, O2, R2, PR1, PV1, PR2, PV2, Affich) ;

input horl ;

output V1, O1, R1, V2, O2, R2, PR1, PV1, PR2, PV2 ;

output [6 : 0] Affich ;

reg [5 : 0] S ;

reg [6 : 0] N ;

assign Affich = N ;

assign {V1, O1, R1, V2, O2, R2, PR1, PV1, PR2, PV2} = ~{S, !S[5], S[5], !S[2], S[2]};

always @ (posedge horl)

begin

N = N +1 ;

if ((N &6'h0f) > 9)

N = N + 6 ;

if (N > 6'h28)

N = 0 ;

end

always

case (N)

6'h00 : S = 6'b001001 ;

6'h01 : S = 6'b001100 ;

6'h12 : S = 6'b001010 ;

6'h15 : S = 6'b001001 ;

6'h16 : S = 6'b100001 ;

6'h26 : S = 6'b010001 ;

endcase

endmodule

2ème partie :

Pour répondre au cahier des charges évolutif, il suffit de tester dans le 1er bloc always et ajouter 5 lorsque l'on est dans les séquences concernées.

On supposera une pression d'une durée au moins égale à 1 seconde (comme cela, elle sera obligatoirement vue par l'horloge). On aurait aussi pu réaliser un monostable programmé pour éviter cette petite contrainte.

Il suffira, alors, d'insérer le segment suivant après N = N+1 ;

if (BP1 && (N <= 9))

N = N+5 ;

if (BP2 && (N >= 6'h15) && (N < 6h'23)

N = N+5 ;

3ème partie :

Une des idées retenue consiste à bloquer le séquenceur en position 11 par exemple pour entrer de nouveau dans le cycle de façon non dangereuse. Ce bit interne « clignot » va servir à mettre un autre contenu sur les sorties.

On rajoutera donc après : always @ (posedge horl)

if (Nuit & (seq == 11) )

clignot = 1;

else

clignot = 0 ;

Puis dans le second always

if (! clignot)

case (.... endcase

else

S = 6'b010010 & {6{horl}} ;

 

 

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