Menu
Coddy logo textTech

Parameter

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

Sie können viele Kopien eines selben Moduls erstellen und sie an verschiedenen Stellen verwenden — das nennt man **mehrfache Instanzen** (**multiple instances**). Anstatt denselben Code immer wieder neu zu schreiben, schreiben Sie ihn einmal und verwenden ihn so oft wieder, wie Sie benötigen. Jede Instanz ist eine separate Kopie dieser Hardware auf dem Chip.

Aber was ist, wenn jede Kopie unterschiedlich sein muss? Zum Beispiel ein 8-Bit-counter, ein 16-Bit-counter und ein 32-Bit-counter. Ohne parameter müssten Sie drei separate module schreiben.

Parameters 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 module unterschiedlich zu konfigurieren.

Parameter deklarieren

module counter #(
  parameter WIDTH = 8
)(
  input clk,
  output reg [WIDTH-1:0] count
);
  always @(posedge clk) count <= count + 1;
endmodule

Das #(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 danach eine Liste von Parametern folgt, die das Modul konfigurieren. Wenn Ihr Modul keine Parameter hat, lassen Sie # einfach vollständig 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-Position

Parameter überschreiben

Wenn Sie das `module` verwenden, können Sie den `parameter`-Wert ändern:

// Standardbreite (8 Bits)
counter u1 (.clk(clk), .reset(reset), .count(count1));

// Überschreiben auf 16 Bits
counter #(.WIDTH(16)) u2 (.clk(clk), .count(count2));

Multiple Parameters

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];
endmodule

Localparam

Ein localparam ist ähnlich, kann aber nicht von außen overridden werden:

module example;
  localparam STATE_IDLE = 2'b00;
  localparam STATE_RUN = 2'b01;
  localparam STATE_STOP = 2'b10;
  // These values are fixed inside this module
endmodule

Verwenden Sie localparam für Konstanten, die sich nicht ändern sollten.

challenge icon

Aufgabe

Füge einen Parameter namens WIDTH mit einem Standardwert von 4 hinzu.

Was zu tun ist:

  1. Füge einen Parameter namens WIDTH hinzu
  2. Setze seinen Standardwert auf 4
  3. Der Parameter gehört in #( ) nach dem Modulnamen

Probier es selbst

module counter #(
  // Parameter WIDTH hier mit Standardwert 4 hinzufügen
  
)(
  input clk,
  input reset,
  output reg [WIDTH-1:0] count
);

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