Menu
Coddy logo textTech

Always Bloğu

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

Bir prosedürel blok (procedural block), ifadelerin yazılım programlama dillerinde (C veya Python gibi) olduğu gibi sırayla arkası arkasına çalıştırıldığı bir kod bloğudur. Verilog iki prosedürel bloğa sahiptir: initial (bir kez çalışır) ve always (sürekli çalışır). always bloğu ile başlayalım.

always bloğu sürekli olarak çalışır — simülasyon başladığında sonsuza kadar tekrarlar. Flip-flop'lar, sayaclar ve kombinasyonel mantık gibi sürekli çalışması gereken donanımları tanımlamak için kullanılır.

Temel sözdizimi:

always @(sensitivity_list) begin
  // Tekrar tekrar çalışan kod
end

@(sensitivity_list), bloğa ne zaman çalışacağını söyler. O olmadan (ve içinde #5 gibi bir gecikme yoksa), blok sonsuz döngüye girer ve simülasyonu kilitler.

Always Block Example: Counter

Bir Sayaç oluşturmak için always bloğunu nasıl kullanabileceğimize dair bir örnek:

module counter (
  input clk,
  output reg [3:0] count
);
  always @(posedge clk) count <= count + 1;
endmodule

Bu Kod Nasıl Çalışır?

BölümAnlamı
alwaysBu kodu sonsuza kadar sürekli çalıştır
@(posedge clk)Saat sinyalinin (clock) 0'dan 1'e çıkmasını (yükselen kenar) bekle
count <= count + 1count değerinin mevcut halini al, 1 ekle ve tekrar içine kaydet

Blok, saat sinyalinin her yükselen kenarında (rising edge) çalışır. Her seferinde count 1 artar.

Duyarlılık listesi @(posedge clk) ona sürekli olarak değil, yalnızca saat kenarlarında çalışmasını söyler. Bu olmadan döngü, hiçbir gecikme olmadan sonsuza kadar çalışır.

Çoklu Sinyalli Always Bloğu

Belirli sinyalleri listeleyebilirsiniz:

always @(a or b) begin
  out = a & b;
end

Bu, a veya b değiştiğinde çalışır.

challenge icon

Görev

Bu modülün çalışması için eksik olan always bloğunu ekleyin.

Nasıl çalışır:

  • Her yükselen saat kenarında (rising clock edge), out1 değeri 0'dan 1'e veya 1'den 0'a geçer (toggles)
  • out2, out1 değerini takip eder (out1 ile aynı değer)

Yapılacaklar:

  1. Bir always @(posedge clk) bloğu ekleyin
  2. İçinde, out1 değerini tersine çevirin (out1 = ~out1 kullanın)
  3. out2 değerini out1 değerine eşitleyin

Kendin dene

module toggler (
  input clk,
  output reg out1,
  output reg out2
);

  initial begin
    out1 = 0;
    out2 = 0;
  end

  // TODO: posedge clk ile always bloğu ekle
  // out1 her clock'ta toggle olur
  // out2 out1'i takip eder

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