비트 연산자
Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 23번째.
비트 연산자는 숫자의 각각의 개별 비트에 대해 연산을 수행합니다. 숫자를 전체 값으로 취급하는 산술 연산자(+, -, *, /)와 달리, 비트 연산자는 비트 단위로 작동합니다.
사용 가능한 비트 연산자
| 연산자 | 연산 | 설명 |
|---|---|---|
& | AND | 두 입력 비트가 모두 1인 경우에만 출력 비트가 1이 됩니다. |
| | OR | 입력 비트 중 적어도 하나가 1이면 출력 비트가 1이 됩니다. |
^ | XOR | 입력 비트가 서로 다르면 출력 비트가 1이 됩니다. |
~ | NOT | 모든 비트를 반전시킵니다 (0은 1로, 1은 0으로). |
비트 연산자를 사용할 때, Verilog는 내부적으로 숫자를 이진수로 처리합니다.
reg [3:0] a, b;
a = 4'd10; // 10진수 10 = 2진수 1010
b = 4'd12; // 10진수 12 = 2진수 1100
c = a & b; // 이진수를 직접 사용하는 것과 동일하게 작동합니다숫자를 10진수, 16진수 또는 2진수로 작성할 수 있으며, Verilog는 비트 연산을 위해 이를 2진수로 변환합니다.
비트 연산의 작동 방식
각 연산자는 비트 쌍(또는 NOT의 경우 단일 비트)에 대해 작동합니다:
4비트 숫자를 사용한 예시:
a = 1010 (binary)
b = 1100 (binary)
AND: a & b = 1000
(1&1=1, 0&1=0, 1&0=0, 0&0=0)
OR: a | b = 1110
(1|1=1, 0|1=1, 1|0=1, 0|0=0)
XOR: a ^ b = 0110
(1^1=0, 0^1=1, 1^0=1, 0^0=0)
NOT: ~a = 0101
(~1=0, ~0=1, ~1=0, ~0=1)코드 예제
module bitwise_demo;
reg [3:0] a, b;
reg [3:0] and_res, or_res, xor_res, not_res;
initial begin
a = 4'b1010;
b = 4'b1100;
and_res = a & b; // 1010 & 1100 = 1000
or_res = a | b; // 1010 | 1100 = 1110
xor_res = a ^ b; // 1010 ^ 1100 = 0110
not_res = ~a; // ~1010 = 0101
$display("a = %b", a);
$display("b = %b", b);
$display("a & b = %b", and_res);
$display("a | b = %b", or_res);
$display("a ^ b = %b", xor_res);
$display("~a = %b", not_res);
$finish;
end
endmodule출력:
a = 1010
b = 1100
a & b = 1000
a | b = 1110
a ^ b = 0110
~a = 0101챌린지
주어진 값에 대한 비트 연산 결과를 계산하세요.
수행할 작업:
a & b를 계산하여and_res에 저장하세요.a | b를 계산하여or_res에 저장하세요.a ^ b를 계산하여xor_res에 저장하세요.~a를 계산하여not_res에 저장하세요.
치트 시트
비트 연산자는 숫자의 각 개별 비트에 대해 작동합니다:
| 연산자 | 연산 | 출력 비트가 1이 되는 경우... |
|---|---|---|
& | AND | 두 입력 비트가 모두 1일 때 |
| | OR | 최소 하나의 입력 비트가 1일 때 |
^ | XOR | 입력 비트가 서로 다를 때 |
~ | NOT | 모든 비트를 반전시킴 (단항) |
// a = 1010, b = 1100
a & b = 1000 // AND
a | b = 1110 // OR
a ^ b = 0110 // XOR
~a = 0101 // NOT
직접 해보기
module bitwise_challenge;
reg [3:0] a, b;
reg [3:0] and_res, or_res, xor_res, not_res;
initial begin
a = 4'b1101;
b = 4'b1011;
and_res = ______; // a & b
or_res = ______; // a | b
xor_res = ______; // a ^ b
not_res = ______; // ~a
$display("a = %b", a);
$display("b = %b", b);
$display("a & b = %b", and_res);
$display("a | b = %b", or_res);
$display("a ^ b = %b", xor_res);
$display("~a = %b", not_res);
$finish;
end
endmodule이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.