시프트 연산자
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으로 채워지고 sign을 잃게 됩니다.
일반적인 용도
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를 3bits만큼left로 시프트하고left_result에 저장하세요.a를 1bit만큼right로 시프트하고right_result에 저장하세요.b를 2bits만큼right로 시프트(arithmetic)하고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이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.