Menu
Coddy logo textTech

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 bit

Como 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

RegraPor quê
Deve ser declarado como wireNão pode ser reg
Não pode ser lido e escrito ao mesmo tempoCriaria um conflito (X)
Use Z para liberar o barramentoPermite que outros dispositivos acionem
Apenas um driver por vezEvita a contenção do barramento

Inout vs Input vs Output

Tipo de PortDireçãoCan DrivePode Read
inputUnidirecional (apenas entrada)NãoSim
outputUnidirecional (apenas saída)SimNão
inoutBidirecional (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;
challenge icon

Desafio

Adicione a porta inout ausente e as instruções assign para fazer este buffer bidirecional funcionar.

O que fazer:

  1. Adicione uma porta inout de 8 bits chamada io_bus
  2. Adicione uma instrução assign que acione io_bus com send_value quando send_enable for 1, caso contrário Z
  3. Adicione uma instrução assign que leia io_bus para dentro de receive_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
  

endmodule
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Fundamentos