Menu
Coddy logo textTech

Engelleyici Olmayan Atama

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

Önceki derste, adım adım çalışan blocking (engelleyen) atamayı (=) ele almıştık. Şimdi ise hepsi bir arada — paralel olarak çalışan non-blocking (engellemeyen) atamayı (<=) işleyeceğiz.

Non-blocking atama <= operatörünü kullanır. Sonraki ifadenin yürütülmesini engellemediği (block) için buna "non-blocking" denir. Bir bloktaki tüm non-blocking atamalar aynı anda yürütülür.

Sözdizimi:

variable <= expression;

Ne Zaman Non-Blocking Assignment Kullanılır?

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

Ardışıl mantık örnekleri:

  • Flip-flop'lar
  • Yazmaçlar (Registers)
  • Sayaçlar
  • Durum makineleri
  • Kaydırmalı kaydediciler

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

Her üç atama da eski değerler kullanılarak aynı anda gerçekleşir. Zaman adımının sonunda tüm güncellemeler birlikte yapılır.

Always Bloklarında Non-Blocking (Ardışıl Mantık)

Non-blocking, ardışıl mantık için kullanılır — bir saat (clock) kullanan ve belleğe sahip olan devreler (flip-flop'lar, yazmaçlar, sayıcı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 clock edge öncesindeki values kullanılarak aynı anda gerçekleşir.

Özet

KuralAçıklama
Ardışıl mantık için <= kullanınalways @(posedge clk)
Kombinezonsal mantık için = kullanınalways @(*)
Non-blocking paralel olarak yürütülürTüm atamalar aynı anda gerçekleşir
Değerler zaman adımının sonunda güncellenirHemen değil
challenge icon

Görev

Non-Blocking Assignment İşlemini Tamamlayın

Bu 2-bit shift register yapısının çalışması için eksik non-blocking atamaları ekleyin.

Nasıl çalışır:

  • Her clock edge tetiklenmesinde, q1 değeri d değerini alır
  • q2, q1 değerinin old halini alır

Yapılacaklar:

  1. d değerini q1 üzerine atayın (non-blocking)
  2. q1 değerini q2 üzerine atayın (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