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

Verilog 사례 진술

case 문은 주어진 표현식이 목록의 다른 표현식 중 하나와 일치하는지 확인하고 그에 따라 분기합니다. 일반적으로 멀티플렉서를 구현하는 데 사용됩니다. if-else 구문은 확인해야 할 조건이 많고 멀티플렉서 대신 우선 순위 인코더로 합성되는 경우 적합하지 않을 수 있습니다.

구문

Verilog 케이스 명령문은 case로 시작합니다. 키워드이고 endcase로 끝남 예어. 괄호 안의 표현식은 정확히 한 번 평가되고 작성된 순서대로 대안 목록과 비교되며 대안이 주어진 표현식과 일치하는 명령문이 실행됩니다. 여러 문의 블록은 그룹화되어야 하며 begin 내에 있어야 합니다. 및 end .

  
  
	// Here 'expression' should match one of the items (item 1,2,3 or 4)
	case (<expression>) 
		case_item1 : 	<single statement>
		case_item2,
		case_item3 : 	<single statement>
		case_item4 : 	begin
		          			<multiple statements>
		        			end
		default 	 : <statement>
	endcase

  

지정된 표현식과 일치하는 케이스 항목이 없으면 default 내의 명령문 항목이 실행됩니다. default 문은 선택 사항이며 default는 하나만 있을 수 있습니다. case 문에 있는 문. Case 문은 중첩될 수 있습니다.

어떤 항목도 표현식 및 default와 일치하지 않으면 실행은 아무 작업도 하지 않고 케이스 블록을 종료합니다. 설명이 제공되지 않습니다.

아래에 표시된 설계 모듈에는 3개의 다른 3비트 입력 중 하나를 호출된 출력 신호로 라우팅하는 2비트 선택 신호가 있습니다. case 문은 sel 값을 기반으로 출력에 올바른 입력을 할당하는 데 사용됩니다. sel은 2비트 신호이므로 2 2 를 가질 수 있습니다. 조합, 0 - 3. 기본 문은 sel이 3인 경우 출력을 0으로 설정하는 데 도움이 됩니다.

  
  
module my_mux (input       [2:0] 	a, b, c, 		// Three 3-bit inputs
                           [1:0]	sel, 			  // 2-bit select signal to choose from a, b, c
               output reg  [2:0] 	out); 			// Output 3-bit signal 
  
  // This always block is executed whenever a, b, c or sel changes in value
  always @ (a, b, c, sel) begin 		
    case(sel)
      2'b00    : out = a; 		// If sel=0, output is a
      2'b01    : out = b; 		// If sel=1, output is b
      2'b10    : out = c; 		// If sel=2, output is c
      default  : out = 0; 		// If sel is anything else, out is always 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 문에 case item 대안에 x와 z가 있으면 결과가 상당히 달라집니다.

  
  
module my_mux (input  		[2:0] 	a, b, c,
													[1:0]		sel,
							output reg	[2:0] 	out);
  
  // Case items have x and z and sel has to match the exact value for
  // output to be assigned with the corresponding input
  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.

대소문자는 if-else와 어떻게 다릅니까?

case 명령문이 if-else-if와 다릅니다. 두 가지 방법으로:


verilog

  1. C# switch 문
  2. C# break 문
  3. C# 계속 문
  4. EXAMPLE이 있는 C++ Switch Case 문
  5. Verilog 튜토리얼
  6. Verilog 연결
  7. Verilog 할당
  8. Verilog 차단 및 비 차단
  9. Verilog 기능
  10. Verilog 작업