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 singoloCome 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
| Regola | Perché |
|---|---|
Deve essere dichiarato come wire | Non può essere reg |
| Non può essere letto e scritto allo stesso tempo | Creerebbe un conflitto (X) |
Usa Z per rilasciare il bus | Consente ad altri dispositivi di pilotarlo |
| Un solo driver alla volta | Previene la contesa sul bus |
Inout vs Input vs Output
| Tipo di porta | Direzione | Può pilotare | Può leggere |
|---|---|---|---|
input | Unidirezionale (solo in ingresso) | No | Sì |
output | Unidirezionale (solo in uscita) | Sì | No |
inout | Bidirezionale (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;Sfida
Aggiungi la porta inout mancante e le istruzioni assign per far funzionare questo buffer bidirezionale.
Cosa fare:
- Aggiungi una porta
inouta 8 bit chiamataio_bus - Aggiungi un'istruzione
assignche pilotaio_busconsend_valuequandosend_enableè 1, altrimenti conZ - Aggiungi un'istruzione
assignche leggeio_businreceive_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
endmoduleQuesta lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Fondamenti
1Introduzione
Cos'è VerilogHardware e software a confrontoIl tuo primo moduloCommentiLivelli di astrazione della progettazione4Operatori - Parte 1
Operatori aritmeticiOperatore moduloOperatori di confrontoRiepilogo - Matematica sempliceOperatori bitwise7Assegnazioni e porte
Assegnazione continuaAssegnazioni con operatoriPrimitive di porte integratePorte AND, OR e NOTPorte XOR e XNORRiepilogo: circuito con porte logiche10Decisioni
Istruzione ifIf-ElseRiepilogo - Comparatore sempliceIstruzione caseCasex e casezRiepilogo - Progettazione di una ALU5Operatori Parte 2
Operatori logiciOperatori di riduzioneOperatori di scorrimentoOperatore di concatenazioneOperatore condizionaleRiepilogo - Sfida sugli operatori3Sistema numerico
Rappresentazione binariaNumeri con dimensione specificataNumeri senza dimensione specificataNumeri negativiValori speciali X e ZRiepilogo - Formati numerici6Moduli
Struttura di un moduloPorte di input e outputPorte InoutIstanziazione di un moduloMappatura delle porte per nomeMappatura delle porte per ordineRiepilogo - Costruire un modulo9Blocchi procedurali
Blocco alwaysBlocco initialLista di sensibilitàAssegnazione bloccanteAssegnazione non bloccanteRiepilogo: always vs initial12Progetto Multiplexer
Progettazione di un mux da 2 a 1Progettazione di un mux da 4 a 1Esercitati da solo: Compilatore Verilog online