Menu
Coddy logo textTech

Shift Operators

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

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

사용 가능한 시프트 연산자

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

작동 방식

왼쪽 시프트(<strong><<</strong>):

8'b00001010 << 2 = 8'b00101000

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

오른쪽 시프트(<strong>>></strong>):

8'b00001010 >> 2 = 8'b00000010

Bits가 오른쪽으로 이동합니다. 왼쪽은 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

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

signed 숫자의 경우 산술 오른쪽 시프트는 부호 비트를 유지합니다:

reg signed [7:0] a;
a = -5;                // 11111011
a >>> 2 = 11111110     // 여전히 음수

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

일반적인 사용

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

x << 1    // 2로 곱하기
x << 2    // 4로 곱하기
x << 3    // 8로 곱하기

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

x >> 1    // 2로 나누기
x >> 2    // 4로 나누기
x >> 3    // 8로 나누기

필드 추출:

// 8비트 값에서 비트 5-2 가져오기
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 컴파일러