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ängeDie 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
in1erhält Signalinput_a - Port
in2erhält Signalinput_b - Port
resulterhält Signaloutput_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.
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:
- 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
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
);
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