Menu
CoddyTech

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-Signal

So 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

RegelWarum
Muss als wire deklariert werdenKann nicht reg sein
Mehrere Geräte dürfen den Bus nicht gleichzeitig ansteuernWidersprüchliche Treiber erzeugen X
Verwende Z, um den Bus freizugebenErmöglicht anderen Geräten, den Bus anzusteuern
Immer nur ein Treiber gleichzeitigVerhindert Buskonflikte

Inout vs. Input vs. Output

PorttypRichtungKann treibenKann lesen
inputEinweg (nur hinein)NeinJa
outputEinweg (nur hinaus)JaJa (den Wert, den er treibt)
inoutZweiweg (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;
challenge icon

Aufgabe

Füge den fehlenden inout-Port und die assign-Anweisungen hinzu, damit dieser bidirektionale Puffer funktioniert.

Was zu tun ist:

  1. Füge einen 8-Bit-inout-Port namens io_bus hinzu
  2. Füge eine assign-Anweisung hinzu, die io_bus mit send_value belegt, wenn send_enable 1 ist, andernfalls mit Z
  3. Füge eine assign-Anweisung hinzu, die io_bus in receive_value einliest

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
  

endmodule
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Grundlagen

Übe selbstständig: Online-Verilog-Compiler