목차15개 항목
출처와 참고
「이진 가산기」 절의 리플 캐리 지연과 캐리 예측 가산기는 CrashCourse의 「Crash Course Computer Science」 강의를 바탕으로 보강했다. 가산기 확장(종속 연결, 2단계 캐리 예측)은 고려사이버대학교 「디지털논리설계」(2024-2학기), 논리 연산의 응용과 캐리 포함 시프트는 고려사이버대학교 「컴퓨터구조」(2024-1학기) 강의 내용으로 보강했다.
레지스터는 CPU가 요청을 처리하는 데 필요한 데이터를 일시적으로 저장하는 기억 장치로, 여러 개의 플립플롭으로 이루어진다. 컴퓨터의 동작은 결국 레지스터 사이에서 데이터를 옮기고 가공하는 작은 연산들의 연속이다.
마이크로 연산과 레지스터 전송 언어
- 마이크로 연산(micro-operation): 클럭 펄스 한 번 동안 레지스터에 저장된 데이터에 대해 실행되는 기본 동작. 예: 다른 레지스터로 전송, 시프트, 로드, 클리어, 증가
- 레지스터 전송 언어(RTL): 마이크로 연산을 간단한 기호로 표현한 것. 컴퓨터 내부의 데이터 처리 흐름을 상세히 나타낼 수 있다.
표기 규칙
- 레지스터 이름은 대문자로 쓴다:
MAR,PC,IR,AC,DR… - 가장 왼쪽 플립플롭이 MSB(Most Significant Bit), 가장 오른쪽이 LSB(Least Significant Bit)
- 16비트 레지스터는 보통 8비트씩 나눠 상위(8
15)를7)를PC(H), 하위(0PC(L)로 부른다.
레지스터 전송
R2 ← R1 R1의 데이터를 R2로 옮김(치환 연산자 ←)
P: R2 ← R1 제어 함수 P가 1일 때만 전송 (if (P = 1) then R2 ← R1)
T: R2 ← R1, R1 ← R2 T가 1이면 두 레지스터의 값을 동시에 교환제어 조건이 성립한 시점이 t라면, 실제로 R2에 값이 들어가는 것은 다음 클럭(t + 1) 이다. 쉼표로 나열한 마이크로 연산은 같은 클럭에 동시에 실행된다.
버스와 메모리 전송
버스는 레지스터-레지스터, 레지스터-메모리, 메모리-I/O 사이에서 데이터를 묶음으로 주고받는 공용 통로다. 여러 장치가 하나의 버스를 공유하므로 한 번에 하나의 신호만 실어야 하고, 동시에 실으면 충돌한다.
BUS ← C, R1 ← BUS (= R1 ← C)멀티플렉서로 만든 버스
4비트 레지스터 4개를 공통 버스로 잇는다면, 4×1 멀티플렉서 4개를 쓴다. 각 레지스터의 같은 위치 비트들이 하나의 멀티플렉서에 모여 버스 한 가닥이 되고, 선택 입력 S1, S0이 어느 레지스터를 버스에 올릴지 정한다. 레지스터 비트 수만큼 멀티플렉서가 필요해 비효율적이다.
3-상태 버퍼 (Three-State Buffer)
출력이 0, 1 외에 고저항(high-impedance) 상태를 가질 수 있는 버퍼다.
- 제어 입력이 활성화되면 일반 입력을 그대로 출력한다.
- 제어 입력이 꺼지면 고저항 상태가 되어 출력이 회로에서 끊긴 것처럼 된다.
여러 버퍼의 출력을 한 선에 묶고 하나만 활성화하면, 멀티플렉서 대신 간단하게 버스를 구성할 수 있다.
메모리 전송
메모리 워드 M, 주소 레지스터 AR, 데이터 레지스터 DR을 쓴다.
Read: DR ← M[AR] AR이 가리키는 메모리 워드를 DR로 읽어 옴
Write: M[AR] ← R1 R1의 값을 AR이 가리키는 메모리 워드에 씀마이크로 연산의 종류
| 종류 | 대상 | 예 |
|---|---|---|
| 레지스터 전송 | 레지스터 간 데이터 이동 | R2 ← R1 |
| 산술 | 수치 데이터 | 덧셈, 뺄셈, 증가, 감소 |
| 논리 | 비수치 데이터(비트 조작) | AND, OR, XOR, 보수 |
| 시프트 | 수치·비수치 모두 | 왼쪽·오른쪽 시프트 |
산술 마이크로 연산
R3 ← R1 + R2 덧셈
R3 ← R1 + R2' + 1 뺄셈 (R2의 2의 보수를 더함)
R2 ← R2' 1의 보수
R2 ← R2' + 1 2의 보수 (부호 반전)
R1 ← R1 + 1 증가
R1 ← R1 - 1 감소산술 연산은 덧셈이 기본이다. 뺄셈은 2의 보수를 더하는 방식으로 처리한다(데이터의 표현). R1 - 1은 "1을 빼는" 회로가 따로 있다기보다 1 감소시키는 연산이다.
이진 가산기
전가산기(디지털 논리 회로)를 직렬로 이어, 앞 단의 캐리 출력이 다음 단의 캐리 입력이 되게 한다. 4비트 레지스터 A(A0A3)와 B(B0B3)를 더하면 캐리 C0~C4가 차례로 전달된다.
부호 있는 수의 덧셈에서 마지막 두 캐리(C3, C4)가 같으면 정상이고, 다르면 오버플로우다.
캐리가 아랫자리에서 윗자리로 물결처럼 차례로 전달되므로 이 구조를 리플 캐리 가산기(ripple carry adder)라 한다. 맨 아랫자리는 들어오는 캐리가 없어 반가산기로도 충분하다. 회로가 단순한 대신 윗자리 전가산기는 아랫자리 캐리가 다 정해질 때까지 기다려야 해서, 지연이 비트 수에 비례해 늘어난다. 한 단의 지연은 아주 짧지만, 64비트 덧셈을 한 클럭 안에 끝내야 하는 고속 CPU에서는 무시할 수 없다.
그래서 실제 CPU는 캐리 예측 가산기(carry-lookahead adder)처럼 캐리를 미리 계산하는 구조를 쓴다. 자리마다 「이 자리에서 캐리가 생기는가」(생성 G = A·B)와 「아래 캐리를 위로 넘기는가」(전파 P = A ⊕ B)를 동시에 구하고, 이 둘로 모든 자리의 캐리를 병렬로 계산한다. 게이트는 더 들지만 결과는 같고 훨씬 빠르다.
C1 = G0 + P0·C0
C2 = G1 + P1·G0 + P1·P0·C0 ← 앞 캐리를 기다리지 않고 입력만으로 계산
C4 = G3 + P3·G2 + P3·P2·G1 + P3·P2·P1·G0 + P3·P2·P1·P0·C0모든 캐리가 AND-OR 두 단계의 SOP 식이라, 몇 번째 자리든 지연 시간이 같다. 대신 자리가 늘수록 항이 길어져 4비트 단위로 묶는다. 74283(7483)이 캐리 예측 회로를 내장한 4비트 가산기 IC다. 더 넓은 가산기를 만드는 방법은 두 가지다.
| 확장 방법 | 구성 | 맞바꾸는 것 |
|---|---|---|
| 종속 연결(cascading) | 4비트 가산기의 출력 캐리를 다음 4비트 가산기의 입력 캐리로 잇는다 | 추가 회로가 없지만 블록 사이에서는 리플 캐리처럼 앞 블록을 기다린다 |
| 2단계 캐리 예측 | 4비트 블록마다 그룹 전파 PG = P3·P2·P1·P0, 그룹 생성 GG = G3 + P3·G2 + P3·P2·G1 + P3·P2·P1·G0를 내고, 캐리 예측기 하나가 블록 사이 캐리(C4, C8, C12, C16)를 한꺼번에 구한다 | 4비트 CLA 4개 + 예측기 1개로 16비트를 만든다. 회로가 더 들지만 블록 사이 대기도 없앤다 |
이진 감가산기
전가산기 각각의 B 입력 앞에 XOR 게이트를 두고, XOR의 한쪽 입력과 첫 캐리 입력 C0를 모드 신호 M에 공통으로 연결한다.
| M | XOR 출력 | C0 | 결과 |
|---|---|---|---|
| 0 | B 그대로 | 0 | A + B (덧셈) |
| 1 | B' (B의 1의 보수) | 1 | A + B' + 1 = A − B (뺄셈) |
겉보기에는 덧셈기와 뺄셈기가 함께 있는 것 같지만, 실제로는 덧셈 회로 하나로 둘 다 처리한다.
산술 회로
감가산기를 확장해, 가산기의 입력을 제어하는 것만으로 여러 산술 마이크로 연산을 하나의 회로로 구현한다. 4비트 산술 회로라면 제어 입력 S1, S0, Cin 세 개로 8가지 연산(덧셈, 캐리 포함 덧셈, 뺄셈, 증가, 감소, 전송 등)을 고른다.
논리 마이크로 연산
두 변수에 대한 논리 함수는 모두 16가지(F0~F15)지만, 하드웨어로는 AND, OR, XOR, 보수(NOT) 네 가지 게이트와 멀티플렉서로 모두 만들 수 있다. 입력 비트를 모든 게이트에 통과시키고 선택 신호로 MUX가 그중 하나를 고르는 1비트 모듈을 비트 수만큼 나란히 두면 N비트 논리 연산 장치가 된다. 산술 연산보다 회로가 단순하다.
논리 연산의 쓸모는 레지스터 A의 일부 비트만 골라 조작하는 데 있다. 레지스터 B에 고를 위치를 표시한 패턴(마스크)을 넣고 연산을 고른다.
| 응용 | 연산 | 효과 | 예 (A = 10010101, B = 00001111) |
|---|---|---|---|
| 선택적 세트 | A ← A OR B | B가 1인 자리를 1로 | 10011111 |
| 선택적 보수 | A ← A XOR B | B가 1인 자리를 뒤집음 | 10011010 |
| 마스크(선택적 클리어) | A ← A AND B | B가 0인 자리를 0으로 | 00000101 |
| 삽입 | AND로 자리를 비운 뒤 OR로 새 비트를 넣음 | 지정한 자리에 새 값 | 하위 4비트만 남기고(00000101) 1110 0000을 OR → 11100101 |
| 비교 | A ← A XOR B | 같은 자리는 0, 다른 자리는 1. 결과가 모두 0이면 Z 플래그가 1 | - |
C의 비트 연산(x | mask, x ^ mask, x & mask)이 그대로 이 표다.
시프트 마이크로 연산
| 종류 | 동작 |
|---|---|
| 논리 시프트 (shl, shr) | 비트를 한쪽으로 밀고, 비는 자리에 0을 채움 |
| 순환 시프트 (cil, cir) | 밀려 나간 비트가 반대쪽 끝으로 다시 들어옴 |
| 산술 시프트 (ashl, ashr) | 부호 비트를 유지하며 나머지 비트만 시프트 |
| 캐리 포함 시프트·순환 (SHLC·SHRC, RLC·RRC) | C 플래그를 레지스터 끝에 한 비트 더 붙인 것처럼 시프트·순환한다. 밀려난 비트가 C로 가고 C의 값이 반대쪽으로 들어와, 여러 워드에 걸친 긴 수를 이어서 시프트할 때 쓴다 |
시프트를 데이터 비트 수만큼 연속으로 하면 두 레지스터 사이에서 선 하나로 전체 데이터를 옮길 수 있다(직렬 전송). 시프트 레지스터 회로와 직렬·병렬 변환은 디지털 논리 회로와 부품에 있다.
산술 시프트는 부호 있는 수의 곱셈·나눗셈에 쓴다. 양수는 양수로, 음수는 음수로 유지된다.
산술 왼쪽 시프트 = × 2 : 0000000010 → 0000000100
산술 오른쪽 시프트 = ÷ 2 : 0000000010 → 0000000001왼쪽 시프트 결과 부호 비트가 바뀌면 오버플로우다.
핵심 정리
- RTL은 마이크로 연산을
제어 조건: 목적 ← 출발꼴로 표현하고, 전송은 다음 클럭에 완료된다. - 버스는 멀티플렉서나 3-상태 버퍼로 구성하며, 한 번에 하나의 값만 실을 수 있다.
- 산술 연산은 모두 덧셈 회로로 처리하며, XOR + 모드 신호 M으로 덧셈·뺄셈을 전환한다.
- 리플 캐리 가산기는 캐리 전달 지연이 비트 수에 비례하므로, 고속 CPU는 캐리를 병렬로 구하는 캐리 예측 가산기를 쓴다.
- 캐리 예측 가산기는 4비트 단위로 묶고, 블록 사이는 종속 연결하거나 그룹 PG·GG로 한 번 더 예측한다.
- 논리 연산은 마스크와 함께 비트를 골라 세트(OR)·보수(XOR)·클리어(AND)·삽입·비교하는 데 쓴다.
- 시프트는 논리·순환·산술 세 가지이고, 산술 시프트는 부호를 유지한다.
관련 노트: 디지털 논리 회로와 부품, 컴퓨터 산술 연산, 기본 컴퓨터의 구조와 설계