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 Zeitpunkten 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 Daten empfangen.
Stell es dir wie eine Straße mit Verkehr in beide Richtungen statt einer Einbahnstraße vor.
Inout-Ports werden verwendet für:
- Gemeinsame Busse: mehrere Geräte, die mit denselben Leitungen verbunden sind
- Speicherdatenbusse: Daten können gelesen oder geschrieben werden
- : I2C, SPI usw.
Nur ein Gerät treibt den Bus gleichzeitig. Andere Geräte müssen sich im hochohmigen Zustand (Z) befinden.
Ein Inout-Port deklarieren
inout [7:0] data_bus; // 8-Bit bidirektionaler Bus
inout ready; // Ein-Bit bidirektionales SignalFunktionsweise von Inout
Ein Inout-Port benötigt ein Steuersignal, um zu entscheiden, 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 (Ausgabemodus) - Wenn
enable = 0, gibt das Modul den Bus frei (Eingabemodus, High-Z)
Wichtige Regeln für Inout
| Regel | Warum |
|---|---|
Muss als wire deklariert werden | Kann nicht reg sein |
| Kann nicht gleichzeitig gelesen und geschrieben werden | Würde einen Konflikt (X) erzeugen |
Verwende Z, um den Bus freizugeben | Ermöglicht es 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 | Nein |
inout | Zweiweg (beides) | Ja (wenn aktiviert) | Ja (immer) |
Häufiger Fehler
// WRONG: Kann inout nicht innerhalb eines always-Blocks zuweisen
always @(posedge clk) begin
data_bus <= something; // Error! Verwende assign mit Bedingung
end
// CORRECT: Verwende assign mit 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.
Das ist zu tun:
- Füge einen 8-Bit-
inout-Port namensio_bushinzu - Füge eine
assign-Anweisung hinzu, dieio_busmitsend_valueansteuert, 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 Z
// Aufgabe 3: Füge eine assign-Anweisung hinzu, die io_bus in receive_value liest
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