Menu
CoddyTech

Ports Inout

Fait partie de la section Fondamentaux du Journey Verilog de Coddy. Leçon 32 sur 90.

Un port inout est un port bidirectionnel qui peut à la fois envoyer et recevoir des signaux. Il peut agir comme une entrée ou une sortie à différents moments. La plupart des ports sont soit des input (les données entrent), soit des output (les données sortent). Un port inout peut faire les deux. Il peut transmettre des données vers l’extérieur ou en recevoir, selon la situation.

Imagine cela comme une rue à double sens plutôt qu’une route à sens unique.

Les ports d’entrée-sortie bidirectionnels sont utilisés pour :

  • Bus partagés : plusieurs appareils connectés aux mêmes fils
  • Bus de données mémoire : les données peuvent être lues ou écrites
  • Communication bidirectionnelle : I2C, SPI, etc.

Un seul appareil pilote le bus à la fois. Les autres appareils doivent être en état de haute impédance (Z).

Déclarer un port d’entrée-sortie

inout [7:0] data_bus;   // Bus bidirectionnel de 8 bits
inout ready;             // Signal bidirectionnel sur un seul bit

Comment fonctionne Inout

Un port inout nécessite un signal de commande pour déterminer s’il agit comme une entrée ou une sortie :

module bidir (
  inout [7:0] bus,
  input [7:0] data_out,
  input enable,
  output [7:0] data_in
);
  
  assign bus = (enable) ? data_out : 8'bZ;  // Drive bus when enabled, else Z
  assign data_in = bus;                     // Always read the bus
  
endmodule
  • Lorsque enable = 1, le module pilote le bus (mode sortie)
  • Lorsque enable = 0, le module libère le bus (mode entrée, haute impédance)

Règles importantes concernant Inout

RèglePourquoi
Doit être déclaré comme wireNe peut pas être reg
Plusieurs appareils ne doivent pas piloter le bus en même tempsDes pilotes en conflit produisent X
Utilisez Z pour libérer le busPermet aux autres appareils de le piloter
Un seul pilote à la foisÉvite les conflits sur le bus

Inout vs entrée vs sortie

Type de portDirectionPeut piloterPeut lire
inputUnidirectionnel (entrée uniquement)NonOui
outputUnidirectionnel (sortie uniquement)OuiOui (la valeur qu’il pilote)
inoutBidirectionnel (dans les deux sens)Oui (lorsqu’il est activé)Oui (toujours)

Erreur fréquente

// INCORRECT : impossible d'affecter une valeur à inout dans un bloc always
always @(posedge clk) begin
  data_bus <= something;   // Erreur ! Utilisez assign avec une condition
end

// CORRECT : utilisez assign avec une condition d'activation
assign data_bus = (enable) ? something : 8'bZ;
challenge icon

Défi

Ajoute le port inout manquant et les instructions assign pour faire fonctionner ce tampon bidirectionnel.

À faire :

  1. Ajoute un port inout de 8 bits appelé io_bus
  2. Ajoute une instruction assign qui transmet send_value à io_bus lorsque send_enable vaut 1, sinon Z
  3. Ajoute une instruction assign qui lit io_bus dans receive_value

Essayez vous-même

module bidir_buffer (
  // Tâche 1 : Ajoutez ici un port inout de 8 bits nommé io_bus
  
  
  input [7:0] send_value,
  input send_enable,
  output [7:0] receive_value
);

  // Tâche 2 : Ajoutez une instruction assign qui place send_value sur io_bus lorsque send_enable vaut 1, sinon Z
  
  
  // Tâche 3 : Ajoutez une instruction assign qui lit io_bus dans receive_value
  

endmodule
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Fondamentaux

Entraînez-vous par vous-même : Compilateur Verilog en ligne