Menu
Coddy logo textTech

Inout Ports

Parte da seção Fundamentos do Journey de Verilog da Coddy. Lição 32 de 90.

Uma porta inout é uma porta bidirecional que pode enviar e receber sinais. Ela pode atuar como uma entrada ou uma saída em momentos diferentes. A maioria das portas é input (os dados fluem para dentro) ou output (os dados fluem para fora). Uma porta inout pode fazer as duas coisas. Ela pode enviar dados para fora ou receber dados, dependendo da situação.

Pense nisso como uma via de mão dupla em vez de uma via de mão única.

Os port inout são usados para:

  • bus compartilhados: vários dispositivos conectados aos mesmos fios
  • bus de dados de memória: os dados podem ser read ou gravados
  • bidirectional communication: I2C, SPI etc.

Apenas um dispositivo drives o bus 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 bit

Como o Inout funciona

Uma porta inout requer um sinal de controle para decidir se está atuando como input ou 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
  • Quando enable = 1, o module drives o bus (modo output)
  • Quando enable = 0, o module release o bus (modo input, high-Z)

Regras importantes para Inout

RegraPor quê
Deve ser declarado como wireCannot ser reg
Cannot ser read e escrito ao mesmo tempoCriaria conflito (X)
Use Z para liberar o busPermite que outros dispositivos o controlem
Apenas um controlador por vezEvita a contenção do bus

Inout vs Input vs Output

Tipo de portDireçãoPode DrivePode Read
inputUma via (somente entrada)NãoSim
outputUma via (somente saída)SimNão
inoutDuas vias (ambas)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 esse 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 em 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 instrução assign que dirige io_bus com send_value quando send_enable for 1, caso contrário Z
  
  
  // Tarefa 3: Adicione uma instruçã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

Pratique por conta própria: Compilador de Verilog online