ALU의 작동 원리: 게이트로 만드는 산술 논리 장치
가산기, 비트 단위 논리, 시프터, 결과 멀티플렉서로 작은 ALU를 만들고 캐리, 제로, 음수, 오버플로 출력을 도출합니다.
요약: 작은 ALU는 조합 논리 데이터패스입니다. 산술, 논리, 시프트의 후보 기능이 같은 입력 워드에 대해 동작하고, 멀티플렉서가 외부에 보일 결과를 선택합니다. 연산 인코딩, 캐리/빌림 의미론, 오버플로 동작, 플래그 쓰기 정책을 명확히 해야 설계가 완성됩니다.
산술 논리 장치(ALU)는 프로세서가 데이터를 변환하는 곳입니다. ADD와 SUB에는 가산기가 필요하고, AND, OR, XOR에는 병렬 게이트 레인이 필요하며, 시프트에는 배선 또는 시프터 네트워크가 필요합니다. 그리고 결과 멀티플렉서가 어느 후보가 목적지에 도달할지 선택합니다.
이 블록도는 4비트나 8비트로 만들 수 있을 만큼 단순하지만, 실제 공학 설계의 여러 결정을 드러낼 만큼 풍부합니다.
- 뺄셈은 빌림을 보고할까요, 아니면 빌림 없음을 보고할까요?
- 오른쪽 시프트는 0으로 채울까요, 아니면 부호 비트를 복사할까요?
- 어떤 연산이 오버플로 출력을 정의할까요?
- ALU 자체가 플래그를 저장할까요, 아니면 별도 레지스터가 이를 캡처할까요?
- 병렬 계산 뒤 하나의 큰 기능을 선택할까요, 아니면 면적을 줄이도록 논리를 공유할까요?
이 안내서에서는 일관된 4비트 교육용 ALU를 구성하고, 다른 아키텍처가 다르게 선택할 수 있는 지점을 표시합니다.
인터페이스 계약에서 시작하기
어떤 연산이 명시적으로 부호 있는 해석을 요구하지 않는 한, 부호 없는 비트 벡터를 가정합니다.
| 포트 | 폭 | 방향 | 의미 |
|---|---|---|---|
A | 4 | 입력 | 첫 번째 피연산자 |
B | 4 | 입력 | 두 번째 피연산자 |
OP | 3 | 입력 | 연산 선택 |
Y | 4 | 출력 | 선택된 결과 |
C | 1 | 출력 | ADD의 캐리, SUB의 빌림 |
Z | 1 | 출력 | Y == 0000일 때 1 |
N | 1 | 출력 | Y[3] |
V | 1 | 출력 | ADD 또는 SUB의 부호 있는 오버플로 |
가능한 연산 맵 하나는 다음과 같습니다.
OP | 기능 | 정의 |
|---|---|---|
000 | ADD | |
001 | SUB | |
010 | AND | 비트별 |
011 | OR | 비트별 |
100 | XOR | 비트별 |
101 | NOT A | |
110 | 논리적 왼쪽 시프트 | 비트 0에 0이 들어감 |
111 | 논리적 오른쪽 시프트 | 비트 3에 0이 들어감 |
이는 교육용 명세이며 표준 인코딩이 아닙니다. 실제 명령어 집합은 시프트, 곱셈, 주소 생성, 비교를 다른 실행 장치로 분리할 수 있습니다. 능력이 서로 다른 ALU를 여러 개 둘 수도 있습니다.
여기서 설명하는 ALU에는 내부 상태가 없습니다. 입력이 바뀌면 조합 네트워크를 통과한 뒤 출력이 안정됩니다. 피연산자 레지스터, 목적지 레지스터, 플래그 레지스터는 별개의 순차 소자입니다.
블록 1: 하나의 가산기로 덧셈과 뺄셈 수행하기
리플 캐리 가산기는 네 단계의 전가산기를 연결합니다. 비트 에 대해 다음과 같습니다.
제어 비트 SUB를 사용해 B와 초기 캐리를 변환합니다.
SUB=0일 때 이 네트워크는 를 계산합니다. SUB=1일 때는 다음을 계산합니다.
가산기의 최종 캐리 출력은 연산에 따라 다르게 해석됩니다.
- ADD 후에는 이 부호 없는 합이 15를 넘었음을 뜻합니다.
- SUB 후에는 이 부호 없는 뺄셈에서 빌림이 필요하지 않았음을 뜻합니다.
DigiSim ALU는 ADD 후에는 반전하지 않은 캐리 출력을 C로 노출하고, SUB 후에는 그 보수를 노출합니다.
따라서 뺄셈 후 C=1은 부호 없는 빌림이 발생했음()을 뜻합니다. 결과 비트는 여전히 같은 모듈러 합에서 나오며, 바뀌는 것은 플래그 극성뿐입니다.
오버플로는 캐리가 아닙니다
부호 있는 오버플로는 2의 보수 범위 부터 까지와 관련 있고, 캐리는 부호 없는 범위 0부터 15까지와 관련 있습니다.
덧셈의 경우:
뺄셈의 경우:
동등하게, 이 가산기/감산기에서는 입니다. C와 V를 분리해 두면 같은 네 결과 비트로 부호 없는 해석과 부호 있는 해석을 모두 올바르게 지원할 수 있습니다.
블록 2: 병렬 비트 단위 논리
각 비트 레인은 독립적으로 논리를 계산합니다.
개념적 구현에서는 네 후보 버스가 모두 병렬로 존재합니다. 합성 도구는 항을 공유하거나, 기능을 룩업 테이블에 매핑하거나, 복합 표준 셀을 선택할 수 있습니다. “비트당 게이트 하나”는 불 구조를 설명할 뿐, 트랜지스터 수나 물리적 지연을 보장하지는 않습니다.
비트 단위 기능에는 워드 전체에 걸친 캐리 의존성이 없지만, 선택된 결과는 여전히 게이트, 배선, 출력 멀티플렉서를 통과합니다. 즉시 끝나지 않습니다.
블록 3: 시프트
한 자리 고정 논리 시프트는 배선으로 표현할 수 있습니다.
SHL(A): Y3=A2, Y2=A1, Y1=A0, Y0=0
SHR(A): Y3=0, Y2=A3, Y1=A2, Y0=A1
ISA가 이를 지정한다면 밀려나간 비트를 캐리 후보로 보존할 수 있습니다.
SHL carry candidate = A3
SHR carry candidate = A0
산술 오른쪽 시프트는 최상위 비트에서만 다릅니다. 부호를 확장하도록 A3을 Y3에 복사합니다. 가변 거리 시프트에는 배럴 시프터와 같은 선택 가능한 배선 네트워크가 필요하지만, 한 자리 고정 시프트에는 필요하지 않습니다.
블록 4: 결과 멀티플렉서
출력 멀티플렉서는 OP에 의미를 부여합니다. 개념적으로는 다음과 같습니다.
case OP
000: Y = arithmetic_sum
001: Y = arithmetic_difference
010: Y = bitwise_and
011: Y = bitwise_or
100: Y = bitwise_xor
101: Y = bitwise_not_a
110: Y = shift_left
111: Y = shift_right
4비트에서는 결과 비트마다 8대1 멀티플렉서 하나로 그릴 수 있습니다. 프로그래머블 로직에서는 룩업 테이블과 배선 자원으로 매핑될 수 있습니다. ASIC에서는 멀티플렉서 셀, AOI/OAI 구조, 또는 합성이 선택한 다른 인수분해 네트워크가 될 수 있습니다.
결과 선택은 임계 타이밍 경로의 일부입니다.
이 식은 설계 추정치이지 사인오프 방정식이 아닙니다. 물리적 타이밍은 셀, 팬아웃, 배선, 전압, 온도, 구현 방식에 좌우됩니다.
결과 플래그
선택된 Y 값은 연산과 무관한 두 후보를 만듭니다.
C와 V는 연산별입니다. 이 교육용 ALU에 일관된 정책은 다음과 같습니다.
| 연산 | C | V |
|---|---|---|
| ADD | 최종 캐리 출력 | 덧셈 오버플로 |
| SUB | 빌림(), 즉 최종 캐리 출력의 보수 | 뺄셈 오버플로 |
| SHL | MSB에서 밀려나간 비트 | 0 |
| SHR | LSB에서 밀려나간 비트 | 0 |
| AND/OR/XOR/NOT | 0 | 0 |
다른 설계에서는 논리 연산에서 C와 V를 지우지 않고 보존할 수도 있습니다. 이는 ISA와 제어 정책의 선택입니다. 조합 ALU는 후보 신호를 제시할 수 있고, 클록 구동 플래그 레지스터가 저장된 비트를 로드, 보존 또는 선택적으로 갱신할지 결정합니다.
부호 플래그 N은 결과의 MSB입니다. 하지만 뺄셈 후 이것만으로 올바른 부호 있는 작음 비교를 할 수는 없습니다. 부호 있는 오버플로를 보정하려면 를 사용하세요.
4비트 계산 예제
6 - 3
A = 0110
B = 0011
~B = 1100
A + ~B+1 = 1 0011
저장된 결과는 0011(3)입니다. 반전하지 않은 캐리 출력은 1이므로 빌림이 발생하지 않았고, 빌림으로 인코딩하는 DigiSim의 C 출력은 0입니다.
Y=0011, Z=0, C=0, N=0, V=0
3 - 6
A = 0011
B = 0110
A + ~B+1 = 0 1101
1101은 부호 없이 13이고 부호 있게는 -3입니다. 반전하지 않은 캐리 출력은 0이므로 부호 없는 뺄셈에서 빌림이 발생했고, C는 1입니다.
Y=1101, Z=0, C=1, N=1, V=0
7 + 1
0111 + 0001 = 1000
부호 없는 캐리는 없지만, +8은 부호 있는 4비트 2의 보수에 들어가지 않습니다.
Y=1000, Z=0, C=0, N=1, V=1
15 + 1
1111 + 0001 = 1 0000
부호 없는 결과는 래핑되고 캐리가 발생합니다. 부호 있는 산술에서는 -1 + 1 = 0이므로 유효합니다.
Y=0000, Z=1, C=1, N=0, V=0
마지막 두 벡터는 C와 V가 같은 것이 아님을 증명합니다.
CPU에서 ALU의 위치
작은 단일 사이클 데이터패스는 다음 순서로 동작할 수 있습니다.
- 소스 레지스터가 A와 B를 제시합니다.
- 제어 장치가
OP를 선택합니다. - ALU와 플래그 생성 논리가 안정됩니다.
- 목적지 레지스터가 활성 클록 에지에서 Y를 캡처합니다.
- 활성화되면 플래그 레지스터가 선택된 상태 비트를 캡처합니다.
최대 클록 주파수는 ALU만이 아니라 가장 긴 완전한 레지스터-대-레지스터 경로에 좌우됩니다. 그 경로에는 레지스터의 클록-투-Q 지연, 피연산자 선택, ALU 논리, 결과 배선, 목적지 셋업 시간, 클록 불확실성, 스큐가 포함될 수 있습니다. ALU가 임계 요소일 수는 있지만, 다른 마이크로아키텍처에서는 캐시 접근, 바이패스 네트워크, 디코드 또는 다른 논리가 지배적일 수 있습니다.
가산기를 최적화한다고 해서 시스템 주파수가 자동으로 일대일로 향상되는 것은 아닙니다. 배치와 배선 후에도 그 경로가 제한 요인이고, 회복한 여유가 다른 곳에서 소진되지 않을 때만 도움이 됩니다. 전체 타이밍 맥락은 전파 지연과 클록 스큐를 참조하세요.
역사적 참고 사례인 74181
4비트 74181 계열은 기능 선택, 모드 선택, 캐리 입력, 캐리 출력, 그룹 캐리 신호를 인터페이스로 노출하기 때문에 유용한 사례입니다. 산술 및 논리 기능 목록을 지원하며, 캐리 룩어헤드 지원으로 더 넓은 워드로 결합할 수 있습니다.
이를 현대 CPU의 트랜지스터 수준 청사진으로 취급해서는 안 됩니다. 현대 프로세서는 여러 특화 정수 실행 장치, 별도의 벡터 및 부동소수점 데이터패스, 분산된 분기 비교 논리, 구현에 특화된 가산기 구조를 사용할 수 있습니다. 변하지 않는 것은 아키텍처 패턴입니다. 피연산자 워드를 변환하고, 결과를 선택하며, 정확히 정의된 상태 정보를 보고하는 것입니다.
4비트 버전 만들기와 검증하기
더 큰 참고용으로 DigiSim의 8비트 ALU 템플릿을 사용하거나, 4비트 인터페이스를 직접 구성하세요.
B XOR SUB와c0=SUB를 사용하는 4단 가산기/감산기를 만듭니다.- 병렬 AND, OR, XOR, NOT 레인을 추가합니다.
- 논리 시프트를 배선하고 C가 사용한다면 밀려나간 비트를 보존합니다.
- 8방향 4비트 멀티플렉서로 결과를 선택합니다.
- 선택된 결과에서 Z를 생성하고, MSB에서 N을 생성합니다.
- 연산 표에 따라 C와 V를 선택합니다.
- A, B, OP, Y, C, Z, N, V를 프로브합니다.
보통 값으로 모든 opcode를 검증한 다음 경계 조건을 노리세요.
- 제로 결과
- 전부 1인 값에 1 더하기
- 가장 큰 부호 있는 양수에 1 더하기
- 가장 작은 부호 있는 음수에서 1 빼기
- 빌림이 발생하는 경우와 발생하지 않는 경우 모두의 뺄셈
- 밀려나가는 비트가 설정된 왼쪽 및 오른쪽 시프트
- 연산 종류를 바꿀 때의 플래그 동작
기능 시뮬레이터는 진리표와 제어 시퀀싱을 확립할 수 있습니다. 하지만 물리 칩의 최대 주파수, 아날로그 메타안정성 동작, 공정 및 환경 코너 전반의 타이밍을 증명하지는 않습니다.
데이터패스가 동작하면 이를 클록 구동 CPU 플래그 레지스터와 분기 디코더에 연결하세요. 이때 조합 계산이 지속적인 아키텍처 상태가 되어 프로그램 카운터를 리디렉션할 수 있습니다.



