Menu
Coddy logo textTech

Non Blocking Assignment

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

Önceki derste, adım adım yürütülen blocking assignment (=) konusunu ele aldık. Şimdi ise tüm atamaları aynı anda, paralel olarak yürüten non-blocking assignment (<=) konusunu ele alacağız.

non-blocking atama <= operatörünü kullanır. Bir sonraki ifadenin yürütülmesini engellemediği için "non-blocking" olarak adlandırılır. Bir bloktaki tüm non-blocking atamalar aynı anda yürütülür.

Sözdizimi:

variable <= expression;

Non-Blocking Assignment Ne Zaman Kullanılır

Non-blocking assignment (<=), ardışıl mantık için kullanılır: saat kullanan ve belleğe sahip devreler. Çıkışlar yalnızca bir saat kenarında (genellikle yükselen kenarda) değişir.

Sıralı mantık örnekleri:

  • Flip-flop'lar
  • Yazmaçlar
  • Sayaçlar
  • Durum makineleri
  • Kaydırma yazmaçları

Verilog örneği:

initial begin
  a <= 5;      // Zamanlandı, ancak henüz yürütülmedi
  b <= a + 2;  // Zamanlandı, a'nın ESKİ değerini kullanır
  c <= b * 3;  // Zamanlandı, b'nin ESKİ değerini kullanır
end

All üç atama aynı anda old values kullanılarak gerçekleşir. Zaman adımının end noktasında, All güncellemeler birlikte gerçekleşir.

Always Bloklarında Non-Blocking (Sıralı Mantık)

Non-blocking, sıralı mantık için kullanılır: saat kullanan ve belleğe sahip devreler (flip-flop'lar, yazmaçlar, sayaçlar).

always @(posedge clk) begin
  q <= d;           // q, saat kenarında d'yi alır
  count <= count + 1; // count, saat kenarında artar
end

Her iki atama da aynı anda, clock edge'inden önceki values kullanılarak gerçekleşir.

Özet

KuralAçıklama
Sıralı mantık için <= kullanınalways @(posedge clk)
Kombinasyonel mantık için = kullanınalways @(*)
Non-blocking paralel olarak yürütülürTüm atamalar aynı anda gerçekleşir
Values zaman adımının end noktasında güncellenirHemen değil
challenge icon

Görev

Engellemeyen Atamayı Tamamla

Bu 2 bitlik kaydırma yazmacının çalışmasını sağlamak için eksik engellemeyen atamaları ekle.

Nasıl çalışır:

  • Her clock edge'de q1, d değerini gets
  • q2, q1'in old değerini gets

Yapılacaklar:

  1. d değerini q1'e Assign et (non-blocking)
  2. q1 değerini q2'ye Assign et (non-blocking)

Kendin dene

module shift_register (
  input clk,
  input reset,
  input d,
  output reg q1,
  output reg q2
);
  
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      q1 <= 0;
      q2 <= 0;
    end else begin
      // TODO: Kaydırma mantığını ekle
      // Adım 1: d'yi q1'e ata (non-blocking)
      // Adım 2: q1'i q2'ye ata (non-blocking)
    end
  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.

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

Kendi başına pratik yap: Online Verilog derleyicisi