음수
Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 16번째.
Verilog에서 음수는 2의 보수(two's complement) 형식을 사용하여 표현됩니다. 2의 보수는 이진수에서 양수와 음수를 모두 표현하는 방법입니다. 최상위 비트(MSB)는 부호를 나타냅니다:
- 0 = 양수
- 1 = 음수
2의 보수 계산 방법
어떤 수의 2의 보수를 구하는 방법은 다음과 같습니다:
- 양수를 이진수로 씁니다
- 모든 비트를 반전시킵니다 (0은 1로, 1은 0으로)
- 1을 더합니다
예시: 4비트로 -5 표현하기
| 단계 | 연산 | 결과 |
|---|---|---|
| 1 | 양수 5의 이진수 | 0101 |
| 2 | 모든 비트 반전 | 1010 |
| 3 | 1 더하기 | 1011 |
4비트 2의 보수에서 -5는 <strong>4'b1011</strong>
Verilog에서 음수 작성하기
십진수 형식을 사용하여 음수를 직접 작성할 수 있습니다:
reg signed [3:0] a;
a = -5; // Verilog는 자동으로 2의 보수를 사용합니다크기가 지정된 이진수의 경우, 2의 보수 값을 작성해야 합니다:
a = 4'b1011; // 이것은 4비트 2의 보수에서 -5입니다Signed vs Unsigned
기본적으로 Verilog는 숫자를 unsigned(부호 없는 수)로 취급합니다. 음수를 다루려면 신호를 signed로 선언하십시오:
reg signed [3:0] negative; // -8에서 7까지 저장 가능
reg [3:0] positive; // 0에서 15까지 저장 가능부호 있는 숫자의 범위
N 비트의 경우, 부호 있는 숫자는 다음을 표현할 수 있습니다:
- 최솟값: -2^(N-1)
- 최댓값: 2^(N-1) - 1
| 비트 | 범위 |
|---|---|
| 4비트 | -8 ~ 7 |
| 8비트 | -128 ~ 127 |
| 16비트 | -32768 ~ 32767 |
중요 참고 사항
- 음수 처리를 활성화하려면
signed키워드를 사용하십시오 signed가 없으면 Verilog는 모든 값을 양수로 취급합니다
signed를 사용할 때 2의 보수 연산이 자동으로 작동합니다- MSB가 부호를 결정합니다: 1 = 음수, 0 = 양수
챌린지
올바른 2의 보수 값을 작성하여 코드를 완성하세요.
수행할 작업:
- 4비트 2의 보수 이진수를 사용하여
a를 -3으로 설정하세요. - 4비트 2의 보수 이진수를 사용하여
b를 -8로 설정하세요. - 4비트 2의 보수 이진수를 사용하여
c를 -1로 설정하세요.
치트 시트
Verilog에서 음수는 2의 보수(two's complement) 형식을 사용합니다. MSB(최상위 비트)는 부호를 나타냅니다: 0 = 양수, 1 = 음수.
2의 보수 계산 방법:
- 양수를 이진수로 작성합니다.
- 모든 비트를 반전시킵니다(Flip).
- 1을 더합니다.
예시: 4비트에서 -5 → 0101 → 1010 → 1011 = 4'b1011
음수를 처리하려면 신호를 signed로 선언하십시오:
reg signed [3:0] negative; // -8에서 7까지 저장 가능
reg [3:0] positive; // 0에서 15까지 저장 가능음수 값을 직접 할당하거나 2의 보수 이진수를 통해 할당할 수 있습니다:
reg signed [3:0] a;
a = -5; // Verilog가 자동으로 2의 보수를 사용합니다.
a = 4'b1011; // 동일함: 4비트 2의 보수 형식의 -5N비트 부호 있는 정수(signed)의 범위: -2^(N-1)에서 2^(N-1) - 1까지 (예: 4비트의 경우 -8에서 7까지).
직접 해보기
module negative_challenge;
reg signed [3:0] a, b, c;
initial begin
a = 4'b______; // -3 in 4-bit two's complement
b = 4'b______; // -8 in 4-bit two's complement
c = 4'b______; // -1 in 4-bit two's complement
$display("a = %d", a);
$display("b = %d", b);
$display("c = %d", c);
$finish;
end
endmodule이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.