La lecture du symbole nous permet
de voir qu'il s'agit d'un registre universel 4 bits synchrone
permettant des décalages à droite et à gauche, le
chargement synchrone. Il possède une entrée de remise
à 0 asynchrone.
Son fonctionnement :
- son évoluton est conditionnée
par les fronts de clk,
- Il présente
4 modes (S1 et S0) :
- en mode 0 : rien ne se passe,
- en mode 1 : décalage à
droite avec entrée série gauche sur
SRSER,
- en mode 2 : décalage à
gauche avec entrée série droite SLSER,
- en mode 3 : chargement parallèle
des entrées A, B, C et D
Remarque : attention au
sens des décalages et ce qui est appelé droite
et gauche dans le symbole, par rapport à l'ordre
d'écriture des bits qui peut se trouver inversé.
Remarque : on se
trouvera dans l'impossibilité de faire exactement le composant
souhaité (le front montant de clk et l'activité à
0 de l'entrée CLR sont incompatibles). Elle mènerait
à :
« always @ (posedge clk or negedge clr)
… », ce qui n'est pas compilable.
En utilisant le complément
de l'entrée CLR, c'est possible et le dispostif fonctionne.
La solution peut être la suivante :
module U74194 (clr_bar, s0, s1, clk, srser,
a, b, c, d, slser, Q) ;
input clr_bar, s0, s1, clk, srser, a, b,
c, d, slser ;
output [3 : 0] Q ;
wire clr ;
assign clr = ! clr_bar ;
always @ (posedge clk or posedge clr)
if (clr)
Q = 0 ;
else
case ({s1, s0}) :
2'b01 : Q = {Q, srser} ;
2'b10 : Q = {slser, Q} >>1;
2'b11 : Q = {d, c, b, a} ;
endcase
endmodule
En considérant les bits numérotés
dans l'autre sens, on retrouve plus facilement les appellations
(décalage à gauche, ...).
module U74194 (clr_bar, s0, s1, clk, srser,
a, b, c, d, slser, Q) ;
input clr_bar, s0, s1, clk, srser, a, b,
c, d, slser ;
output [0 : 3] Q ;
wire clr ;
assign clr = ! clr_bar ;
always @ (posedge clk or posedge clr)
if (clr)
Q = 0 ;
else
case ({s1, s0}) :
2'b01 : Q = {srser, Q} >>1 ;
2'b10 : Q = {Q, slser} ;
2'b11 : Q = {a, b, c, d} ;
endcase
endmodule