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 cómo 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 incorrectos. Esto puede ser difícil de depurar.
El problema con el mapeo por orden
module or_gate (
input in1,
input in2,
output result
);
assign result = in1 | in2;
endmodule
// Mapeo por 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 e input_a con in2 — un error sutil que es fácil de pasar por alto.
Solución: Mapeo de puertos por nombre
El mapeo de puertos por nombre utiliza el nombre del puerto para realizar 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 estamos refiriendo 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 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 agregando las conexiones de puerto faltantes utilizando 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
Hoja de referencia
El mapeo de puertos por nombre utiliza la sintaxis .port_name(signal), haciendo que el orden sea irrelevante:
module_name instance_name (
.port_name(signal),
.port_name(signal)
);Ejemplo:
or_gate or1 (
.in1(input_a),
.in2(input_b),
.result(output_y)
);El . antes del nombre del puerto se refiere a un puerto dentro del módulo; la señal entre paréntesis es lo que se conecta a él. A diferencia del mapeo por orden, las conexiones pueden listarse en cualquier orden sin causar errores.
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: Agregar mapeos de puertos usando la sintaxis .puerto(señal)
);
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