Portas Inout
Parte da seção Fundamentos do Journey de Verilog da Coddy — lição 32 de 90.
Uma porta inout é uma porta bidirecional que pode tanto enviar quanto receber sinais. Ela pode atuar como uma entrada ou uma saída em diferentes momentos.
A maioria das portas é input (os dados fluem para dentro) ou output (os dados fluem para fora). Uma porta inout pode fazer ambos — ela pode enviar dados para fora ou receber dados para dentro, dependendo da situação.
Pense nisso como uma rua de mão dupla em vez de uma estrada de mão única.
Portas inout são usadas para:
- Barramentos compartilhados — múltiplos dispositivos conectados aos mesmos fios
- Barramentos de dados de memória — os dados podem ser lidos ou gravados
- Comunicação bidirecional — I2C, SPI, etc.
Apenas um dispositivo aciona o barramento por vez. Outros dispositivos devem estar em estado de alta impedância (Z).
Declarando uma Porta Inout
inout [7:0] data_bus; // barramento bidirecional de 8 bits
inout ready; // sinal bidirecional de bit únicoComo o Inout Funciona
Uma porta inout requer um sinal de controle para decidir se ela está atuando como uma entrada ou saída:
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; // Aciona o barramento quando habilitado, caso contrário Z
assign data_in = bus; // Sempre lê o barramento
endmodule- Quando
enable = 1, o módulo aciona o barramento (modo de saída) - Quando
enable = 0, o módulo libera o barramento (modo de entrada, high-Z)
Regras Importantes para Inout
| Regra | Por que |
|---|---|
Deve ser declarado como wire | Não pode ser reg |
| Não pode ser lido e escrito ao mesmo tempo | Criaria um conflito (X) |
Use Z para liberar o barramento | Permite que outros dispositivos conduzam |
| Apenas um condutor por vez | Previne a contenção do barramento |
Inout vs Input vs Output
| Tipo de Porta | Direção | Pode Acionar | Pode Ler |
|---|---|---|---|
input | Unidirecional (apenas entrada) | Não | Sim |
output | Unidirecional (apenas saída) | Sim | Não |
inout | Bidirecional (ambos) | Sim (quando habilitado) | Sim (sempre) |
Erro Comum
// ERRADO: Não é possível atribuir a inout dentro de um bloco always
always @(posedge clk) begin
data_bus <= something; // Erro! Use assign com condição
end// CORRETO: Use assign com condição enable
assign data_bus = (enable) ? something : 8'bZ;Desafio
Adicione a porta inout que está faltando e as instruções assign para fazer este buffer bidirecional funcionar.
O que fazer:
- Adicione uma porta
inoutde 8 bits chamadaio_bus - Adicione uma instrução
assignque direcioneio_buscomsend_valuequandosend_enablefor 1, caso contrárioZ - Adicione uma instrução
assignque leiaio_busparareceive_value
Folha de consulta
inout é uma porta bidirecional que pode tanto enviar quanto receber sinais. Apenas um dispositivo aciona o barramento por vez; os outros devem produzir alta impedância (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; // Aciona quando habilitado, caso contrário libera
assign data_in = bus; // Sempre lê o barramento
endmoduleRegras principais:
- Deve ser
wire(nãoreg) - Use
assigncom uma condição ternária — nunca atribua dentro de um blocoalways - Libere com
Zquando não estiver acionando para evitar contenção de barramento
Experimente você mesmo
module bidir_buffer (
// Tarefa 1: Adicione uma porta inout de 8 bits chamada io_bus aqui
input [7:0] send_value,
input send_enable,
output [7:0] receive_value
);
// Tarefa 2: Adicione uma instrução assign que direcione io_bus com send_value quando send_enable for 1, caso contrário Z
// Tarefa 3: Adicione uma instrução assign que leia io_bus para receive_value
endmoduleEsta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Fundamentos
1Introdução
O que é VerilogHardware vs SoftwareNíveis de Abstração de ProjetoSeu Primeiro MóduloComentários4Operadores Parte 1
Operadores AritméticosOperador de MóduloOperadores de ComparaçãoRecapitulação - Matemática SimplesOperadores Bitwise7Atribuição e Portas Lógicas
Atribuição ContínuaAtribuição com OperadoresPrimitivas de Portas IntegradasPortas AND, OR e NOTPortas XOR e XNORRecapitulação - Circuito de Portas Lógicas10Tomada de Decisão
Instrução IfIf - ElseRecapitulação - Comparador SimplesInstrução CaseCasex e CasezRecapitulação - Projeto de ALU2Tipos de Dados
Tipo WireTipo RegInteger e RealVetoresArraysParâmetrosRecapitulação - Declarar Sinais5Operadores Parte 2
Operadores LógicosOperadores de ReduçãoOperadores de DeslocamentoOperador de ConcatenaçãoOperador CondicionalRecapitulação - Desafio de Operadores3Sistemas de Numeração
Representação BináriaNúmeros com Tamanho DefinidoNúmeros sem Tamanho DefinidoNúmeros NegativosValores Especiais X e ZRecapitulação - Formatos de Números6Módulos
Estrutura de MóduloPortas de Entrada e SaídaPortas InoutInstanciação de MóduloMapeamento de Portas por NomeMapeamento de Portas por OrdemRecapitulação - Construa um Módulo