Menu
Coddy logo textTech

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 Signal

Wie 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

RegelGrund
Muss als wire deklariert werdenKann nicht reg sein
Kann nicht gleichzeitig gelesen und geschrieben werdenWürde einen Konflikt (X) verursachen
Verwenden Sie Z, um den Bus freizugebenErmöglicht es anderen Geräten, den Bus zu steuern
Nur ein Treiber zur gleichen ZeitVerhindert Buskonflikte

Inout vs. Input vs. Output

Port-TypRichtungKann treibenKann lesen
inputEinweg (nur Eingang)NeinJa
outputEinweg (nur Ausgang)JaNein
inoutZweiwege (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;
challenge icon

Aufgabe

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

Was zu tun ist:

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

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
endmodule

Wichtige Regeln:

  • Muss vom Typ wire sein (nicht reg)
  • Verwenden Sie assign mit einer ternären Bedingung — niemals innerhalb eines always-Blocks zuweisen
  • Geben Sie den Bus mit Z frei, 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
  

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