시프트 연산자
Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 26번째.
시프트 연산자는 벡터 내에서 비트를 왼쪽 또는 오른쪽으로 이동시킵니다.
사용 가능한 시프트 연산자
| 연산자 | 동작 | 설명 |
|---|---|---|
<< | 논리적 왼쪽 시프트 | 비트를 왼쪽으로 이동시키고, 0으로 채웁니다 |
>> | 논리적 오른쪽 시프트 | 비트를 오른쪽으로 이동시키고, 0으로 채웁니다 |
<<< | 산술적 왼쪽 시프트 | 논리적 왼쪽 시프트와 동일합니다 |
>>> | 산술적 오른쪽 시프트 | 오른쪽으로 이동시키고, 부호 비트를 유지합니다 |
작동 방식
왼쪽 시프트 (<strong><<</strong>):
8'b00001010 << 2 = 8'b00101000비트가 왼쪽으로 이동합니다. 오른쪽은 0으로 채워집니다.
오른쪽 시프트 (<strong>>></strong>):
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 // 여전히 음수논리적 시프트(>>)는 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;챌린지
각 작업에 맞는 올바른 시프트 표현식을 작성하세요.
수행할 작업:
a를 왼쪽으로 3비트 시프트하여left_result에 저장하세요.a를 오른쪽으로 1비트 시프트하여right_result에 저장하세요.b를 오른쪽으로 2비트 산술 시프트(arithmetic shift)하여arith_result에 저장하세요.
치트 시트
시프트 연산자는 벡터 내에서 비트를 왼쪽이나 오른쪽으로 이동시킵니다:
| 연산자 | 설명 |
|---|---|
<< | 논리 왼쪽 시프트 (0으로 채움) |
>> | 논리 오른쪽 시프트 (0으로 채움) |
<<< | 산술 왼쪽 시프트 (논리 시프트와 동일) |
>>> | 산술 오른쪽 시프트 (부호 비트 유지) |
8'b00001010 << 2 // = 8'b00101000
8'b00001010 >> 2 // = 8'b00000010
reg signed [7:0] a;
a = -5; // 11111011
a >>> 2 // = 11111110 (부호 유지)일반적인 용도:
x << n // 2^n을 곱함
x >> n // 2^n으로 나눔
// 8비트 값에서 비트 5-2를 추출
field = (data >> 2) & 4'b1111;직접 해보기
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이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.