Mots-clés : case, selector
L'instruction case est une forme de branchement conditionnel à plusieurs voies, qui peut résoudre l'inconvénient d'utiliser une instruction if lorsqu'il y a plusieurs options conditionnelles.
instruction case
Le format de l'instruction case est le suivant :
case(case_expr)
condition1 : true_statement1 ;
condition2 : true_statement2 ;
……
default : default_statement ;
endcase
Lorsque l'instruction case est exécutée, si condition1 est vraie, exécuter true_statement1 ; si condition1 est fausse et condition2 est vraie, exécuter true_statement2 ; et ainsi de suite. Si aucune des conditions n'est vraie, exécuter default_statement.
L'instruction default est facultative, et il ne peut pas y avoir plusieurs instructions default dans une même instruction case.
Il peut y avoir plusieurs options conditionnelles, sans se limiter à condition1, condition2, etc., et ces options conditionnelles ne sont pas tenues d'être mutuellement exclusives. Bien que ces options conditionnelles soient comparées simultanément, l'effet d'exécution est que celle qui vient en premier et dont la condition est vraie est exécutée.
Les instructions d'exécution telles que ture_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.
Les instructions case prennent en charge l'utilisation imbriquée.
Dans ce qui suit, une instruction case est utilisée à la place d'une instruction if pour implémenter la fonction d'un sélecteur 4 voies. Les résultats de simulation et le banc de test peuvent être consultés dansInstructions conditionnelleschapitre, et les deux sont exactement identiques.
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 ;
toujours @(*)
case(sel)
2'b00: begin
sout_t = p0 ;
end
2'b01: sout_t = p1 ;
2'b10: sout_t = p2 ;
default: sout_t = p3 ;
endcase
assign sout = sout_t ;
endmodule
Les expressions d'option conditionnelle dans une instruction case ne doivent pas nécessairement être des constantes ; elles peuvent aussi être des valeurs x ou des valeurs z.
Lorsque plusieurs options conditionnelles doivent exécuter la même instruction, ces options conditionnelles peuvent être séparées par des virgules et placées dans les alternatives du même bloc d'instructions.
Cependant, la logique de comparaison de x ou z dans une instruction case n'est pas synthétisable, donc il n'est généralement pas recommandé d'utiliser x ou z comme valeurs de comparaison dans une instruction case.
Par exemple, étendez l'instruction case du sélecteur à 4 voies, comme suit :
Exemple
2'b00: sout_t = p0 ;
2'b01: sout_t = p1 ;
2'b10: sout_t = p2 ;
2'b11: sout_t = p3 ;
2'bx0, 2'bx1, 2'bxz, 2'bxx, 2'b0x, 2'b1x, 2'bzx :
sout_t = 2'bxx ;
2'bz0, 2'bz1, 2'bzz, 2'b0z, 2'b1z :
sout_t = 2'bzz ;
default: $display("Contrôle d'entrée inattendu !!!");
endcase
instructions casex/casez
Les instructions casex et casez sont des variantes de l'instruction case, utilisées pour représenter des termes indifférents dans les options conditionnelles.
casex utilise "x" pour représenter les valeurs indifférentes, et casez utilise le point d'interrogation "?" pour représenter les valeurs indifférentes.
Les fonctions implémentées par les deux sont exactement les mêmes, et la syntaxe est également exactement la même que celle de l'instruction case.
Cependant, casex et casez ne sont généralement pas synthétisables et sont principalement utilisés en simulation.
Par exemple, utilisez une instruction casez pour implémenter un sélecteur à 4 voies avec une entrée de contrôle de 4 bits.
Exemple
input [3: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 ;
toujours @(*)
casez(sel)
4'b???1: sout_t = p0 ;
4'b??1?: sout_t = p1 ;
4'b?1??: sout_t = p2 ;
4'b1???: sout_t = p3 ;
default: sout_t = 2'b0 ;
endcase
assign sout = sout_t ;
endmodule
Téléchargement du code source
Téléchargement