Menu
Coddy logo textTech

Çift Yönlü Portlar

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

inout portu, sinyalleri hem gönderebilen hem de alabilen çift yönlü bir porttur. Farklı zamanlarda giriş veya çıkış olarak görev yapabilir. Portların çoğu ya input (veri içeri akar) ya da output (veri dışarı akar) olur. inout portu her ikisini de yapabilir. Duruma bağlı olarak veriyi dışarı sürebilir veya içeri alabilir.

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

Giriş/çıkış portları şunlar için kullanılır:

  • Paylaşılan veri yolları: aynı kablolara bağlı birden fazla cihaz
  • Bellek veri yolları: veriler okunabilir veya yazılabilir
  • Çift yönlü 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.

Bir Inout Portu Tanımlama

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 portu, giriş veya çıkış olarak çalışıp çalışmadığına karar vermek için bir kontrol sinyali 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
  • enable = 1 olduğunda modül veri yolunu sürer (çıkış modu)
  • enable = 0 olduğunda modül veri yolunu serbest bırakır (giriş modu, high-Z)

Inout için Önemli Kurallar

Z kullanarak veri yolunu serbest bırakın
KuralNeden
wire olarak bildirilmelidirreg olamaz
Aynı anda okunamaz ve yazılamazÇakışmaya (X) neden olur
Diğer cihazların sürmesini sağlar
Aynı anda yalnızca bir sürücüVeri yolu çekişmesini önler

Inout ve Input ve Output

Port TürüYönSürebilirOkuyabilir
inputTek yönlü (yalnızca giriş)HayırEvet
outputTek yönlü (yalnızca çıkış)EvetHayır
inoutÇift yönlü (her ikisi)Evet (etkinleştirildiğinde)Evet (her zaman)

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

Bu çift yönlü arabelleğin çalışmasını sağlamak için eksik inout portunu ve assign ifadelerini ekleyin.

Yapılacaklar:

  1. io_bus adlı 8 bitlik bir inout portu ekleyin
  2. send_enable 1 olduğunda io_bus'u send_value ile süren, aksi takdirde Z kullanan bir assign ifadesi ekleyin
  3. io_bus değerini receive_value içine okuyan bir assign ifadesi ekleyin

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.

Temel Bilgiler bölümündeki tüm dersler

Kendi başına pratik yap: Online Verilog derleyicisi