Parameters
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 denomina **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 independiente de ese hardware en el chip.
Pero ¿qué ocurre 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 independientes.
Los parámetros resuelven este problema.
Un parámetro es un valor constante que puedes establecer cuando creas una instancia. Te permite configurar cada copia del módulo de forma diferente.
Declarar parámetros
module counter #(
parameter WIDTH = 8
)(
input clk,
output reg [WIDTH-1:0] count
);
always @(posedge clk) count <= count + 1;
endmodule#(parameter WIDTH = 8) define un parámetro llamado WIDTH con un valor predeterminado de 8.
Al declarar parámetros, usamos el símbolo # justo después del nombre del módulo y antes de la lista de puertos. El símbolo # 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 usar 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 MSBSobrescritura de parameter
Cuando usas el módulo, puedes cambiar el valor de parameter:
// 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));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 overridden 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
endmoduleUsa localparam para las constantes que no deben cambiar.
Desafío
Añade un parámetro llamado WIDTH con un valor predeterminado de 4.
Qué hacer:
- Añade un parámetro llamado
WIDTH - Establece su valor predeterminado en
4 - 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 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 VerilogHardware frente a softwareTu primer móduloComentariosNiveles de abstracción del diseño4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine LogicPractica por tu cuenta: Compilador de Verilog online