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;
endmoduleBu Kod Nasıl Çalışır
| Bölüm | Anlamı |
|---|---|
always | Bu kodu sonsuza kadar tekrar tekrar çalıştır |
@(posedge clk) | Saatin 0'dan 1'e çıkmasını bekleyin (yükselen kenar) |
count = count + 1 | count 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;
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),
out10'dan 1'e veya 1'den 0'a geçiş yapar (toggle/tersine döner) out2,out1değerini takip eder (out1ile aynı değer)
Ne yapmalı:
- Bir
always @(posedge clk)bloğu ekleyin - İçerisinde,
out1değerini tersine çevirin (out1 = ~out1kullanın) out2değeriniout1değ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;
endNot: 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
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ığı