산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> verilog

Verilog Case 문 이해: 효율적인 멀티플렉서 구현

case 문은 주어진 표현식이 리스트의 다른 표현식 중 하나와 일치하는지 검사하고 그에 따라 분기합니다. 일반적으로 멀티플렉서를 구현하는 데 사용됩니다. 조건이 많으면 if-else 구조는 적합하지 않으며, 멀티플렉서 대신 우선순위 인코더로 합성될 수 있습니다.

문법

Verilog case 문은 case 키워드로 시작하고 endcase 키워드로 끝납니다. 괄호 안의 표현식은 정확히 한 번 평가되며, 작성된 순서대로 대안 리스트와 비교되어 일치하는 대안의 문장들이 실행됩니다. 여러 문장 블록은 begin과 end로 묶어야 합니다.

// 'expression'은 항목(item 1,2,3,4) 중 하나와 일치해야 함
case (<expression>)
  case_item1 : <single statement>
  case_item2, case_item3 : <single statement>
  case_item4 : begin
    <multiple statements>
  end
  default : <statement>
endcase

어떤 case 항목도 주어진 표현식과 일치하지 않으면 default 항목의 문장이 실행됩니다. default 문은 선택 사항이며, case 문에서 하나만 가질 수 있습니다. Case 문은 중첩될 수 있습니다.

default 문이 없고 어떤 항목도 표현식과 일치하지 않으면 아무 작업도 하지 않고 case 블록을 빠져나갑니다.

예제

아래 설계 모듈은 2비트 선택 신호를 사용하여 세 개의 3비트 입력 중 하나를 out 출력 신호로 라우팅합니다. case 문을 사용하여 sel 값에 따라 올바른 입력을 출력에 할당합니다. sel이 2비트 신호이므로 22 가지 조합(0~3)을 가집니다. default 문은 sel이 3일 때 출력을 0으로 설정하는 데 도움이 됩니다.

module my_mux (
  input [2:0] a, b, c,  // 세 개의 3비트 입력
  input [1:0] sel,      // a, b, c 중 선택하는 2비트 선택 신호
  output reg [2:0] out  // 출력 3비트 신호
);
  // a, b, c, sel 중 어느 하나라도 값이 변경되면 이 always 블록 실행
  always @ (a, b, c, sel) begin
    case(sel)
      2'b00 : out = a;  // sel=0이면 출력은 a
      2'b01 : out = b;  // sel=1이면 출력은 b
      2'b10 : out = c;  // sel=2이면 출력은 c
      default : out = 0; // 그 외 경우 out은 항상 0
    endcase
  end
endmodule

하드웨어 회로도

RTL 코드가 엘리보레이트되어 4:1 멀티플렉서를 나타내는 하드웨어 회로도가 생성됩니다.

sel이 3일 때 출력이 0이고, 다른 값에서는 할당된 입력에 해당함을 볼 수 있습니다.

시뮬레이션 로그

ncsim> run
[0] a=0x4 b=0x1 c=0x1 sel=0b11 out=0x0
[10] a=0x5 b=0x5 c=0x5 sel=0b10 out=0x5
[20] a=0x1 b=0x5 c=0x6 sel=0b01 out=0x5
[30] a=0x5 b=0x4 c=0x1 sel=0b10 out=0x1
[40] a=0x5 b=0x2 c=0x5 sel=0b11 out=0x0
ncsim: *W,RNQUIE: Simulation is complete.

case 문에서 비교는 표현식의 각 비트가 대안(0, 1, x, z 포함)과 일치할 때만 성공합니다. 위 예제에서 sel의 어떤 비트가 x 또는 z이면, 다른 대안들이 매치되지 않으므로 default 문이 실행되고 출력은 모두 0이 됩니다.

시뮬레이션 로그

ncsim> run
[0] a=0x4 b=0x1 c=0x1 sel=0bxx out=0x0
[10] a=0x3 b=0x5 c=0x5 sel=0bzx out=0x0
[20] a=0x5 b=0x2 c=0x1 sel=0bxx out=0x0
[30] a=0x5 b=0x6 c=0x5 sel=0bzx out=0x0
[40] a=0x5 b=0x4 c=0x1 sel=0bxz out=0x0
[50] a=0x6 b=0x5 c=0x2 sel=0bxz out=0x0
[60] a=0x5 b=0x7 c=0x2 sel=0bzx out=0x0
[70] a=0x7 b=0x2 c=0x6 sel=0bzz out=0x0
[80] a=0x0 b=0x5 c=0x4 sel=0bxx out=0x0
[90] a=0x5 b=0x5 c=0x5 sel=0bxz out=0x0
ncsim: *W,RNQUIE: Simulation is complete.

설계의 case 문 항목에 x와 z가 포함되면 결과가 크게 달라집니다.

module my_mux (
  input [2:0] a, b, c,
  input [1:0] sel,
  output reg [2:0] out
);
  // case 항목에 x, z가 있고 sel이 정확한 값과 일치해야
  // 해당 입력이 출력에 할당됨
  always @ (a, b, c, sel) begin
    case(sel)
      2'bxz : out = a;
      2'bzx : out = b;
      2'bxx : out = c;
      default : out = 0;
    endcase
  end
endmodule

시뮬레이션 로그

ncsim> run
[0] a=0x4 b=0x1 c=0x1 sel=0bxx out=0x1
[10] a=0x3 b=0x5 c=0x5 sel=0bzx out=0x5
[20] a=0x5 b=0x2 c=0x1 sel=0bxx out=0x1
[30] a=0x5 b=0x6 c=0x5 sel=0bzx out=0x6
[40] a=0x5 b=0x4 c=0x1 sel=0bxz out=0x5
[50] a=0x6 b=0x5 c=0x2 sel=0bxz out=0x6
[60] a=0x5 b=0x7 c=0x2 sel=0bzx out=0x7
[70] a=0x7 b=0x2 c=0x6 sel=0bzz out=0x0
[80] a=0x0 b=0x5 c=0x4 sel=0bxx out=0x4
[90] a=0x5 b=0x5 c=0x5 sel=0bxz out=0x5
ncsim: *W,RNQUIE: Simulation is complete.

case 문과 if-else의 차이점

case 문은 if-else-if와 두 가지 면에서 다릅니다:

verilog

  1. C# switch 문 마스터하기: 문법, 예제, 모범 사례
  2. C# break 문: 사용법과 활용 시점 완벽 가이드
  3. C# continue 문: 루프 반복 건너뛰기 완벽 활용법
  4. C++ switch-case 마스터하기: 문법, 활용법, 실전 예제
  5. 버릴로그(Verilog) 입문: 디지털 회로 설계를 위한 하드웨어 기술 언어
  6. Verilog 결합(Concatenation) & 복제(Replication) 연산자 실전 가이드
  7. Verilog 할당문 이해: 유형, 문법, 모범 사례
  8. Verilog 차단 vs 비차단 할당: 핵심 차이점 완벽 이해
  9. Verilog 함수 마스터하기: 효율적인 RTL 설계를 위한 활용법
  10. Verilog 태스크 이해: 함수와의 차이점, 문법, 활용법