Case Statement
Coddy'nin Verilog Journey'sinin Temeller bölümünün bir parçası. Ders 55 / 90.
case statement, tek bir expression değerine göre birçok farklı eylem arasından seçim yapmanı sağlar. Aynı değişkeni birçok farklı değerle karşılaştırırken birden fazla if-else statement kullanmaya göre daha temiz bir alternatiftir.
case statement, bir expression değerini değerler listesiyle karşılaştırır ve eşleşen bloğu çalıştırır. Çok yönlü bir dallanma gibidir.
Sözdizimi:
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcaseBir kombinasyonel <strong>case</strong> <strong>statement</strong> içinde <strong>default</strong> değerini always eklemeniz önemle tavsiye edilir. default olmadan, sel beklenmeyen bir değer alırsa (X veya Z gibi), out atanmaz ve önceki değerini kilitler. Bu, saf kombinasyonel mantık yerine istenmeyen bir bellek (latch) oluşturur.
Basit Örnek
case (sel)
2'b00: out = a;
2'b01: out = b;
2'b10: out = c;
default: out = 0;
endcasesel 00 ise, out a değerini alır. sel 01 ise, out b değerini alır. sel 10 ise, out c değerini alır.
Aksi takdirde, out 0 değerini alır.
Case Başına Birden Fazla İfade
Birden fazla ifade için begin ve end kullanın:
case (state)
2'b00: begin
out = a;
flag = 1;
end
2'b01: begin
out = b;
flag = 0;
end
default: out = 0;
endcaseÖnemli Kurallar
| Kural | Açıklama |
|---|---|
| case değerleri benzersiz olmalıdır | Yinelenen değerlerde yalnızca ilk eşleşen dal yürütülür |
| Değerler bit genişliğiyle eşleşmelidir | 2'b01, 1'b1 değil |
default isteğe bağlıdır ancak önerilir | Eşlenmemiş değerleri yakalar |
default olmadan eşlenmemiş değerler latch'lere neden olur | Kombinasyonel mantıkta |
Case ve If-Else
| Case | If-Else | |
|---|---|---|
| En uygun olduğu yer | Tek değişken, birçok değer | Karmaşık koşullar |
| Okunabilirlik | Çok açık | Dağınık hâle gelebilir |
| Örnek | Çoklayıcı, kod çözücü | Karşılaştırıcı, aralık denetimleri |
Görev
case İfadesini Tamamla
Yapılacaklar:
Bu çoklayıcının çalışmasını sağlamak için eksik case ifadesini ekle.
Nasıl çalışır:
- When
select = 2'b00,result = in0 - When
select = 2'b01,result = in1 - When
select = 2'b10,result = in2 - When
select = 2'b11,result = in3
Kendin dene
module mux4 (
input [1:0] select,
input in0, in1, in2, in3,
output reg result
);
always @(*) begin
// TODO: case ifadesi ekle
// select=00 -> result = in0
// select=01 -> result = in1
// select=10 -> result = in2
// select=11 -> result = in3
// default -> result = 0
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