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 verschiedenen Zeiten als Eingabe oder Ausgabe fungieren. Die meisten Ports sind entweder input (Daten fließen hinein) oder output (Daten fließen heraus). Ein inout-Port kann beides tun — er kann Daten nach außen treiben oder Daten empfangen, je nach Situation.
Stellen Sie es sich wie eine Zwei-Wege-Straße anstelle einer Einbahnstraße vor.
Inout-Ports werden verwendet für:
- Gemeinsam genutzte Busse — mehrere Geräte, die an dieselben Leitungen angeschlossen sind
- Speicher-Datenbusse — Daten können gelesen oder geschrieben werden
- Bidirektionale Kommunikation — I2C, SPI usw.
Nur ein Gerät treibt den Bus gleichzeitig an. Andere Geräte müssen sich im hochohmigen Zustand (Z) befinden.
Deklarieren eines Inout-Ports
inout [7:0] data_bus; // 8-Bit bidirektionaler Bus
inout ready; // Ein-Bit bidirektionales SignalWie Inout funktioniert
Ein inout-Port erfordert 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 an (Ausgangsmodus) - Wenn
enable = 0, gibt das Modul den Bus frei (Eingangsmodus, 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 |
Verwenden Sie Z, um den Bus freizugeben | Ermöglicht anderen Geräten die Ansteuerung |
| Nur ein Treiber gleichzeitig | Verhindert Bus-Kollisionen (Bus Contention) |
Inout vs Input vs Output
| Port Type | Richtung | Can Drive | Can Read |
|---|---|---|---|
input | Einweg (nur in) | Nein | Ja |
output | Einweg (nur out) | Ja | Nein |
inout | Zweiwege (beide) | Ja (wenn enabled) | Ja (always) |
Häufiger Fehler
// WRONG: Kann nicht an inout innerhalb eines always-Blocks zuweisen
always @(posedge clk) begin
data_bus <= something; // Fehler! Verwende assign mit Bedingung
end
// CORRECT: Verwende assign mit enable-Bedingung
assign data_bus = (enable) ? something : 8'bZ;Aufgabe
Fügen Sie den fehlenden inout-Port und die assign-Statements hinzu, damit dieser bidirektionale Puffer funktioniert.
Was zu tun ist:
- Fügen Sie einen 8-bit
inout-Port namensio_bushinzu - Fügen Sie ein
assign-Statement hinzu, dasio_busmitsend_valueansteuert, wennsend_enable1 ist, andernfalls mitZ - Fügen Sie ein
assign-Statement hinzu, dasio_businreceive_valueliest
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, ansonsten 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. 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