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 entrada ou saída em momentos diferentes. A maioria das portas é de input (os dados entram) ou de output (os dados saem). Uma porta inout pode fazer as duas coisas. Ela pode enviar dados ou receber dados, dependendo da situação.
Pense nisso como uma rua de mão dupla em vez de uma estrada de mão única.
As portas de entrada e saída são usadas para:
- Barramentos compartilhados: vários dispositivos conectados aos mesmos fios
- Barramentos de dados da memória: os dados podem ser lidos ou gravados
- Comunicação bidirecional: I2C, SPI etc.
Apenas um dispositivo conduz o barramento por vez. Os outros dispositivos devem estar no 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 único bitComo o Inout funciona
Uma porta inout precisa de um sinal de controle para decidir se está funcionando 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 controla o barramento (modo de saída) - Quando
enable = 0, o módulo libera o barramento (modo de entrada, alta impedância)
Regras importantes para Inout
| Regra | Por quê |
|---|---|
Deve ser declarado como wire | Não pode ser reg |
| Vários dispositivos não devem controlar o barramento ao mesmo tempo | Drivers conflitantes produzem X |
Use Z para liberar o barramento | Permite que outros dispositivos controlem o barramento |
| Apenas um driver por vez | Evita contenção no barramento |
Inout vs Input vs Output
| Tipo de porta | Direção | Pode controlar | Pode ler |
|---|---|---|---|
input | Mão única (somente entrada) | Não | Sim |
output | Mão única (somente saída) | Sim | Sim (o valor que controla) |
inout | Duas mãos (ambas) | Sim (quando habilitada) | Sim (sempre) |
Erro comum
// ERRADO: Não é possível atribuir um valor a inout dentro de um bloco always
always @(posedge clk) begin
data_bus <= something; // Erro! Use assign com uma condição
end
// CORRETO: Use assign com uma condição de enable
assign data_bus = (enable) ? something : 8'bZ;Desafio
Adicione a porta inout ausente e as instruções assign para fazer esse buffer bidirecional funcionar.
O que fazer:
- Adicione uma porta
inoutde 8 bits chamadaio_bus - Adicione uma instrução
assignque conduzaio_buscomsend_valuequandosend_enablefor 1; caso contrário, useZ - Adicione uma instrução
assignque leiaio_busemreceive_value
Experimente você mesmo
module bidir_buffer (
// Tarefa 1: Adicione aqui uma porta inout de 8 bits chamada io_bus
input [7:0] send_value,
input send_enable,
output [7:0] receive_value
);
// Tarefa 2: Adicione uma instrução assign que atribui send_value a io_bus quando send_enable for 1; caso contrário, atribui Z
// Tarefa 3: Adicione uma instrução assign que lê 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. SoftwareSeu primeiro móduloComentáriosNíveis de abstração de projeto4Operadores Parte 1
Operadores aritméticosOperador móduloOperadores de comparaçãoRecapitulação - Matemática simplesOperadores bit a bit7Atribuições e Portas
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ões
Declaração IfIf - ElseRevisão - Comparador SimplesDeclaração CaseCasex e CasezRevisão - Projeto de ALU2Tipos de Dados
Tipo WireTipo RegInteiro e RealVetoresArraysParâmetrosRecapitulação - Declarar Sinais5Operadores - Parte 2
Operadores lógicosOperadores de reduçãoOperadores de deslocamentoOperador de concatenaçãoOperador condicionalRevisão - Desafio de operadores3Sistema Numérico
Representação BináriaNúmeros com Tamanho DefinidoNúmeros sem Tamanho DefinidoNúmeros NegativosValores Especiais X e ZRevisão - Formatos Numéricos6Módulos
Estrutura de MódulosPortas de Entrada e SaídaPortas InoutInstanciação de MódulosMapeamento de Portas por NomeMapeamento de Portas por OrdemRecapitulação — Construindo um MóduloPratique por conta própria: Compilador de Verilog online