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}} ;