Menu
Coddy logo textTech

조건 연산자

Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 28번째.

조건 연산자 ? :는 조건에 따라 두 값 중 하나를 선택합니다. 이것은 삼항 연산자라고도 불립니다. 조건 연산자는 조건을 평가하고 두 값 중 하나를 반환합니다:

condition ? value_if_true : value_if_false

조건이 참(1)이면 첫 번째 값이 반환됩니다. 거짓(0)이면 두 번째 값이 반환됩니다.

조건부 연산자를 사용하는 이유

단 한 줄로 간단한 if-else 로직을 작성할 수 있는 간결한 방법입니다. 일반적인 용도는 다음과 같습니다:

  • 두 신호 중 하나 선택
  • 멀티플렉서 생성
  • 기본값 설정
  • 인라인 조건부 할당

구문 및 예제

기본 예제:

result = (a > b) ? a : b;   // result는 a와 b 중 더 큰 값을 가집니다

값 사이에서 선택:

data_out = (enable) ? data_in : 8'b00000000;   // 활성화된 경우 데이터를 출력하고, 그렇지 않으면 0

조건부로 신호 반전:

out = (invert) ? ~in : in;   // invert가 1이면 출력을 반전시키고, 그렇지 않으면 변경하지 않음

코드 예제

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

출력:

max = 9
data_out = 1010

중첩 조건 연산자

여러 선택을 위해 조건 연산자를 중첩할 수 있습니다:

result = (a > b) ? a : (b > c) ? b : c;   // 세 값 중 가장 큰 값을 찾습니다

중첩된 조건을 명확하게 만들기 위해 괄호를 사용하세요.

중요 참고 사항

  • 조건은 단일 비트(또는 0이나 1로 평가되는 표현식)여야 합니다
  • 두 값 옵션은 모두 동일한 비트 폭을 가져야 합니다
  • 연산자는 연속 할당(assign) 및 절차적 블록(always, initial)에서 사용할 수 있습니다
challenge icon

챌린지

각 작업에 대해 올바른 조건 표현식을 작성하세요.

수행할 작업:

  1. maxxy 중 더 큰 값으로 설정하세요.
  2. absval의 절댓값으로 설정하세요 (음수이면 양수로 만듭니다).
  3. enable이 1이면 output_datadata 로 설정하고, 그렇지 않으면 8'b0으로 설정하세요.

치트 시트

조건부 (삼항) 연산자 ? :는 조건에 따라 두 값 중 하나를 선택합니다:

condition ? value_if_true : value_if_false

예제:

max      = (a > b) ? a : b;                  // a와 b 중 더 큰 값
data_out = (enable) ? data_in : 8'b0;        // 활성화된 경우 데이터를 출력하고, 그렇지 않으면 0을 출력
out      = (invert) ? ~in : in;              // 조건에 따라 신호 반전

중첩된 조건부 연산자:

result = (a > b) ? a : (b > c) ? b : c;     // 세 값 중 가장 큰 값

참고 사항:

  • 조건은 0 또는 1로 평가되어야 합니다
  • 두 값 옵션은 동일한 비트 폭을 가져야 합니다
  • assign, always, initial 블록에서 사용할 수 있습니다

직접 해보기

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와 y 중 더 큰 값
    abs = ______;          // val의 절대값
    output_data = ______;  // enable이 참이면 data, 아니면 0
    
    $display("max = %d", max);
    $display("abs = %d", abs);
    $display("output_data = %b", output_data);
    $finish;
  end
endmodule
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

기초의 모든 레슨