Menu
CoddyTech

Atama Gecikmeleri

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

Önceki derslerde genel gecikmeleri (#10 a = b;) ve kapı gecikmelerini (and #5 (out, a, b);) ele aldık. Şimdi, bir atama ifadesinin parçası olarak prosedürel bir bloğun (initial veya always gibi) içinde gerçekleşen gecikmeler olan atama gecikmelerini ele alacağız.

Bir atama gecikmesi, belirtilen süre boyunca bekler ve ardından atamayı gerçekleştirir. Gecikme, # sembolünden sonra ve atamadan önce yer alır.

Sözdizimi:

variable = #delay expression;

Genel bir gecikmeden #10 a = b; (önce gecikme, sonra atama) farklı olarak, bir atama gecikmesi olan a = #10 b;, o anda b değerini alır, 10 zaman birimi bekler ve ardından bu değeri a değişkenine atar.

Atama Gecikmesi ve Genel Gecikme

 Genel GecikmeAtama Gecikmesi
Sözdizimi#10 a = b;a = #10 b;
Değer ne zaman okunur?Atama anında (gecikmeden sonra)Hemen (gecikmeden önce)
Hangi değer atanır?O andaki b değeriZaman 0'daki (veya okuma zamanındaki) b değeri
Değer ne zaman atanır?Gecikmeden sonraGecikmeden sonra

Örnek: Fark

initial begin
  b = 1;
  #5 b = 0;
  
  // Genel gecikme
  #10 a1 = b;     // 10 bekler, ardından b değerini okur (b=0) → a1=0
  
  // Atama gecikmesi
  a2 = #10 b;     // b değerini şimdi okur (b=0), 10 bekler, ardından atar → a2=0
end

Burada ikisi de aynı sonucu verir. Fark, gecikme sırasında b değiştiğinde ortaya çıkar.

Temel Farkı Gösteren Örnek

To show b changing during the delay, we need two separate initial blocks that run in parallel:

initial begin
  b = 1;
  a1 = #10 b;     // 0 zamanında b=1 değerini okur, 10 zamanında a1=1 değerini atar
end

initial begin
  #5 b = 0;       // 5 zamanında b değerini 0 olarak değiştirir (gecikme sırasında)
end
  • 0. zamanda: a1, b = 1 değerini okur
  • 5. zamanda: b, 0 değerine değişir (a1 hâlâ beklerken)
  • 10. zamanda: a1'e 1 atanır (0. zamanda okunan değer), 0 değil

Ayrı bir blokta genel bir gecikme #10 a2 = b; kullanıldığında, b 10. zamanda okunurdu (değeri 0).

Önemli Kurallar

KuralAçıklama
=, # işaretinden önce gelira = #10 b; olmalı, a #10 = b; değil
Değer hemen okunurSağ taraf hemen değerlendirilir
Atama gecikmeden sonra gerçekleşirSol taraf değeri daha sonra alır
Yalnızca prosedürel bloklarda kullanılırinitial veya always içinde kullanılır
challenge icon

Görev

Yapılacaklar:

Eksik atama gecikmesini ekleyerek a'nın 15 zaman birimi sonra b'nin değerini almasını, ancak b'yi hemen okumasını sağla.

Kendin dene

module assignment_challenge;
  reg a, b;
  
  // Gecikme sırasında b'yi değiştirmek için ayrı blok
  initial begin
    b = 1;
    // TODO: Atama gecikmesi ekle
    // a, 15 zaman birimi sonra b'nin değerini almalı
    // b'yi şimdi oku, gecikmeden sonra ata

  end
  
  initial begin
    #5 b = 0;      // Gecikme sırasında b'yi değiştirir
    #20 $display("Time %0t: a = %b", $time, a);
    $finish;
  end
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