Menu
Coddy logo textTech

Parametri

Fa parte della sezione Fondamenti del percorso Verilog di Coddy. Lezione 11 di 90.

Puoi creare molte copie dello stesso modulo e usarle in posti diversi. Questo si chiama **istanze multiple**. Invece di scrivere lo stesso codice più e più volte, lo scrivi una volta e lo riutilizzi tutte le volte che vuoi. Ogni istanza è una copia separata di quell'hardware sul chip.

Ma cosa succede se hai bisogno che ogni copia sia diversa? Per esempio, un contatore a 8 bit, uno a 16 bit e uno a 32 bit. Senza parametri, dovresti scrivere tre moduli separati.

I parametri risolvono questo problema.

Un parametro è un valore costante che puoi impostare quando crei un'istanza. Ti consente di configurare ogni copia del modulo in modo diverso.

Dichiarazione dei parametri

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

#(parameter WIDTH = 8) definisce un parametro chiamato WIDTH con un valore predefinito di 8.

Quando dichiariamo i parametri, usiamo il simbolo # subito dopo il nome del modulo e prima dell’elenco delle porte. # indica a Verilog che ciò che segue è un elenco di parametri che configurano il modulo. Se il tuo modulo non ha parametri, ometti semplicemente del tutto #.

Usare i parametri

I parametri possono essere usati ovunque sia necessaria una costante:

reg [WIDTH-1:0] data;        // Dimensione del vettore
count <= count + 1;           // Funziona con qualsiasi larghezza
assign out = data[WIDTH-1];   // Posizione del MSB

Sovrascrivere i parametri

Quando usi il modulo, puoi modificare il valore del parametro:

// Larghezza predefinita (8 bit)
counter u1 (.clk(clk), .reset(reset), .count(count1));

// Imposta la larghezza a 16 bit
counter #(.WIDTH(16)) u2 (.clk(clk), .count(count2));

Parametri multipli

Puoi avere più parametri:

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

Parametro locale

Un localparam è simile, ma non può essere sovrascritto dall'esterno:

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

Usa localparam per le costanti che non devono cambiare.

challenge icon

Sfida

Aggiungi un parametro chiamato WIDTH con un valore predefinito di 4.

Cosa fare:

  1. Aggiungi un parametro denominato WIDTH
  2. Imposta il suo valore predefinito su 4
  3. Il parametro va all'interno di #( ) dopo il nome del modulo

Provalo tu

module counter #(
  // Aggiungi qui il parametro WIDTH con valore predefinito 4
  
)(
  input clk,
  input reset,
  output reg [WIDTH-1:0] count
);

endmodule
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fondamenti

Esercitati da solo: Compilatore Verilog online