Menu
Coddy logo textTech

Always Block

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

Yordamsal blok, tıpkı C veya Python gibi yazılım programlama dillerinde olduğu gibi, ifadelerin ardışık olarak birbiri ardına yürütüldüğü bir kod bloğudur. Verilog'da iki yordamsal blok vardır: initial (bir kez çalışır) ve always (sürekli çalışır). always bloğuyla başlayalım.

always bloğu sürekli olarak çalışır. Simülasyon başladığında sonsuza kadar tekrarlanır. Flip-flop'lar, sayaçlar ve kombinasyonel mantık gibi çalışmaya devam etmesi 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), block'un when yürütüleceğini belirtir. Bu ifade olmadan (ve içinde #5 gibi bir gecikme bulunmadığında), block sonsuz döngüye girer ve simülasyonun kilitlenmesine neden olur.

always Bloğu Örneği: Counter

Burada bir sayaç oluşturmak için always bloğunu nasıl kullanabileceğimize dair bir örnek verilmiştir.

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 sürekli, sonsuza kadar çalıştır
@(posedge clk)Saatin 0'dan 1'e geçmesini (rising edge) bekle
count <= count + 1count değerinin mevcut değerini al, 1 ekle ve tekrar kaydet

block, clock'un her rising edge'inde çalışır. Her seferinde count 1 artar.

@(posedge clk) sensitivity list, ona sürekli değil, yalnızca clock edge'lerinde çalışmasını söyler. Bu olmadan döngü, gecikme olmaksızın sonsuza kadar çalışırdı.

Birden Çok Sinyalli always bloğu

Belirli sinyalleri listeleyebilirsin:

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

Bu, when a veya b changes olduğunda çalışır.

challenge icon

Görev

Add eksik always block'unu ekleyerek bu module'ü çalışır hâle getir.

Nasıl çalışır:

  • Her rising clock edge'de out1, 0'dan 1'e veya 1'den 0'a geçerek toggle olur (değerini tersine çevirir)
  • out2, out1'i takip eder (out1 ile aynı değere sahip olur)

Yapılacaklar:

  1. Bir always @(posedge clk) block'u Add et
  2. İçinde, out1'i toggle yap (out1 = ~out1 kullan)
  3. out2'yi out1'e eşit yap

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

Kendi başına pratik yap: Online Verilog derleyicisi