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, ifadelerin tıpkı C veya Python gibi yazılım programlama dillerinde olduğu gibi birbiri ardına, sırayla yürütüldüğü bir kod bloğudur. Verilog'un iki prosedürel bloğu vardır: initial (bir kez çalışır) ve always (sürekli çalışır). always bloğu ile başlayalım.

always bloğu sürekli çalışır — simülasyon başladığında sonsuza kadar tekrarlanır. Flip-floplar, 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
  // Sürekli çalışan kod
end

@(sensitivity_list) bloğa ne zaman yürütüleceğini söyler. O olmadan, blok sonsuz bir döngüye girer ve simülasyonu dondurur.

Always Bloğu Örneği: Sayaç

İşte 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 tekrar tekrar çalıştır
@(posedge clk)Saatin 0'dan 1'e çıkmasını bekleyin (yükselen kenar)
count = count + 1count değişkeninin mevcut değerini al, 1 ekle ve geri kaydet

Blok, saatin her yükselen kenarında çalışır. Her seferinde, count 1 artar.

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

Birden Fazla 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 0'dan 1'e veya 1'den 0'a geçiş yapar (toggle/tersine döner)
  • out2, out1 değerini takip eder (out1 ile aynı değer)

Ne yapmalı:

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

Kopya kağıdı

always bloğu sürekli çalışır ve flip-floplar ile sayaçlar gibi donanımları tanımlamak için kullanılır.

always @(sensitivity_list) begin
  // Sürekli çalışan kod
end

@(posedge clk) yükselen saat kenarında tetiklenir; @(a or b) listelenen herhangi bir sinyal değiştiğinde tetiklenir.

// Sayaç: her yükselen saat kenarında artar
always @(posedge clk) count = count + 1;

// Kombinasyonel: a veya b değiştiğinde çalışır
always @(a or b) begin
  out = a & b;
end

Not: always blokları tarafından sürülen çıkışlar reg olarak bildirilmelidir.

Kendin dene

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

  initial begin
    out1 = 0;
    out2 = 0;
  end

  // YAPILACAK: posedge clk ile always bloğu ekle
  // out1 her saat darbesinde durum değiştirir
  // 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