Mapeo 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 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 accidentalmente confundes 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 a in1 e input_a a in2 — un error sutil que es fácil de pasar por alto.
Solución: Port Mapping By Name
El mapeo de puertos por nombre utiliza el port_name para realizar las 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 entre 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 el mapeo 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)
);Todos hacen exactamente lo mismo porque cada conexión está etiquetada.
Desafío
Completa la instanciación añadiendo las conexiones de puertos que faltan utilizando la asignación de puertos por nombre (mapping 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 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