Port Mapping By Name
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy. Lektion 34 von 90.
In der vorherigen Lektion hast du gelernt, wie man ein Modul instanziiert, indem man Signale in derselben Reihenfolge übergibt, in der die Ports in der Moduldefinition erscheinen. Das funktioniert, hat aber ein Problem: die Reihenfolge ist entscheidend.
Wenn du versehentlich die Reihenfolge vertauschst, werden die Signale mit den falschen Ports verbunden. Das kann schwer zu debuggen sein.
Das Problem mit der Positionszuordnung
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); // 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 übersehen wird.
Lösung: Port-Zuordnung nach Namen
Die Port-Zuordnung nach Namen verwendet den Portnamen, um Verbindungen herzustellen. Die Reihenfolge spielt keine Rolle, da jede Verbindung ausdrücklich 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 den Klammern ist das Signal, das wir damit verbinden.
Beispiel
or_gate or1 (
.in1(input_a),
.in2(input_b),
.result(output_y)
);Dies besagt ausdrücklich:
- Port
in1erhält das Signalinput_a - Port
in2erhält das Signalinput_b - Port
resulterhält das Signaloutput_y
Die Reihenfolge spielt keine Rolle
Bei der Portzuordnung nach Namen kannst du 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 machen genau dasselbe, weil jede Verbindung beschriftet ist.
Aufgabe
Vervollständige die Instanziierung, indem du die fehlenden Portverbindungen mithilfe von Portzuordnung nach Namen hinzufügst.
Aufgabe:
- Verbinde den Port
clkmit dem Signalclock_signal - Verbinde den Port
data_inmit dem Signalinput_data - Verbinde 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 .port(signal)-Syntax 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. SoftwareIhr erstes ModulKommentareAbstraktionsebenen des Designs4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine LogicÜbe selbstständig: Online-Verilog-Compiler