Menu
CoddyTech

시프트 연산자

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

시프트 연산자는 벡터 내에서 비트를 왼쪽이나 오른쪽으로 이동합니다.

사용 가능한 시프트 연산자

연산자연산설명
<<논리 왼쪽 시프트비트를 왼쪽으로 이동하고 0으로 채웁니다
>>논리 오른쪽 시프트비트를 오른쪽으로 이동하고 0으로 채웁니다
<<<산술 왼쪽 시프트논리 왼쪽 시프트와 같습니다
>>>산술 오른쪽 시프트오른쪽으로 이동하며 부호 비트를 보존합니다

작동 방식

왼쪽 시프트(<<):

8'b00001010 << 2 = 8'b00101000

비트가 왼쪽으로 이동합니다. 오른쪽은 0으로 채워집니다.

오른쪽 시프트(>>):

8'b00001010 >> 2 = 8'b00000010

비트가 오른쪽으로 이동합니다. 왼쪽은 0으로 채워집니다.

코드 예제

module shift_demo;
  reg [7:0] original, left_shift, right_shift;
  
  initial begin
    original = 8'b00001010;
    
    left_shift  = original << 2;   // 00001010 → 00101000
    right_shift = original >> 2;   // 00001010 → 00000010
    
    $display("original   = %b", original);
    $display("<< 2       = %b", left_shift);
    $display(">> 2       = %b", right_shift);
    $finish;
  end
endmodule

출력:

original   = 00001010
<< 2       = 00101000
>> 2       = 00000010

산술 오른쪽 시프트(>>>)

부호 있는 수의 경우, 산술 오른쪽 시프트는 부호 비트를 유지합니다:

reg signed [7:0] a;
a = -5;                // 11111011
a >>> 2 = 11111110     // Still negative

논리적 시프트(>>)는 0으로 채우므로 부호를 잃게 됩니다.

일반적인 사용법

2의 거듭제곱을 곱하기(왼쪽 시프트):

x << 1    // Multiply by 2
x << 2    // Multiply by 4
x << 3    // Multiply by 8

2의 거듭제곱으로 나누기(오른쪽 시프트):

x >> 1    // Divide by 2
x >> 2    // Divide by 4
x >> 3    // Divide by 8

필드 추출:

// Get bits 5-2 from an 8-bit value
field = (data >> 2) & 4'b1111;
challenge icon

챌린지

각 작업에 맞는 시프트 식을 작성하세요.

할 일:

  1. a를 왼쪽으로 3비트 시프트하고 left_result에 저장하세요.
  2. a를 오른쪽으로 1비트 시프트하고 right_result에 저장하세요.
  3. b를 오른쪽으로 2비트 산술 시프트하고 arith_result에 저장하세요.

직접 해보기

module shift_challenge;
  reg [7:0] a;
  reg signed [7:0] b;
  reg [7:0] left_result, right_result;
  reg signed [7:0] arith_result;
  
  initial begin
    a = 8'b00010001;
    b = -8'sd16;       // 이진수로 11110000
    
    left_result  = ______;   // a를 왼쪽으로 3비트 시프트
    right_result = ______;   // a를 오른쪽으로 1비트 시프트
    arith_result = ______;   // b를 오른쪽으로 2비트 산술 시프트
    
    $display("a = %b", a);
    $display("a << 3 = %b", left_result);
    $display("a >> 1 = %b", right_result);
    $display("b = %b", b);
    $display("b >>> 2 = %b", arith_result);
    $finish;
  end
endmodule
quiz icon실력 점검

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

기초의 모든 레슨

직접 연습해 보세요: 온라인 Verilog 컴파일러