Menu
Coddy logo textTech

Inout Ports

Coddy'nin Verilog Journey'sinin Temeller bölümünün bir parçası. Ders 32 / 90.

Bir inout portu, hem gönderip hem de alabilen çift yönlü bir porttur ve signal iletebilir. Farklı zamanlarda input veya output olarak çalışabilir. Çoğu port ya input (veri içeri akar) ya da output (veri dışarı akar) şeklindedir. Bir inout portu her ikisini de yapabilir. Duruma bağlı olarak veriyi dışarı sürebilir veya içeri veri alabilir.

Bunu tek yönlü bir yol yerine çift yönlü bir cadde gibi düşün.

Inout portları şu amaçlarla kullanılır:

  • Paylaşımlı bus: aynı kablolara bağlı birden çok cihaz
  • Bellek veri bus: veri read veya yazılabilir
  • bidirectional iletişim: I2C, SPI vb.

Bir seferde yalnızca bir cihaz bus'ı sürer. Diğer cihazlar yüksek empedans durumunda (Z) olmalıdır.

Inout Portu Bildirme

inout [7:0] data_bus;   // 8-bit çift yönlü bus
inout ready;             // Tek bitlik çift yönlü sinyal

inout Nasıl Çalışır

Bir inout port, input veya output olarak görev yapıp yapmadığına karar vermek için bir kontrol signal gerektirir:

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
  • When enable = 1, module drives bus'ı (output modu)
  • When enable = 0, module bus'ı release eder (input modu, high-Z)

Inout İçin Önemli Kurallar

Z kullanarak bus'ı serbest bırakın
KuralNeden
wire olarak bildirilmelidirreg olamaz
Cannot aynı anda okunup yazılamazÇakışma (X) oluşturur
Diğer cihazların bus'ı sürmesini sağlar
Aynı anda yalnızca bir sürücübus çekişmesini önler

Inout ve Input ve Output Karşılaştırması

Port TürüYönDrive edebilirOkuyabilir
inputTek yönlü (yalnızca içeri)HayırEvet
outputTek yönlü (yalnızca dışarı)EvetHayır
inoutİki yönlü (her ikisi)Evet (enabled olduğunda)Evet (always)

Yaygın Hata

// WRONG: always bloğu içinde inout'a atama yapılamaz
always @(posedge clk) begin
  data_bus <= something;   // Hata! Koşul ile assign kullanın
end

// CORRECT: enable koşulu ile assign kullanın
assign data_bus = (enable) ? something : 8'bZ;
challenge icon

Görev

Eksik inout portunu ve bu bidirectional buffer'ın çalışmasını sağlamak için assign ifadelerini Add.

Yapılacaklar:

  1. 8 bitlik, io_bus olarak called bir inout port Add
  2. send_enable 1 olduğunda io_bus'u send_value ile drives, otherwise Z ile süren bir assign statement Add
  3. io_bus'u receive_value içine reads bir assign statement Add

Kendin dene

module bidir_buffer (
  // Görev 1: Buraya io_bus adında 8-bit bir inout port ekle
  
  
  input [7:0] send_value,
  input send_enable,
  output [7:0] receive_value
);

  // Görev 2: send_enable 1 olduğunda io_bus'u send_value ile süren, aksi halde Z olan bir assign ifadesi ekle
  
  
  // Görev 3: io_bus'u receive_value'ya okuyan bir assign ifadesi ekle
  

endmodule
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Temeller bölümündeki tüm dersler

Kendi başına pratik yap: Online Verilog derleyicisi