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 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 nach außen treiben 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:

  • Gemeinsam genutzte Busse: mehrere Geräte, die mit denselben Leitungen verbunden sind
  • Speicherdatenbusse: Daten können read oder geschrieben werden
  • Bidirectional-Kommunikation: I2C, SPI usw.

Nur ein Gerät treibt den Bus gleichzeitig. Andere Geräte müssen sich im hochohmigen Zustand (Z) befinden.

Einen Inout-Port deklarieren

inout [7:0] data_bus;   // 8-Bit bidirektionaler Bus
inout ready;             // Ein-Bit bidirektionales Signal

So funktioniert Inout

Ein inout-Port benötigt ein Steuersignal, um zu entscheiden, ob er als input oder output arbeitet:

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, drives das module den bus (output mode)
  • Wenn enable = 0, gibt das module den bus frei (input mode, high-Z)

Wichtige Regeln für Inout

RegelWarum
Muss als wire deklariert werdenKann kein reg sein
Kann nicht gleichzeitig gelesen und beschrieben werdenWürde einen Konflikt (X) verursachen
Verwende Z, um den Bus freizugebenErmöglicht es anderen Geräten, ihn zu treiben
Immer nur ein Treiber gleichzeitigVerhindert Buskonflikte

Inout vs Input vs Output

PorttypRichtungKann DriveKann Read
inputEin Weg (nur hinein)NeinJa
outputEin Weg (nur hinaus)JaNein
inoutZwei Wege (beide)Ja (wenn enabled)Ja (always)

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

Add den fehlenden inout-port und die assign-Anweisungen hinzu, um diesen bidirectional-Puffer funktionsfähig zu machen.

Was zu tun ist:

  1. Add einen 8-Bit-inout-port called io_bus hinzu
  2. Add eine assign-statement hinzu, die io_bus mit send_value drives, when send_enable 1 ist, otherwise Z
  3. Add eine assign-statement hinzu, die io_bus in receive_value reads

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