Asignación de puertos por nombre
Parte de la sección Fundamentos del Journey de Verilog de Coddy. Lección 34 de 90.
En la lección anterior, aprendiste a instanciar un módulo pasando las señales en el mismo orden en que aparecen los puertos en la definición del módulo. Esto funciona, pero tiene un problema: el orden importa.
Si mezclas accidentalmente el orden, las señales se conectan a los puertos equivocados. Esto puede ser difícil de depurar.
El problema con la asignación por orden
module or_gate (
input in1,
input in2,
output result
);
assign result = in1 | in2;
endmodule
// Mapeo de orden - el orden DEBE coincidir
or_gate or1 (input_a, input_b, output_y); // Correcto
or_gate or1 (input_b, input_a, output_y); // ¡Incorrecto! Entradas intercambiadasLa segunda línea conecta input_b con in1 y input_a con in2: un error sutil que es fácil pasar por alto.
Solución: asignación de puertos por nombre
La asignación de puertos por nombre utiliza el nombre del puerto para establecer conexiones. El orden no importa porque cada conexión está etiquetada explícitamente.
Sintaxis:
module_name instance_name (
.port_name(signal),
.port_name(signal)
);El punto . antes del nombre del puerto indica que nos referimos a un puerto dentro del módulo. La señal dentro de los paréntesis es lo que conectamos a él.
Ejemplo
or_gate or1 (
.in1(input_a),
.in2(input_b),
.result(output_y)
);Esto dice explícitamente:
- El puerto
in1recibe la señalinput_a - El puerto
in2recibe la señalinput_b - El puerto
resultrecibe la señaloutput_y
El orden no importa
Con la asignación de puertos por nombre, puedes escribir las conexiones en cualquier orden:
// Los tres son IDÉNTICOS
or_gate or1 (
.in1(input_a),
.in2(input_b),
.result(output_y)
);
or_gate or1 (
.result(output_y),
.in1(input_a),
.in2(input_b)
);
or_gate or1 (
.in2(input_b),
.result(output_y),
.in1(input_a)
);All hacen exactamente lo mismo porque cada conexión está etiquetada.
Desafío
Completa la instanciación agregando las conexiones de puertos que faltan mediante el mapeo de puertos por nombre.
Qué hacer:
- Conecta el puerto
clka la señalclock_signal - Conecta el puerto
data_ina la señalinput_data - Conecta el puerto
data_outa la señaloutput_data
Pruébalo tú mismo
module register (
input clk,
input [7:0] data_in,
output reg [7:0] data_out
);
always @(posedge clk) begin
data_out <= data_in;
end
endmodule
module top (
input clock_signal,
input [7:0] input_data,
output [7:0] output_data
);
register reg1 (
// TODO: Añade mapeos de puertos usando la sintaxis .port(signal)
);
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ño4Operadores, parte 1
Operadores aritméticosOperador móduloOperadores de comparaciónRepaso: matemáticas simplesOperadores bit a bit7Asignaciones y compuertas
Asignación continuaAsignación con operadoresPrimitivas de compuertas integradasCompuertas AND, OR y NOTCompuertas XOR y XNORRepaso: 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 condicionalRepaso: desafío de operadores11Bucles
Bucle ForBucle WhileBucle de repeticiónBucle infinitoInstrucción DisableRepaso: patrones de bucles3Sistema numérico
Representación binariaNúmeros con tamañoNúmeros sin tamañoNúmeros negativosValores especiales X y ZRepaso: formatos numéricos6Módulos
Estructura de módulosPuertos de entrada y salidaPuertos inoutInstanciación de módulosAsignación de puertos por nombreAsignación de puertos por ordenRepaso: construir un móduloPractica por tu cuenta: Compilador de Verilog online