Mots-clés : if, selector
Instructions conditionnelles
Les instructions conditionnelles (if) sont utilisées pour contrôler si des instructions d'exécution sont exécutées en fonction de l'évaluation de la condition.
Les instructions conditionnelles sont déclarées à l'aide des mots-clés if et else, et l'expression de condition doit être mise entre parenthèses.
La structure d'utilisation des instructions conditionnelles est décrite comme suit :
if (condition1) true_statement1 ; else if (condition2) true_statement2 ; else if (condition3) true_statement3 ; else default_statement ;
- Lorsque l'instruction if est exécutée, si condition1 est vraie, true_statement1 est exécuté ; si condition1 est fausse et condition2 est vraie, true_statement2 est exécuté ; et ainsi de suite.
- Les structures else if et else peuvent être omises ; c'est-à-dire qu'une seule vérification de condition if et un ensemble d'instructions d'exécution, true_statement1, peuvent former un processus d'exécution.
- Plusieurs clauses else if peuvent être enchaînées, sans être limitées à seulement 1 ou 2.
- Les instructions d'exécution telles que true_statement1 peuvent être une seule instruction ou plusieurs instructions. S'il y a plusieurs instructions d'exécution, elles doivent être encadrées par les mots-clés begin et end.
Le code suivant implémente un sélecteur 4 vers 1.
Exemple
input [1:0] sel ,
input [1:0] p0 ,
input [1:0] p1 ,
input [1:0] p2 ,
input [1:0] p3 ,
output [1:0] sout);
reg [1:0] sout_t ;
always @(*) begin
if (sel == 2'b00)
sout_t = p0 ;
else if (sel == 2'b01)
sout_t = p1 ;
else if (sel == 2'b10)
sout_t = p2 ;
else
sout_t = p3 ;
end
assign sout = sout_t ;
endmodule
Le code du banc de test est le suivant :
Exemple
module test ;
reg [1:0] sel ;
wire [1:0] sout ;
initial begin
sel = 0 ;
#10 sel = 3 ;
#10 sel = 1 ;
#10 sel = 0 ;
#10 sel = 2 ;
end
mux4to1 u_mux4to1 (
.sel (sel),
.p0 (2'b00), //path0 est affecté à 0
.p1 (2'b01), //path1 est affecté à 1
.p2 (2'b10), //path2 est affecté à 2
.p3 (2'b11), //path3 est affecté à 3
.sout (sout));
//terminer la simulation
always begin
#100;
if ($time >= 1000) $finish ;
end
endmodule
Les résultats de la simulation sont les suivants.
On peut voir sur la figure que le signal de sortie correspond aux états du signal de sélection et du signal d’entrée.

Dans l'exemple, chaque condition if n'exécute qu'une seule instruction, donc les mots-clés begin et end ne sont pas utilisés. Cependant, dans une forme if-if-else, même s'il n'y a qu'une seule instruction d'exécution, le fait de ne pas utiliser begin et end peut créer une ambiguïté.
Par exemple, dans le code suivant, bien que la mise en forme permette de le distinguer, on ne sait pas à quelle condition if le else correspond.
Exemple
if(sel == 2'b1)
sout = p1s ;
else
sout = p0 ;
Bien sûr, les compilateurs suivent généralement le principe de la correspondance la plus proche, faisant correspondre else au if le plus proche (le deuxième if dans l'exemple).
Mais de toute évidence, ce style d'écriture n'est pas standard et n'est pas sûr.
Par conséquent, c'est une bonne habitude d'ajouter les mots-clés begin et end dans les instructions conditionnelles.
Par exemple, si le code ci-dessus est légèrement modifié, l'écriture ne présentera plus d'ambiguïté.
Exemple
if(sel == 2'b1) begin
sout = p1s ;
end
else begin
sout = p0 ;
end
end
Téléchargement du code source
Téléchargement