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 llama **múltiples instancias**. 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 separada de ese hardware en el chip.
¿Pero qué pasa si necesitas que cada copia sea diferente? Por ejemplo, un contador de 8 bits, un contador de 16 bits y un contador de 32 bits. Sin parámetros, tendrías que escribir tres módulos separados.
Los parámetros resuelven este problema.
Un parámetro es un valor constante que puedes establecer al crear una instancia. Te permite configurar cada copia del módulo 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;
endmoduleEl #(parameter WIDTH = 8) define un parámetro llamado WIDTH con un valor predeterminado de 8.
Al declarar parámetros, utilizamos el símbolo # justo después del nombre del módulo 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 módulo. Si tu módulo no tiene parámetros, simplemente omites # 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 MSBSobrescribir 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), .reset(reset), .count(count2));Múltiples Parámetros
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];
endmoduleLocalparam
Un localparam es similar pero no puede ser sobrescrito desde el exterior:
module example;
localparam STATE_IDLE = 2'b00;
localparam STATE_RUN = 2'b01;
localparam STATE_STOP = 2'b10;
// Estos valores son fijos dentro de este módulo
endmoduleUsa localparam para constantes que no deberían cambiar.
Desafío
Añade un parámetro llamado WIDTH con un valor por defecto de 4.
Qué hacer:
- Añade un parámetro llamado
WIDTH - Establece su valor por defecto en
4 - El parámetro va dentro de
#( )después del nombre del módulo
Hoja de referencia
Los parámetros permiten configurar las instancias de los módulos de manera diferente sin tener que reescribir el código.
Declaración de Parámetros
module counter #(
parameter WIDTH = 8 // default value
)(
input clk,
output reg [WIDTH-1:0] count
);
always @(posedge clk) count <= count + 1;
endmoduleSobrescribir Parámetros en la Instanciación
counter u1 (.clk(clk), .count(count1)); // uses default (8)
counter #(.WIDTH(16)) u2 (.clk(clk), .count(count2)); // overridden to 16Múltiples Parámetros
module fifo #(
parameter DEPTH = 16,
parameter WIDTH = 8
)( ... );Localparam (constante no sobrescribible)
localparam STATE_IDLE = 2'b00;
localparam STATE_RUN = 2'b01;Utilice localparam para constantes internas que no deben cambiarse desde fuera del módulo.
Pruébalo tú mismo
module counter #(
// Agrega el parámetro WIDTH aquí con el valor predeterminado 4
)(
input clk,
input reset,
output reg [WIDTH-1:0] count
);
endmoduleEsta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Fundamentos
1Introducción
¿Qué es Verilog?Hardware vs SoftwareNiveles de abstracción de diseñoTu primer móduloComentarios4Operadores Parte 1
Operadores aritméticosOperador de móduloOperadores de comparaciónRepaso - Matemáticas simplesOperadores bit a bit7Asignación y Compuertas
Asignación ContinuaAsignación con OperadoresPrimitivas de Compuertas IntegradasCompuertas AND OR NOTCompuertas XOR XNORResumen - Circuito de Compuertas Lógicas10Toma de decisiones
Sentencia IfIf - ElseRepaso - Comparador simpleSentencia CaseCasex y CasezRepaso - Diseño de ALU5Operadores Parte 2
Operadores lógicosOperadores de reducciónOperadores de desplazamientoOperador de concatenaciónOperador condicionalResumen - Desafío de operadores3Sistema de numeración
Representación binariaNúmeros con tamaño definidoNúmeros sin tamaño definidoNúmeros negativosValores especiales X y ZResumen - Formatos de números6Módulos
Estructura del móduloPuertos de entrada y salidaPuertos InoutInstanciación de módulosMapeo de puertos por nombreMapeo de puertos por ordenResumen: Construye un módulo