Non Blocking Assignment
Coddy'nin Verilog Journey'sinin Temeller bölümünün bir parçası. Ders 50 / 90.
Önceki derste, adım adım yürütülen blocking assignment (=) konusunu ele aldık. Şimdi ise tüm atamaları aynı anda, paralel olarak yürüten non-blocking assignment (<=) konusunu ele alacağız.
non-blocking atama <= operatörünü kullanır. Bir sonraki ifadenin yürütülmesini engellemediği için "non-blocking" olarak adlandırılır. Bir bloktaki tüm non-blocking atamalar aynı anda yürütülür.
Sözdizimi:
variable <= expression;Non-Blocking Assignment Ne Zaman Kullanılır
Non-blocking assignment (<=), ardışıl mantık için kullanılır: saat kullanan ve belleğe sahip devreler. Çıkışlar yalnızca bir saat kenarında (genellikle yükselen kenarda) değişir.
Sıralı mantık örnekleri:
- Flip-flop'lar
- Yazmaçlar
- Sayaçlar
- Durum makineleri
- Kaydırma yazmaçları
Verilog örneği:
initial begin
a <= 5; // Zamanlandı, ancak henüz yürütülmedi
b <= a + 2; // Zamanlandı, a'nın ESKİ değerini kullanır
c <= b * 3; // Zamanlandı, b'nin ESKİ değerini kullanır
endAll üç atama aynı anda old values kullanılarak gerçekleşir. Zaman adımının end noktasında, All güncellemeler birlikte gerçekleşir.
Always Bloklarında Non-Blocking (Sıralı Mantık)
Non-blocking, sıralı mantık için kullanılır: saat kullanan ve belleğe sahip devreler (flip-flop'lar, yazmaçlar, sayaçlar).
always @(posedge clk) begin
q <= d; // q, saat kenarında d'yi alır
count <= count + 1; // count, saat kenarında artar
endHer iki atama da aynı anda, clock edge'inden önceki values kullanılarak gerçekleşir.
Özet
| Kural | Açıklama |
|---|---|
Sıralı mantık için <= kullanın | always @(posedge clk) |
Kombinasyonel mantık için = kullanın | always @(*) |
| Non-blocking paralel olarak yürütülür | Tüm atamalar aynı anda gerçekleşir |
| Values zaman adımının end noktasında güncellenir | Hemen değil |
Görev
Engellemeyen Atamayı Tamamla
Bu 2 bitlik kaydırma yazmacının çalışmasını sağlamak için eksik engellemeyen atamaları ekle.
Nasıl çalışır:
- Her clock edge'de
q1,ddeğerini gets q2,q1'in old değerini gets
Yapılacaklar:
ddeğeriniq1'e Assign et (non-blocking)q1değeriniq2'ye Assign et (non-blocking)
Kendin dene
module shift_register (
input clk,
input reset,
input d,
output reg q1,
output reg q2
);
always @(posedge clk or posedge reset) begin
if (reset) begin
q1 <= 0;
q2 <= 0;
end else begin
// TODO: Kaydırma mantığını ekle
// Adım 1: d'yi q1'e ata (non-blocking)
// Adım 2: q1'i q2'ye ata (non-blocking)
end
end
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