Parameter
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy — Lektion 11 von 90.
Sie können viele Kopien desselben Moduls erstellen und sie an verschiedenen Stellen verwenden – dies wird als **multiple Instanzen** bezeichnet. Anstatt denselben Code immer wieder zu schreiben, schreiben Sie ihn einmal und verwenden ihn so oft wie nötig wieder. Jede Instanz ist eine separate Kopie dieser Hardware auf dem Chip.
Aber was ist, wenn jede Kopie anders sein muss? Zum Beispiel ein 8-Bit-Zähler, ein 16-Bit-Zähler und ein 32-Bit-Zähler. Ohne Parameter müssten Sie drei separate Module schreiben.
Parameter lösen dieses Problem.
Ein Parameter ist ein konstanter Wert, den Sie beim Erstellen einer Instanz festlegen können. Er ermöglicht es Ihnen, jede Kopie des Moduls unterschiedlich zu konfigurieren.
Parameter deklarieren
module counter #(
parameter WIDTH = 8
)(
input clk,
output reg [WIDTH-1:0] count
);
always @(posedge clk) count <= count + 1;
endmoduleDas #(parameter WIDTH = 8) definiert einen Parameter namens WIDTH mit einem Standardwert von 8.
Beim Deklarieren von Parametern verwenden wir das #-Symbol direkt nach dem Modulnamen und vor der Portliste. Das # teilt Verilog mit, dass das Folgende eine Liste von Parametern ist, die das Modul konfigurieren. Wenn Ihr Modul keine Parameter hat, lassen Sie # einfach ganz weg.
Verwendung von Parametern
Parameter können überall dort verwendet werden, wo eine Konstante benötigt wird:
reg [WIDTH-1:0] data; // Vektorgröße
count <= count + 1; // Funktioniert mit jeder Breite
assign out = data[WIDTH-1]; // MSB-PositionParameter überschreiben
Wenn Sie das Modul verwenden, können Sie den Parameterwert ändern:
// Standardbreite (8 Bit)
counter u1 (.clk(clk), .reset(reset), .count(count1));
// Auf 16 Bit überschreiben
counter #(.WIDTH(16)) u2 (.clk(clk), .reset(reset), .count(count2));Mehrere Parameter
Sie können mehrere Parameter haben:
module fifo #(
parameter DEPTH = 16,
parameter WIDTH = 8
)(
input clk, wr_en, rd_en,
input [WIDTH-1:0] data_in,
output [WIDTH-1:0] data_out
);
reg [WIDTH-1:0] memory [0:DEPTH-1];
endmoduleLocalparam
Ein localparam ist ähnlich, kann aber von außen nicht überschrieben werden:
module example;
localparam STATE_IDLE = 2'b00;
localparam STATE_RUN = 2'b01;
localparam STATE_STOP = 2'b10;
// Diese Werte sind innerhalb dieses Moduls fest vorgegeben
endmoduleVerwenden Sie localparam für Konstanten, die sich nicht ändern sollten.
Aufgabe
Füge einen Parameter namens WIDTH mit einem Standardwert von 4 hinzu.
Was zu tun ist:
- Füge einen Parameter namens
WIDTHhinzu - Setze seinen Standardwert auf
4 - Der Parameter wird innerhalb von
#( )nach dem Modulnamen eingefügt
Spickzettel
Parameter ermöglichen es, Modulinstanzen unterschiedlich zu konfigurieren, ohne den Code neu schreiben zu müssen.
Deklarieren von Parametern
module counter #(
parameter WIDTH = 8 // Standardwert
)(
input clk,
output reg [WIDTH-1:0] count
);
always @(posedge clk) count <= count + 1;
endmoduleÜberschreiben von Parametern bei der Instanziierung
counter u1 (.clk(clk), .count(count1)); // verwendet Standardwert (8)
counter #(.WIDTH(16)) u2 (.clk(clk), .count(count2)); // überschrieben auf 16Mehrere Parameter
module fifo #(
parameter DEPTH = 16,
parameter WIDTH = 8
)( ... );Localparam (nicht überschreibbare Konstante)
localparam STATE_IDLE = 2'b00;
localparam STATE_RUN = 2'b01;Verwenden Sie localparam für interne Konstanten, die nicht von außerhalb des Moduls geändert werden dürfen.
Probier es selbst
module counter #(
// Parameter WIDTH hier mit Standardwert 4 hinzufügen
)(
input clk,
input reset,
output reg [WIDTH-1:0] count
);
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