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;
endmoduleBu Kod Nasıl Çalışır
| Bölüm | Anlamı |
|---|---|
always | Bu kodu sürekli, sonsuza kadar çalıştır |
@(posedge clk) | Saatin 0'dan 1'e geçmesini (rising edge) bekle |
count <= count + 1 | count 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;
endBu, when a veya b changes olduğunda çalışır.
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 (out1ile aynı değere sahip olur)
Yapılacaklar:
- Bir
always @(posedge clk)block'u Add et - İçinde,
out1'i toggle yap (out1 = ~out1kullan) out2'yiout1'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
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
4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine LogicKendi başına pratik yap: Online Verilog derleyicisi