Menu
Coddy logo textTech

Porte Inout

Fa parte della sezione Fondamenti del percorso Verilog di Coddy. Lezione 32 di 90.

Una porta inout è una porta bidirezionale che può sia inviare che ricevere segnali. Può fungere da ingresso o da uscita in momenti diversi. La maggior parte delle porte è di tipo input (i dati entrano) oppure output (i dati escono). Una porta inout può fare entrambe le cose. Può inviare dati in uscita o riceverli in ingresso, a seconda della situazione.

Immaginalo come una strada a doppio senso invece che a senso unico.

Le porte inout vengono utilizzate per:

  • Bus condivisi: più dispositivi collegati agli stessi fili
  • Bus dati della memoria: i dati possono essere letti o scritti
  • Comunicazione bidirezionale: I2C, SPI, ecc.

Solo un dispositivo alla volta pilota il bus. Gli altri dispositivi devono trovarsi nello stato ad alta impedenza (Z).

Dichiarare una porta Inout

inout [7:0] data_bus;   // Bus bidirezionale a 8 bit
inout ready;             // Segnale bidirezionale a bit singolo

Come funziona Inout

Una porta inout richiede un segnale di controllo per decidere se funge da ingresso o da uscita:

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
  • Quando enable = 1, il modulo pilota il bus (modalità di uscita)
  • Quando enable = 0, il modulo rilascia il bus (modalità di ingresso, alta impedenza)

Regole importanti per Inout

RegolaPerché
Deve essere dichiarato come wireNon può essere reg
Non può essere letto e scritto allo stesso tempoCreerebbe un conflitto (X)
Usa Z per rilasciare il busConsente ad altri dispositivi di pilotarlo
Un solo driver alla voltaPreviene la contesa sul bus

Inout vs Input vs Output

Tipo di portaDirezionePuò pilotarePuò leggere
inputUnidirezionale (solo in ingresso)NoSì
outputUnidirezionale (solo in uscita)SìNo
inoutBidirezionale (entrambe)Sì (quando abilitata)Sì (sempre)

Errore comune

// SBAGLIATO: Non è possibile assegnare un valore a inout all'interno di un blocco always
always @(posedge clk) begin
  data_bus <= something;   // Errore! Usa assign con una condizione
end

// CORRETTO: Usa assign con una condizione basata su enable
assign data_bus = (enable) ? something : 8'bZ;
challenge icon

Sfida

Aggiungi la porta inout mancante e le istruzioni assign per far funzionare questo buffer bidirezionale.

Cosa fare:

  1. Aggiungi una porta inout a 8 bit chiamata io_bus
  2. Aggiungi un'istruzione assign che pilota io_bus con send_value quando send_enable è 1, altrimenti con Z
  3. Aggiungi un'istruzione assign che legge io_bus in receive_value

Provalo tu

module bidir_buffer (
  // Attività 1: aggiungi qui una porta inout a 8 bit chiamata io_bus
  
  
  input [7:0] send_value,
  input send_enable,
  output [7:0] receive_value
);

  // Attività 2: aggiungi un'istruzione assign che imposti io_bus a send_value quando send_enable è 1, altrimenti a Z
  
  
  // Attività 3: aggiungi un'istruzione assign che legga io_bus in receive_value
  

endmodule
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fondamenti

Esercitati da solo: Compilatore Verilog online