Inout Ports
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 enviar y 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 dentro) o output (los datos fluyen hacia fuera). Un puerto inout puede hacer ambas cosas. Puede enviar datos hacia fuera o recibir datos hacia dentro, dependiendo de la situación.
Piensa en ello como una calle de doble sentido en lugar de una carretera de un solo sentido.
Los puertos inout se utilizan para:
- bus compartidos: varios dispositivos conectados a los mismos cables
- bus de datos de memoria: los datos se pueden leer o escribir
- Comunicación bidirectional: I2C, SPI, etc.
Solo un dispositivo drives el bus a la vez. Los demás dispositivos deben estar en estado de alta impedancia (Z).
Declarar 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 actúa como input o output:
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 bus when enabled, else Z
assign data_in = bus; // Always read the bus
endmodule- When
enable = 1, el module drives el bus (modo output) - When
enable = 0, el module libera el bus (modo input, high-Z)
Reglas importantes para inout
| Regla | Por qué |
|---|---|
Debe declararse como wire | Cannot ser reg |
| Cannot leerse y escribirse al mismo tiempo | Crearía un conflicto (X) |
Usa Z para liberar el bus | Permite que otros dispositivos lo controlen |
| Solo un controlador a la vez | Evita la contención del bus |
Inout vs Input vs Output
| Tipo de port | Dirección | Puede Drive | Puede Read |
|---|---|---|---|
input | Unidireccional (solo entrada) | No | Sí |
output | Unidireccional (solo salida) | Sí | No |
inout | Bidireccional (ambas) | Sí (when enabled) | Sí (always) |
error común
// WRONG: No se puede asignar a inout dentro de un bloque always
always @(posedge clk) begin
data_bus <= something; // ¡Error! Usa assign con condición
end
// CORRECT: Usa assign con condición de enable
assign data_bus = (enable) ? something : 8'bZ;Desafío
Añade el puerto inout que falta y las instrucciones assign para que este búfer bidireccional funcione.
Qué hacer:
- Añade un puerto
inoutde 8 bits llamadoio_bus - Añade una instrucción
assignque dirijaio_busconsend_valuecuandosend_enablesea 1; de lo contrario,Z - Añade una instrucción
assignque leaio_busenreceive_value
Pruébalo tú mismo
module bidir_buffer (
// Tarea 1: Añade 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: Añade una sentencia assign que impulse io_bus con send_value cuando send_enable es 1, de lo contrario Z
// Tarea 3: Añade 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 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