Menu
CoddyTech

Parameter

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

Du kannst viele Kopien desselben Moduls erstellen und sie an verschiedenen Stellen verwenden. Das nennt man **mehrere Instanzen**. Anstatt denselben Code immer wieder zu schreiben, schreibst du ihn einmal und verwendest ihn so oft wieder, wie du ihn brauchst. Jede Instanz ist eine separate Kopie dieser Hardware auf dem Chip.

Aber was, 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üsstest du drei separate Module schreiben.

Parameter lösen dieses Problem.

Ein Parameter ist ein konstanter Wert, den du beim Erstellen einer Instanz festlegen kannst. Damit kannst du jede Kopie des Moduls anders konfigurieren.

Parameter deklarieren

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

Der #(parameter WIDTH = 8) definiert einen Parameter namens WIDTH mit einem Standardwert von 8.

Bei der Deklaration von Parametern verwenden wir das Symbol # direkt nach dem Modulnamen und vor der Portliste. # teilt Verilog mit, dass darauf eine Liste von Parametern folgt, die das Modul konfigurieren. Wenn dein Modul keine Parameter hat, lässt du # einfach ganz weg.

Parameter verwenden

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 Bitbreite
assign out = data[WIDTH-1];   // Position des höchstwertigen Bits (MSB)

Parameter überschreiben

Wenn du das Modul verwendest, kannst du den Parameterwert ändern:

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

// Auf 16 Bit ändern
counter #(.WIDTH(16)) u2 (.clk(clk), .count(count2));

Mehrere Parameter

Du kannst 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 überschrieben 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

Verwende localparam für Konstanten, die sich nicht ändern sollen.

challenge icon

Aufgabe

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

Was zu tun ist:

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

Probier es selbst

module counter #(
  // Füge hier den Parameter WIDTH mit dem Standardwert 4 hinzu
  
)(
  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

Übe selbstständig: Online-Verilog-Compiler