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 Sie ein Modul instanziieren, indem Sie Signale in der gleichen Reihenfolge übergeben, wie die Ports in der Moduldefinition erscheinen. Das funktioniert, hat aber ein Problem: Die Reihenfolge ist wichtig.
Wenn Sie versehentlich die Reihenfolge vertauschen, werden Signale mit den falschen Ports verbunden. Das kann schwer zu debuggen sein.
Das Problem mit der Zuordnung nach Reihenfolge (Order Mapping)
module or_gate (
input in1,
input in2,
output result
);
assign result = in1 | in2;
endmodule
// Reihenfolge-Zuordnung - Reihenfolge MUSS übereinstimmen
or_gate or1 (input_a, input_b, output_y); // Korrekt
or_gate or1 (input_b, input_a, output_y); // Falsch! Vertauschte EingängeDie zweite Zeile verbindet input_b mit in1 und input_a mit in2 — ein subtiler Fehler, der leicht übersehen werden kann.
Lösung: Port-Mapping nach Name
Port-Mapping nach Name verwendet den port_name, 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 Port-Namen zeigt an, dass wir sich auf einen Port innerhalb des Moduls beziehen. Das Signal in den Klammern ist das, was wir damit verbinden.
Beispiel
or_gate or1 (
.in1(input_a),
.in2(input_b),
.result(output_y)
);Dies besagt explizit:
- Port
in1erhält das Signalinput_a - Port
in2erhält das Signalinput_b - Port
resulterhält das Signaloutput_y
Reihenfolge spielt keine Rolle
Beim Port-Mapping 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 exakt dasselbe, da jede Verbindung beschriftet ist.
Aufgabe
Vervollständigen Sie die Instanziierung, indem Sie die fehlenden Port-Verbindungen mittels port mapping by name hinzufügen.
Was zu tun ist:
- Verbinden Sie den Port
clkmit dem Signalclock_signal - Verbinden Sie den Port
data_inmit dem Signalinput_data - Verbinden Sie den Port
data_outmit dem Signaloutput_data
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-Zuordnungen mit der Syntax .port(signal) hinzufügen
);
endmoduleDiese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Grundlagen
1Einführung
Was ist VerilogHardware vs. SoftwareAbstraktionsebenen im DesignDein erstes ModulKommentare4Operatoren Teil 1
Arithmetische OperatorenModulo-OperatorVergleichsoperatorenWiederholung – Einfache MathematikBitweise Operatoren7Zuweisung und Gatter
Kontinuierliche ZuweisungZuweisung mit OperatorenIntegrierte Gatter-PrimitiveAND OR NOT GatterXOR XNOR GatterZusammenfassung - Logikgatterschaltung10Entscheidungsfindung
If-AnweisungIf - ElseWiederholung - Einfacher KomparatorCase-AnweisungCasex und CasezWiederholung - ALU-Design5Operatoren Teil 2
Logische OperatorenReduktionsoperatorenShift-OperatorenVerkettungsoperatorBedingter OperatorZusammenfassung – Operator-Challenge11Schleifen
For-SchleifeWhile-SchleifeRepeat-SchleifeEndlosschleifeDisable-AnweisungRückblick – Schleifenmuster3Zahlensystem
Binäre DarstellungZahlen mit GrößenangabeZahlen ohne GrößenangabeNegative ZahlenSpezialwerte X und ZZusammenfassung – Zahlenformate6Module
ModulstrukturEingangs- und Ausgangs-PortsInout-PortsModul-InstanziierungPort-Mapping nach NamePort-Mapping nach ReihenfolgeZusammenfassung – Ein Modul erstellen