Menu
CoddyTech

Always Bloğu

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

Yordamlı blok, C veya Python gibi yazılım programlama dillerindeki gibi ifadelerin birbiri ardına, sıralı olarak yürütüldüğü bir kod bloğudur. Verilog'da iki yordamlı 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 çalışır. Simülasyon başladıktan sonra sonsuza kadar tekrar eder. Flip-floplar, sayaçlar ve birleşimsel 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), bloğa ne zaman çalışacağını söyler. Bu olmadan (ve içinde #5 gibi bir gecikme bulunmadığında) blok sonsuz döngüye girer ve simülasyonun takılmasına neden olur.

Always Bloğu Örneği: Sayaç

Sayaç oluşturmak için always bloğunu nasıl kullanabileceğimize dair bir örnek aşağıda 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 durmadan, tekrar tekrar çalıştır
@(posedge clk)Saat sinyalinin 0'dan 1'e geçmesini bekle (yükselen kenar)
count <= count + 1count değerinin mevcut değerini al, 1 ekle ve sonucu tekrar ona kaydet

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

Hassasiyet listesi @(posedge clk), sürekli olarak değil, yalnızca saat kenarlarında çalıştırılmasını söyler. Bu olmadan döngü, gecikme olmaksızın sonsuza kadar çalışırdı.

Birden Fazla Sinyal İçeren 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 always bloğunu ekle.

Nasıl çalışır:

  • Her yükselen saat kenarında out1, 0'dan 1'e veya 1'den 0'a geçerek değerini değiştirir
  • out2, out1'i takip eder (out1 ile aynı değere sahip olur)

Yapman gerekenler:

  1. Bir always @(posedge clk) bloğu ekle
  2. Bloğun içinde out1'in değerini değiştirmesini sağla (out1 = ~out1 kullan)
  3. out2'yi out1'e eşitle

Kendin dene

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

  initial begin
    out1 = 0;
    out2 = 0;
  end

  // TODO: posedge clk ile bir always bloğu ekle
  // out1 her saat döngüsünde 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.

Temel Bilgiler bölümündeki tüm dersler

Kendi başına pratik yap: Online Verilog derleyicisi