Menu
Coddy logo textTech

Koşullu Operatör

Coddy'nin Verilog Journey'sinin Temeller bölümünün bir parçası — ders 28 / 90.

Koşullu operatör ? : bir koşula bağlı olarak iki değer arasından seçim yapar. Aynı zamanda üçlü (ternary) operatör olarak da adlandırılır. Koşullu operatör bir koşulu değerlendirir ve iki değerden birini döndürür:

condition ? value_if_true : value_if_false

Eğer koşul doğruysa (1), ilk değer döndürülür. Eğer yanlışsa (0), ikinci değer döndürülür.

Koşullu Operatör Neden Kullanılır?

Basit if-else mantığını tek bir satırda yazmanın kompakt bir yoludur. Yaygın kullanım alanları şunlardır:

  • İki sinyal arasında seçim yapma
  • Çoklayıcılar (multiplexer) oluşturma
  • Varsayılan değerleri ayarlama
  • Satır içi (inline) koşullu atamalar

Sözdizimi ve Örnekler

Temel örnek:

result = (a > b) ? a : b;   // result, a ve b'den büyük olanı alır

Değerler arasında seçim yapın:

data_out = (enable) ? data_in : 8'b00000000;   // Etkinse veriyi çıkışa ver, aksi takdirde 0

Sinyali koşullu olarak ters çevir:

out = (invert) ? ~in : in;   // Eğer invert 1 ise, çıkış ters çevrilir; aksi takdirde değişmez

Kod Örneği

module conditional_demo;
  reg [3:0] a, b, max;
  reg enable;
  reg [3:0] data_in, data_out;
  
  initial begin
    a = 4'd7;
    b = 4'd9;
    enable = 1;
    data_in = 4'b1010;
    
    max = (a > b) ? a : b;           // 9
    data_out = (enable) ? data_in : 4'b0000;   // 1010
    
    $display("max = %d", max);
    $display("data_out = %b", data_out);
    $finish;
  end
endmodule

Çıktı:

max = 9
data_out = 1010

İç İçe Koşullu Operatörler

Birden fazla seçim için koşullu operatörleri iç içe yerleştirebilirsiniz:

result = (a > b) ? a : (b > c) ? b : c;   // Üç değerden en büyüğünü bul

İç içe geçmiş koşulları netleştirmek için parantez kullanın.

Önemli Notlar

  • Koşul tek bir bit (veya 0 ya da 1 olarak değerlendirilen bir ifade) olmalıdır
  • Her iki değer seçeneği de aynı bit genişliğine sahip olmalıdır
  • Operatör, sürekli atamalarda (assign) ve prosedürel bloklarda (always, initial) kullanılabilir
challenge icon

Görev

Her görev için doğru koşullu ifadeleri yazın.

Yapılması gerekenler:

  1. max değerini x ve y arasından büyük olanına ayarlayın
  2. abs değerini val değişkeninin mutlak değerine ayarlayın (negatifse pozitif yapın)
  3. Eğer enable 1 ise output_data değerini data olarak, aksi takdirde 8'b0 olarak ayarlayın

Kopya kağıdı

Koşullu (üçlü) operatör ? : bir koşula bağlı olarak iki değer arasından seçim yapar:

condition ? value_if_true : value_if_false

Örnekler:

max      = (a > b) ? a : b;                  // a ve b'den büyük olanı
data_out = (enable) ? data_in : 8'b0;        // etkinse veriyi çıkışa ver, değilse 0
out      = (invert) ? ~in : in;              // sinyali koşullu olarak tersle

İç içe geçmiş koşullu operatörler:

result = (a > b) ? a : (b > c) ? b : c;     // üç değerden en büyüğü

Notlar:

  • Koşul 0 veya 1 olarak değerlendirilmelidir
  • Her iki değer seçeneği de aynı bit genişliğine sahip olmalıdır
  • assign, always ve initial bloklarında kullanılabilir

Kendin dene

module conditional_challenge;
  reg [3:0] x, y;
  reg [3:0] max;
  reg signed [3:0] val;
  reg [3:0] abs;
  reg enable;
  reg [7:0] data;
  reg [7:0] output_data;
  
  initial begin
    x = 4'd12;
    y = 4'd8;
    val = -4'sd5;
    enable = 1;
    data = 8'b10101010;
    
    max = ______;          // x ve y'den büyük olanı
    abs = ______;          // val'ın mutlak değeri
    output_data = ______;  // enable ise data, değilse 0
    
    $display("max = %d", max);
    $display("abs = %d", abs);
    $display("output_data = %b", output_data);
    $finish;
  end
endmodule
quiz iconKendini test et

Bu 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