Portas Inout
Parte da seção Fundamentos do Journey de Verilog da Coddy — lição 32 de 90.
Uma port inout é uma port bidirectional que pode tanto enviar quanto receber sinais. Ela pode atuar como um input ou um output em momentos diferentes. A maioria das ports é input (dados fluem para dentro) ou output (dados fluem para fora). Uma port inout pode fazer ambos — ela pode acionar 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.
Inout ports são usados para:
- Barramentos compartilhados — múltiplos dispositivos conectados aos mesmos fios
- Barramentos de dados de memória — dados podem ser lidos ou escritos
- 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 um bitComo o Inout Funciona
Uma porta inout requer um sinal de controle para decidir se ela está atuando como 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; // Drive bus when enabled, else Z
assign data_in = bus; // Always read the bus
endmodule- Quando
enable = 1, o módulo aciona (drives) o barramento (modo de saída) - Quando
enable = 0, o módulo libera (release) o barramento (modo de entrada, alta impedância/high-Z)
Regras Importantes para Inout
| Regra | Por quê |
|---|---|
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 acionem |
| Apenas um driver por vez | Evita a contenção do barramento |
Inout vs Input vs Output
| Tipo de Port | Direção | Can Drive | Pode Read |
|---|---|---|---|
input | Unidirecional (apenas entrada) | Não | Sim |
output | Unidirecional (apenas saída) | Sim | Não |
inout | Bidirecional (ambos) | Sim (when enabled) | Sim (always) |
Erro Comum
// WRONG: 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
// CORRECT: Use assign com condição de enable
assign data_bus = (enable) ? something : 8'bZ;Desafio
Adicione a porta inout ausente 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 acioneio_buscomsend_valuequandosend_enablefor 1, caso contrárioZ - Adicione uma instrução
assignque leiaio_buspara dentro dereceive_value
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 declaração assign que dirige io_bus com send_value quando send_enable é 1, caso contrário Z
// Tarefa 3: Adicione uma declaração assign que lê io_bus em 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