Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial Internet of Things >> Embarqué

Comment décrire des circuits combinatoires en Verilog : opérateurs conditionnels et blocs always

Cet article explique comment modéliser la logique combinatoire en Verilog, couvrant l'opérateur conditionnel pour l'implémentation de tables de vérité et le puissant bloc « always » pour une conception concise.

Dans ce guide, nous parcourons les techniques clés pour décrire des circuits combinatoires en Verilog. D'abord, nous revisitons la syntaxe d'affectation continue utilisant le mot-clé assign, puis introduisons l'opérateur conditionnel (?:) comme moyen concis d'exprimer la logique de multiplexeur. Finalement, nous montrons comment le bloc always peut fournir une description procédurale encore plus claire.

Précédemment, nous avons couvert le mot-clé assign pour les affectations continues. Ces instructions restent actives et nous permettent d'obtenir une description au niveau portes d'un circuit. Par exemple, le code suivant modélise une porte ET :

assign out1 = a & b; 

L'opérateur conditionnel de Verilog permet à une seule affectation de changer sa valeur en fonction d'une condition. La syntaxe est :

assign [signal_name] = [conditional_expression] ? [value_if_true] : [value_if_false]; 

L'conditional_expression est évaluée en premier. Si elle est vraie, value_if_true est assignée à signal_name ; sinon value_if_false est utilisée. Par exemple :

assign out1 = (sel) ? (a & b) : (a | b); 

Quand sel est vrai, le ET de a et b pilote out1 ; sinon le OU de a et b est sélectionné. Cette seule ligne implémente un multiplexeur 2-vers-1.

Puisque l'opérateur conditionnel se comporte comme une instruction if en programmation traditionnelle, il permet une représentation plus abstraite de la logique combinatoire. En imbriquant l'opérateur, vous pouvez construire des structures complexes, comme illustré dans l'Exemple 1.

Exemple 1 : Opérateurs conditionnels imbriqués

Ci-dessous se trouve un encodeur de priorité 4-vers-2 implémenté avec des opérateurs conditionnels imbriqués. La table de vérité est montrée dans la Figure 1.

Comment décrire des circuits combinatoires en Verilog : opérateurs conditionnels et blocs always

Le code Verilog est :

module Prio_4_to_2 ( input wire [3:0] x, output wire [1:0] y, output wire v ); assign y = x[3] ? 2'b11 : x[2] ? 2'b10 : x[1] ? 2'b01 : 2'b00; assign v = ( x[3] | x[2] | x[1] | x[0] ) ? 1'b1 : 1'b0; endmodule 

Les lignes 7-10 montrent l'opérateur conditionnel imbriqué. Chaque condition est évaluée séquentiellement, donnant la priorité aux termes précédents — parfait pour la logique de priorité. Le dernier assign pour v utilise un OU bit à bit pour indiquer si une entrée est haute.

Les résultats de simulation Xilinx ISE confirment le comportement (Figure 2).

Comment décrire des circuits combinatoires en Verilog : opérateurs conditionnels et blocs always

Figure 2. Simulation Xilinx ISE de l'encodeur de priorité.

Il est essentiel de noter que l'expression conditionnelle est évaluée dans l'ordre jusqu'à ce qu'une condition vraie soit trouvée ; la valeur correspondante est alors assignée. Par conséquent, cette construction est mieux adaptée aux réseaux de priorité (Figure 3) plutôt qu'aux multiplexeurs équilibrés (Figure 4).

Comment décrire des circuits combinatoires en Verilog : opérateurs conditionnels et blocs always

Figure 3. Un réseau de priorité.

Comment décrire des circuits combinatoires en Verilog : opérateurs conditionnels et blocs always

Figure 4. Un multiplexeur n-vers-1 sans priorité d'entrée.

Dans un article précédent, nous avons discuté des affectations concurrentes VHDL ; les concepts se traduisent de manière similaire en Verilog.

Instructions procédurales Verilog

Bien que assign et les opérateurs conditionnels suffisent pour de nombreux designs, le bloc always offre une approche plus expressive et procédurale. À l'intérieur d'un bloc always, les instructions s'exécutent séquentiellement et peuvent inclure des constructions de haut niveau telles que if et case, reflétant le flux naturel du raisonnement humain.

L'Exemple 2 démontre un bloc always de base utilisé pour implémenter une simple porte ET.

Exemple 2 : Instructions du bloc « Always »

La syntaxe simplifiée d'un bloc always est :

always @(sensitivity_list) begin sequential_statements; end 

La sensitivity_list spécifie quand le bloc doit être réévalué. Pour un circuit purement combinatoire, tous les signaux d'entrée doivent apparaître dans cette liste.

Considérez le circuit de la Figure 5, où la sortie change chaque fois que a ou b bascule.

Comment décrire des circuits combinatoires en Verilog : opérateurs conditionnels et blocs always

Figure 5. Circuit_1

Le bloc always suivant implémente l'opération ET en utilisant une affectation bloquante :

always @(a, b) begin out1 = a & b; end 

Les affectations bloquantes (=) mettent à jour le côté gauche immédiatement, tandis que les affectations non-bloquantes (<=) retardent la mise à jour jusqu'à la fin du bloc. Pour la logique combinatoire, il est plus sûr d'utiliser des affectations bloquantes pour éviter les conditions de course non intentionnelles.

Parce qu'un bloc procédural ne peut pas piloter un wire, la sortie doit être déclarée comme reg, qui peut ou non inférer un élément de stockage. Le module complet est montré ci-dessous :

module Circuit_1 ( input wire a, input wire b, output reg out1 ); always @(a, b) begin out1 = a & b; end endmodule 

En résumé, cet article a couvert l'opérateur conditionnel pour la logique de table de vérité compacte, les opérateurs imbriqués pour l'encodage de priorité, et le bloc procédural always pour des descriptions combinatoires plus claires. Les futurs articles exploreront l'utilisation de always pour la logique séquentielle.

Embarqué

  1. Verilog basique : concevoir votre première porte ET
  2. Fondamentaux des circuits DC : comprendre le courant continu et concepts électriques de base
  3. Comprendre les circuits AC : Guide pour débutants
  4. Circuits de Commande : Fondamentaux, Applications et Bonnes Pratiques
  5. Opérateurs C# — Guide complet des opérateurs en C#
  6. Opérateur ternaire C# : Guide concis pour les expressions conditionnelles
  7. Maîtriser Verilog : Tutoriel complet pour la conception de circuits numériques
  8. Maîtriser la concaténation Verilog : Guide pratique
  9. Verilog `ifdef : Compilation Conditionnelle Expliquée