Menu
Coddy logo textTech

Port-Mapping nach Name

Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy — Lektion 34 von 90.

In der vorherigen Lektion haben Sie gelernt, wie man ein Modul instanziiert, indem man Signale in der gleichen Reihenfolge übergibt, wie die Ports in der Moduldefinition erscheinen. Dies funktioniert, hat aber ein Problem: Die Reihenfolge ist entscheidend.

Wenn Sie versehentlich die Reihenfolge vertauschen, werden Signale mit den falschen Ports verbunden. Dies kann schwer zu debuggen sein.

Das Problem mit der Positionszuordnung

module or_gate (
  input in1,
  input in2,
  output result
);
  assign result = in1 | in2;
endmodule

// Positionszuordnung - Reihenfolge MUSS übereinstimmen
or_gate or1 (input_a, input_b, output_y);  // Richtig
or_gate or1 (input_b, input_a, output_y);  // Falsch! Vertauschte Eingänge

Die zweite Zeile verbindet input_b mit in1 und input_a mit in2 — ein subtiler Fehler, der leicht zu übersehen ist.

Lösung: Port-Mapping nach Name

Port-Mapping nach Name verwendet den Port-Namen, um Verbindungen herzustellen. Die Reihenfolge spielt keine Rolle, da jede Verbindung explizit gekennzeichnet ist.

Syntax:

module_name instance_name (
  .port_name(signal),
  .port_name(signal)
);

Der Punkt . vor dem Portnamen zeigt an, dass wir uns auf einen Port innerhalb des Moduls beziehen. Das Signal in Klammern ist das, was wir damit verbinden.

Beispiel

or_gate or1 (
  .in1(input_a),
  .in2(input_b),
  .result(output_y)
);

Dies besagt explizit:

  • Port in1 erhält Signal input_a
  • Port in2 erhält Signal input_b
  • Port result erhält Signal output_y

Reihenfolge spielt keine Rolle

Bei der Port-Zuweisung nach Namen können Sie die Verbindungen in beliebiger Reihenfolge schreiben:

// Alle drei sind IDENTISCH

or_gate or1 (
  .in1(input_a),
  .in2(input_b),
  .result(output_y)
);

or_gate or1 (
  .result(output_y),
  .in1(input_a),
  .in2(input_b)
);

or_gate or1 (
  .in2(input_b),
  .result(output_y),
  .in1(input_a)
);

Alle bewirken genau dasselbe, da jede Verbindung beschriftet ist.

challenge icon

Aufgabe

Vervollständigen Sie die Instanziierung, indem Sie die fehlenden Port-Verbindungen unter Verwendung von Port-Mapping nach Namen hinzufügen.

Was zu tun ist:

  1. Verbinden Sie den Port clk mit dem Signal clock_signal
  2. Verbinden Sie den Port data_in mit dem Signal input_data
  3. Verbinden Sie den Port data_out mit dem Signal output_data

Spickzettel

Die Port-Zuweisung nach Namen verwendet die Syntax .port_name(signal), wodurch die Reihenfolge irrelevant wird:

module_name instance_name (
  .port_name(signal),
  .port_name(signal)
);

Beispiel:

or_gate or1 (
  .in1(input_a),
  .in2(input_b),
  .result(output_y)
);

Der . vor dem Port-Namen bezieht sich auf einen Port innerhalb des Moduls; das Signal in Klammern ist das, was damit verbunden wird. Im Gegensatz zur Zuweisung nach Reihenfolge können Verbindungen in beliebiger Reihenfolge aufgelistet werden, ohne Fehler zu verursachen.

Probier es selbst

module register (
  input clk,
  input [7:0] data_in,
  output reg [7:0] data_out
);
  always @(posedge clk) begin
    data_out <= data_in;
  end
endmodule

module top (
  input clock_signal,
  input [7:0] input_data,
  output [7:0] output_data
);
  
  register reg1 (
    // TODO: Port-Mappings mit der Syntax .port(signal) hinzufügen
  );
  
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