Altifigence Academy

2 / 63 · 개념

수 체계와 고정 폭 표현

진법을 변환하고, 표현 범위와 필요한 비트 수, 절단 오차를 계산합니다.

이 과정의 출발점

시작하기 전에 고등학교에서 배우는 문자식과 방정식을 익히고, 기초적인 프로그래밍을 경험해 보는 것을 권장합니다. 이진수와 불 대수불 대수 0과 1, AND·OR·NOT을 다루는 대수입니다. 여기서 더하기 기호는 보통 OR이므로 정수 덧셈의 규칙과 다릅니다. 자세히 보기는 이 과정에서 설명하며, 대학 입문 수업에서 다루는 디지털 논리 설계를 빠르게 배웁니다. 공식을 외우는 것보다 입력 조건·비트 폭·관찰 시점을 정하고 예제로 검증하는 데 집중하세요.

비트열과 값은 구분해야 합니다

회로가 저장하는 것은 유한한 비트열입니다. 그 비트열을 정수, 부호 있는 값, 고정소수점고정소수점 소수점 위치를 미리 고정하고 정수 비트열에 일정한 배율을 적용하는 수 표현입니다. 폭·부호·소수 비트 수를 함께 정해야 합니다. 자세히 보기 중 무엇으로 해석할지는 설계할 때 정한 규칙에 따릅니다. 정수 연산과 거듭제곱을 알고 있다는 전제로, 이 강의에서는 RTL 설계에 필요한 값의 범위를 계산합니다.

NN비트 unsignedunsigned 비트열을 음수가 없는 정수로 해석하는 규칙입니다. n비트의 범위는 0부터 2^n−1이며, 같은 비트열의 signed 해석과 다를 수 있습니다. 값의 해석은 다음과 같습니다.

u=∑i=0N−1bi2i,0≤u≤2N−1u=\sum_{i=0}^{N-1}b_i2^i,\qquad 0\le u\le 2^N-1

10110110은 128+32+16+4+2=182128+32+16+4+2=182입니다. 이를 4비트씩 묶으면 B6이므로 8'hB6과 8'b10110110은 같은 비트열입니다. 16진수 한 자리가 언제나 4비트를 나타내므로 주소·마스크·파형을 읽을 때 변환이 빠릅니다.

비트열은 그대로, 해석은 다르게

아래에서 b7을 전환해 보세요. unsigned 해석에서는 자릿값 128이 더해지지만, 2의 보수2의 보수 고정 폭 비트열로 부호 있는 정수를 나타내는 방식입니다. n비트 범위는 −2^(n−1)부터 2^(n−1)−1까지입니다. 자세히 보기 해석에서는 최상위 비트의 가중치가 −128입니다. 먼저 0x7F와 0x80을 만들어 두 해석의 경계를 비교하세요.

비트와 수의 표현

10110110 → unsigned 182 · signed -74 · hex 0xB6

비트열을 바꾸는 것과 signed로 해석하는 것은 서로 다른 연산입니다. 회로의 폭은 8비트로 같아도 연산자에 전달되는 부호 정보에 따라 비교 결과가 달라집니다.

먼저 범위, 그다음 비트 폭

서로 다른 MM개 상태를 구별하는 데 필요한 최소 비트 수는 다음과 같습니다.

N=⌈log⁡2M⌉N=\left\lceil\log_2 M\right\rceil

0부터 999까지 세려면 1000개 값을 표현하므로 10비트가 필요합니다. 0부터 1024까지는 1025개이므로 11비트입니다. 최대값과 상태 개수를 혼동하면 정확히 경계에서 한 비트가 부족해집니다. RTL에서 M=1M=1까지 매개변수화한다면 0비트 벡터가 생기지 않도록 폭을 최소 1로 제한해야 합니다.

좁은 신호에 저장하면 무슨 일이 생기는가

상위 비트를 버리고 NN비트만 남기는 unsigned 저장은 모듈러 연산입니다.

xstored=x mod 2Nx_{stored}=x\bmod 2^N

예를 들어 9비트 계산 결과 300을 8비트에 저장하면 44가 남습니다. 이것은 반올림이나 포화가 아닙니다. 포화 연산이 필요하다면 범위 초과를 감지하고 최댓값을 선택하는 회로를 별도로 설계해야 합니다.

SystemVerilog
logic [7:0] a, b, low;
logic [8:0] full_sum;
assign full_sum = {1'b0, a} + {1'b0, b};
assign low = full_sum[7:0];

두 피연산자의 비트 폭을 먼저 늘려 carry까지 보존하도록 했습니다. 진법 표기만 보고 부호나 결과 폭까지 결정됐다고 생각하지 마세요. 파형 해석에는 폭·부호·기수가 모두 필요합니다.

직접 생각해 보기

0부터 4095까지 세는 값과 4096까지 세는 값에 각각 몇 비트가 필요할까요? 8비트 unsigned에 511을 저장하면 어떤 값이 남을까요?

해설 보기

첫 범위는 4096=2124096=2^{12}개이므로 12비트, 두 번째는 4097개이므로 13비트입니다. 511 mod 256=255511\bmod256=255이므로 저장값은 8'hFF입니다. 이것만으로 overflow가 없었다고 판단할 수는 없습니다.

선택은 이 브라우저에만 적용됩니다. 언제든 푸터에서 변경할 수 있습니다.