Inout-Ports
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy. Lektion 32 von 90.
Ein inout-Port ist ein bidirektionaler Port, der Signale sowohl senden als auch empfangen kann. Er kann zu unterschiedlichen Zeiten als Eingang oder Ausgang fungieren. Die meisten Ports sind entweder input (Daten fließen hinein) oder output (Daten fließen hinaus). Ein inout-Port kann beides. Je nach Situation kann er Daten ausgeben oder empfangen.
Stell es dir wie eine Einbahnstraße in beide Richtungen statt wie eine Einbahnstraße vor.
Inout-Ports werden verwendet für:
- Gemeinsam genutzte Busse: mehrere Geräte, die mit denselben Leitungen verbunden sind
- Speicherdatenbusse: Daten können gelesen oder geschrieben werden
- Bidirektionale Kommunikation: I2C, SPI usw.
Immer nur ein Gerät steuert den Bus. Andere Geräte müssen sich im hochohmigen Zustand (Z) befinden.
Einen Inout-Port deklarieren
inout [7:0] data_bus; // Bidirektionaler 8-Bit-Bus
inout ready; // Bidirektionales 1-Bit-SignalSo funktioniert Inout
Ein Inout-Port benötigt ein Steuersignal, um festzulegen, ob er als Eingang oder Ausgang fungiert:
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- Wenn
enable = 1, treibt das Modul den Bus (Ausgangsmodus) - Wenn
enable = 0, gibt das Modul den Bus frei (Eingangsmodus, hochohmig)
Wichtige Regeln für Inout
| Regel | Warum |
|---|---|
Muss als wire deklariert werden | Kann nicht reg sein |
| Mehrere Geräte dürfen den Bus nicht gleichzeitig ansteuern | Widersprüchliche Treiber erzeugen X |
Verwende Z, um den Bus freizugeben | Ermöglicht anderen Geräten, den Bus anzusteuern |
| Immer nur ein Treiber gleichzeitig | Verhindert Buskonflikte |
Inout vs. Input vs. Output
| Porttyp | Richtung | Kann treiben | Kann lesen |
|---|---|---|---|
input | Einweg (nur hinein) | Nein | Ja |
output | Einweg (nur hinaus) | Ja | Ja (den Wert, den er treibt) |
inout | Zweiweg (beide Richtungen) | Ja (wenn aktiviert) | Ja (immer) |
Häufiger Fehler
// FALSCH: Innerhalb eines always-Blocks kann inout kein Wert zugewiesen werden
always @(posedge clk) begin
data_bus <= something; // Fehler! Verwende assign mit einer Bedingung
end
// RICHTIG: Verwende assign mit einer enable-Bedingung
assign data_bus = (enable) ? something : 8'bZ;Aufgabe
Füge den fehlenden inout-Port und die assign-Anweisungen hinzu, damit dieser bidirektionale Puffer funktioniert.
Was zu tun ist:
- Füge einen 8-Bit-
inout-Port namensio_bushinzu - Füge eine
assign-Anweisung hinzu, dieio_busmitsend_valuebelegt, wennsend_enable1 ist, andernfalls mitZ - Füge eine
assign-Anweisung hinzu, dieio_businreceive_valueeinliest
Probier es selbst
module bidir_buffer (
// Aufgabe 1: Füge hier einen 8-Bit-inout-Port namens io_bus hinzu
input [7:0] send_value,
input send_enable,
output [7:0] receive_value
);
// Aufgabe 2: Füge eine assign-Anweisung hinzu, die io_bus mit send_value treibt, wenn send_enable 1 ist, andernfalls mit Z
// Aufgabe 3: Füge eine assign-Anweisung hinzu, die io_bus in receive_value einliest
endmoduleDiese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Grundlagen
1Einführung
Was ist VerilogHardware vs. SoftwareIhr erstes ModulKommentareAbstraktionsebenen des Designs4Operatoren Teil 1
Arithmetische OperatorenModulo-OperatorVergleichsoperatorenWiederholung – einfache MathematikBitweise Operatoren7Zuweisungen und Gatter
Kontinuierliche ZuweisungZuweisung mit OperatorenIntegrierte Gatter-GrundelementeUND-, ODER- und NICHT-GatterXOR- und XNOR-GatterRückblick – Logikgatter-Schaltung10Entscheidungsfindung
If-AnweisungIf – ElseRückblick – Einfacher KomparatorCase-AnweisungCasex und CasezRückblick – ALU-Entwurf13Zeitsteuerung und Verzögerungen
Was sind Verzögerungen?GatterverzögerungenZuweisungsverzögerungenTimescale-DirektiveTakterzeugungZusammenfassung – Zeitsteuerung2Datentypen
Wire-TypReg-TypInteger und RealVektorenArraysParameterZusammenfassung – Signale deklarieren5Operatoren Teil 2
Logische OperatorenReduktionsoperatorenSchiebeoperatorenVerkettungsoperatorBedingter OperatorRückblick – Operatoren-Herausforderung11Schleifen
For-SchleifeWhile-SchleifeWiederholungsschleifeEndlosschleifeAnweisung deaktivierenRückblick – Schleifenmuster3Zahlensystem
Binäre DarstellungZahlen mit fester BreiteZahlen ohne feste BreiteNegative ZahlenSpezialwerte X und ZZusammenfassung – Zahlenformate6Module
ModulstrukturInput- und Output-PortsInout-PortsModulinstanziierungPortzuordnung nach NamenPortzuordnung nach ReihenfolgeRückblick – Ein Modul erstellenÜbe selbstständig: Online-Verilog-Compiler