Menu
Coddy logo textTech

Ports Inout

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

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

Pensez-y comme à une rue à double sens plutôt qu'à une route à sens unique.

Inout ports are used for:

  • Shared buses — multiple devices connected to the same wires
  • Memory data buses — data can be read or written
  • Bidirectional communication — I2C, SPI, etc.

Un seul dispositif pilote le bus à la fois. Les autres dispositifs doivent être dans un état de haute impédance (Z).

Déclaration d'un port inout

inout [7:0] data_bus;   // bus bidirectionnel 8 bits
inout ready;             // signal bidirectionnel monobit

Comment fonctionne Inout

Un port inout nécessite un signal de contrôle pour décider 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 commande le bus (mode output)
  • Lorsque enable = 0, le module libère le bus (mode input, haute impédance Z)

Règles importantes pour Inout

RèglePourquoi
Doit être déclaré comme wireCannot être reg
Cannot être read et écrit en même tempsCréerait un conflit (X)
Utiliser Z pour release le busPermet aux autres dispositifs de piloter
Un seul pilote à la foisÉvite la contention sur le bus

Inout vs Input vs Output

Type de portDirectionPeut piloterPeut lire
inputSens unique (entrée seulement)NonOui
outputSens unique (sortie seulement)OuiNon
inoutDouble sens (les deux)Oui (lorsqu'activé)Oui (toujours)

Erreur courante

// WRONG: Impossible d'assigner à inout à l'intérieur d'un bloc always
always @(posedge clk) begin
  data_bus <= something;   // Erreur ! Utilisez assign avec une condition
end

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

Défi

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

Ce qu'il faut faire :

  1. Ajoutez un port inout de 8 bits nommé io_bus
  2. Ajoutez une instruction assign qui pilote io_bus avec send_value lorsque send_enable vaut 1, sinon Z
  3. Ajoutez une instruction assign qui lit io_bus dans receive_value

Essayez vous-même

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

  // Tâche 2 : Ajoutez une instruction assign qui pilote io_bus avec send_value lorsque send_enable est à 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