Menu
Coddy logo textTech

Parámetros

Parte de la sección Fundamentos del Journey de Verilog de Coddy — lección 11 de 90.

Puedes crear muchas copias del mismo módulo y usarlas en diferentes lugares; esto se conoce como **instancias múltiples**. En lugar de escribir el mismo código una y otra vez, lo escribes una vez y lo reutilizas tantas veces como necesites. Cada instancia es una copia independiente de ese hardware en el chip.

¿Pero qué ocurre si necesitas que cada copia sea diferente? Por ejemplo, un contador de 8 bits, uno de 16 bits y otro de 32 bits. Sin parámetros, tendrías que escribir tres módulos independientes.

Los parameterresuelven este problema.

Un parameter es un valor constante que puedes definir cuando creas una instancia. Te permite configurar cada copia del module de forma diferente.

Declaración de parámetros

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

El #(parameter WIDTH = 8) define un parameter llamado WIDTH con un valor predeterminado de 8.

Al declarar parámetros, usamos el símbolo # justo después del nombre del module y antes de la lista de puertos. El # le indica a Verilog que lo que sigue es una lista de parámetros que configuran el module. Si tu module no tiene parámetros, simplemente omiten el # por completo.

Uso de parámetros

Los parámetros se pueden utilizar en cualquier lugar donde se necesite una constante:

reg [WIDTH-1:0] data;        // Tamaño del vector
count <= count + 1;           // Funciona con cualquier ancho
assign out = data[WIDTH-1];   // Posición del MSB

Sobrescribir parámetros

Cuando utilizas el módulo, puedes cambiar el valor del parámetro:

// Ancho por defecto (8 bits)
counter u1 (.clk(clk), .reset(reset), .count(count1));

// Sobrescribir a 16 bits
counter #(.WIDTH(16)) u2 (.clk(clk), .count(count2));

Multiple Parameters

Puedes tener múltiples parámetros:

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 es similar pero no se puede anular desde fuera:

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

Use localparam para constantes que no deben cambiar.

challenge icon

Desafío

Añade un parámetro llamado WIDTH con un valor predeterminado de 4.

Qué hacer:

  1. Añade un parámetro llamado WIDTH
  2. Establece su valor predeterminado en 4
  3. El parámetro va dentro de #( ) después del nombre del módulo

Pruébalo tú mismo

module counter #(
  // Añade el parámetro WIDTH aquí con valor por defecto 4
  
)(
  input clk,
  input reset,
  output reg [WIDTH-1:0] count
);

endmodule
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Fundamentos