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;
endmoduleBu Kod Nasıl Çalışır?
| Bölüm | Anlamı |
|---|---|
always | Bu 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 + 1 | count 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;
endBu, a veya b değiştiğinde çalışır.
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),
out1değeri 0'dan 1'e veya 1'den 0'a geçer (toggles) out2,out1değerini takip eder (out1ile aynı değer)
Yapılacaklar:
- Bir
always @(posedge clk)bloğu ekleyin - İçinde,
out1değerini tersine çevirin (out1 = ~out1kullanın) out2değeriniout1değ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
endmoduleBu 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
4Operatörler Bölüm 1
Aritmetik OperatörlerModül OperatörüKarşılaştırma OperatörleriÖzet - Basit MatematikBitsel Operatörler7Atama ve Kapılar
Sürekli AtamaOperatörlerle AtamaYerleşik Kapı PrimitifleriAND OR NOT KapılarıXOR XNOR KapılarıÖzet - Mantık Kapısı Devresi10Karar Yapıları
If İfadesiIf - ElseÖzet - Basit KarşılaştırıcıCase İfadesiCasex ve CasezÖzet - ALU Tasarımı5Operatörler Bölüm 2
Mantıksal Operatörlerİndirgeme OperatörleriKaydırma OperatörleriBirleştirme OperatörüKoşullu OperatörÖzet - Operatör Meydan Okuması11Döngüler
For DöngüsüWhile DöngüsüRepeat DöngüsüSonsuz DöngüDevre Dışı Bırakma İfadesiÖzet - Döngü Kalıpları3Sayı Sistemleri
İkilik GösterimBoyutlandırılmış SayılarBoyutlandırılmamış SayılarNegatif SayılarÖzel Değerler X ve ZÖzet - Sayı Formatları6Modüller
Modül YapısıGiriş ve Çıkış PortlarıInout PortlarıModül Örneklendirmeİsme Göre Port EşlemeSıraya Göre Port EşlemeÖzet - Bir Modül Oluşturun9Prosedürel Bloklar
Always BloğuInitial BloğuDuyarlılık ListesiEngelleyici AtamaEngelleyici Olmayan AtamaÖzet - Always vs Initial15Trafik Işığı Kontrolcüsü
Durumları TanımlamaDurum Makinesi Mantığı