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

Funktionsweise 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

RegelWarum
Muss als wire deklariert werdenKann nicht reg sein
Kann nicht gleichzeitig gelesen und geschrieben werdenWürde einen Konflikt (X) erzeugen
Verwende Z, um den Bus freizugebenErmöglicht es 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)JaNein
inoutZweiweg (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;
challenge icon

Aufgabe

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

Das ist zu tun:

  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 ansteuert, 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 Z
  
  
  // Aufgabe 3: Füge eine assign-Anweisung hinzu, die io_bus in receive_value liest
  

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