시프트 연산자
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 82의 거듭제곱으로 나누기(오른쪽 시프트):
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;챌린지
각 작업에 맞는 시프트 식을 작성하세요.
할 일:
a를 왼쪽으로 3비트 시프트하고left_result에 저장하세요.a를 오른쪽으로 1비트 시프트하고right_result에 저장하세요.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이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
기초의 모든 레슨
직접 연습해 보세요: 온라인 Verilog 컴파일러