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

Wie 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

RegelWarum
Muss als wire deklariert werdenKann nicht reg sein
Kann nicht gleichzeitig gelesen und geschrieben werdenWürde einen Konflikt (X) erzeugen
Verwenden Sie Z, um den Bus freizugebenErmöglicht anderen Geräten die Ansteuerung
Nur ein Treiber gleichzeitigVerhindert Bus-Kollisionen (Bus Contention)

Inout vs Input vs Output

Port TypeRichtungCan DriveCan Read
inputEinweg (nur in)NeinJa
outputEinweg (nur out)JaNein
inoutZweiwege (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;
challenge icon

Aufgabe

Fügen Sie den fehlenden inout-Port und die assign-Statements 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 ein assign-Statement hinzu, das io_bus mit send_value ansteuert, wenn send_enable 1 ist, andernfalls mit Z
  3. Fügen Sie ein assign-Statement hinzu, das io_bus in receive_value liest

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
  

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