Menu
CoddyTech

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 punti 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 ti serve. 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 permette 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 pari a 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 #.

Utilizzo dei parametri

I parametri possono essere usati ovunque sia necessario un valore costante:

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

Sovrascrivere i parametri

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

// Larghezza predefinita (8 bit)
counter u1 (.clk(clk), .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

Localparam

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 dovrebbero cambiare.

challenge icon

Sfida

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

Cosa fare:

  1. Aggiungi un parametro chiamato WIDTH
  2. Imposta il suo valore predefinito su 4
  3. Il parametro va dentro #( ), 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