Inout-Ports
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy — Lektion 32 von 90.
Ein inout-Port ist ein bidirektionaler Port, der sowohl Signale senden als auch empfangen kann. Er kann zu verschiedenen Zeiten als Eingang oder Ausgang fungieren.
Die meisten Ports sind entweder input (Daten fließen hinein) oder output (Daten fließen heraus). Ein inout Port kann beides — er kann Daten ausgeben oder Daten empfangen, je nach Situation.
Stellen Sie es sich wie eine Zweigleisige Straße anstelle einer Einbahnstraße vor.
Inout-Ports werden verwendet für:
- Gemeinsame Busse (Shared buses) — mehrere Geräte, die an dieselben Leitungen angeschlossen sind
- Speicherdatenbusse — Daten können gelesen oder geschrieben werden
- Bidirektionale Kommunikation — I2C, SPI, etc.
Es darf immer nur ein Gerät gleichzeitig den Bus ansteuern. Andere Geräte müssen sich im hochohmigen Zustand (Z) befinden.
Deklaration eines Inout-Ports
inout [7:0] data_bus; // 8-Bit bidirektionaler Bus
inout ready; // Ein-Bit bidirektionales SignalWie Inout funktioniert
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; // Bus treiben, wenn aktiviert, sonst Z
assign data_in = bus; // Den Bus immer lesen
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 | Grund |
|---|---|
Muss als wire deklariert werden | Kann nicht reg sein |
| Kann nicht gleichzeitig gelesen und geschrieben werden | Würde einen Konflikt (X) verursachen |
Verwenden Sie Z, um den Bus freizugeben | Ermöglicht es anderen Geräten, den Bus zu steuern |
| Nur ein Treiber zur gleichen Zeit | Verhindert Buskonflikte |
Inout vs. Input vs. Output
| Port-Typ | Richtung | Kann treiben | Kann lesen |
|---|---|---|---|
input | Einweg (nur Eingang) | Nein | Ja |
output | Einweg (nur Ausgang) | Ja | Nein |
inout | Zweiwege (beide) | Ja (wenn aktiviert) | Ja (immer) |
Häufiger Fehler
// FALSCH: Zuweisung an inout innerhalb eines always-Blocks nicht möglich
always @(posedge clk) begin
data_bus <= something; // Fehler! Verwenden Sie assign mit Bedingung
end// RICHTIG: Verwende assign mit Enable-Bedingung
assign data_bus = (enable) ? something : 8'bZ;Aufgabe
Fügen Sie den fehlenden inout-Port und die assign-Anweisungen hinzu, damit dieser bidirektionale Puffer funktioniert.
Was zu tun ist:
- Fügen Sie einen 8-Bit-
inout-Port namensio_bushinzu - Fügen Sie eine
assign-Anweisung hinzu, dieio_busmitsend_valueansteuert, wennsend_enable1 ist, andernfallsZ - Fügen Sie eine
assign-Anweisung hinzu, dieio_businreceive_valueeinliest
Spickzettel
inout ist ein bidirektionaler Port, der Signale sowohl treiben als auch empfangen kann. Nur ein Gerät treibt den Bus zu einem Zeitpunkt; andere müssen eine hohe Impedanz (Z) ausgeben.
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 when enabled, else release
assign data_in = bus; // Always read the bus
endmoduleWichtige Regeln:
- Muss vom Typ
wiresein (nichtreg) - Verwenden Sie
assignmit einer ternären Bedingung — niemals innerhalb einesalways-Blocks zuweisen - Geben Sie den Bus mit
Zfrei, wenn nicht getrieben wird, um Bus-Konflikte zu vermeiden
Probier es selbst
module bidir_buffer (
// Aufgabe 1: Fügen Sie 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ügen Sie eine assign-Anweisung hinzu, die io_bus mit send_value treibt, wenn send_enable 1 ist, andernfalls Z
// Aufgabe 3: Fügen Sie 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. SoftwareAbstraktionsebenen im DesignDein erstes ModulKommentare4Operatoren Teil 1
Arithmetische OperatorenModulo-OperatorVergleichsoperatorenWiederholung – Einfache MathematikBitweise Operatoren7Zuweisung und Gatter
Kontinuierliche ZuweisungZuweisung mit OperatorenIntegrierte Gatter-PrimitiveAND OR NOT GatterXOR XNOR GatterZusammenfassung - Logikgatterschaltung10Entscheidungsfindung
If-AnweisungIf - ElseWiederholung - Einfacher KomparatorCase-AnweisungCasex und CasezWiederholung - ALU-Design5Operatoren Teil 2
Logische OperatorenReduktionsoperatorenShift-OperatorenVerkettungsoperatorBedingter OperatorZusammenfassung – Operator-Challenge11Schleifen
For-SchleifeWhile-SchleifeRepeat-SchleifeEndlosschleifeDisable-AnweisungRückblick – Schleifenmuster3Zahlensystem
Binäre DarstellungZahlen mit GrößenangabeZahlen ohne GrößenangabeNegative ZahlenSpezialwerte X und ZZusammenfassung – Zahlenformate6Module
ModulstrukturEingangs- und Ausgangs-PortsInout-PortsModul-InstanziierungPort-Mapping nach NamePort-Mapping nach ReihenfolgeZusammenfassung – Ein Modul erstellen