Puertos Inout
Parte de la sección Fundamentos del Journey de Verilog de Coddy — lección 32 de 90.
Un puerto inout es un puerto bidireccional que puede tanto enviar como recibir señales. Puede actuar como una entrada o una salida en diferentes momentos.
La mayoría de los puertos son input (los datos fluyen hacia adentro) o output (los datos fluyen hacia afuera). Un puerto inout puede hacer ambas cosas: puede enviar datos hacia afuera o recibir datos hacia adentro, dependiendo de la situación.
Piénsalo como una calle de doble sentido en lugar de una carretera de sentido único.
Los puertos inout se utilizan para:
- Buses compartidos — múltiples dispositivos conectados a los mismos cables
- Buses de datos de memoria — los datos se pueden leer o escribir
- Comunicación bidireccional — I2C, SPI, etc.
Solo un dispositivo controla el bus a la vez. Los otros dispositivos deben estar en estado de alta impedancia (Z).
Declaración de un puerto Inout
inout [7:0] data_bus; // bus bidireccional de 8 bits
inout ready; // señal bidireccional de un solo bitCómo funciona Inout
Un puerto inout requiere una señal de control para decidir si está actuando como una entrada o como una salida:
module bidir (
inout [7:0] bus,
input [7:0] data_out,
input enable,
output [7:0] data_in
);
assign bus = (enable) ? data_out : 8'bZ; // Manejar el bus cuando esté habilitado, de lo contrario Z
assign data_in = bus; // Leer siempre el bus
endmodule- Cuando
enable = 1, el módulo controla el bus (modo de salida) - Cuando
enable = 0, el módulo libera el bus (modo de entrada, high-Z)
Reglas importantes para Inout
| Regla | Por qué |
|---|---|
Debe declararse como wire | No puede ser reg |
| No se puede leer y escribir al mismo tiempo | Crearía un conflicto (X) |
Use Z para liberar el bus | Permite que otros dispositivos lo manejen |
| Solo un controlador a la vez | Evita la contención del bus |
Inout vs Input vs Output
| Tipo de puerto | Dirección | Puede controlar | Puede leer |
|---|---|---|---|
input | Unidireccional (solo entrada) | No | Sí |
output | Unidireccional (solo salida) | Sí | No |
inout | Bidireccional (ambos) | Sí (cuando está habilitado) | Sí (siempre) |
Error común
// INCORRECTO: No se puede asignar a inout dentro de un bloque always
always @(posedge clk) begin
data_bus <= something; // ¡Error! Use assign con una condición
end// CORRECTO: Usar assign con condición de habilitación
assign data_bus = (enable) ? something : 8'bZ;Desafío
Añade el puerto inout faltante y las sentencias assign para que este búfer bidireccional funcione.
Qué hacer:
- Añade un puerto
inoutde 8 bits llamadoio_bus - Añade una sentencia
assignque manejeio_busconsend_valuecuandosend_enablesea 1, de lo contrarioZ - Añade una sentencia
assignque leaio_busenreceive_value
Hoja de referencia
inout es un puerto bidireccional que puede tanto enviar como recibir señales. Solo un dispositivo controla el bus a la vez; los demás deben emitir alta impedancia (Z).
module bidir (
inout [7:0] bus,
input [7:0] data_out,
input enable,
output [7:0] data_in
);
assign bus = (enable) ? data_out : 8'bZ; // Drive when enabled, else release
assign data_in = bus; // Always read the bus
endmoduleReglas clave:
- Debe ser
wire(noreg) - Use
assigncon una condición ternaria — nunca asigne dentro de un bloquealways - Libere con
Zcuando no esté enviando señal para evitar la contención del bus
Pruébalo tú mismo
module bidir_buffer (
// Tarea 1: Agregue un puerto inout de 8 bits llamado io_bus aquí
input [7:0] send_value,
input send_enable,
output [7:0] receive_value
);
// Tarea 2: Agregue una sentencia assign que maneje io_bus con send_value cuando send_enable sea 1, de lo contrario Z
// Tarea 3: Agregue una sentencia assign que lea io_bus en receive_value
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