오늘 끝나면
여러 비트 덧셈·뺄셈
- ✓여러 비트 덧셈·뺄셈의 핵심 문제를 한 문장으로 설명한다
- ✓오른쪽 실습에서 여러이 어떻게 움직이는지 관찰한다
- ✓다음 강의와 이어지는 한계를 말할 수 있다
실습 미션
자리올림 전파·2의 보수·오버플로우 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.
성공 조건
- □실습의 기본값을 먼저 관찰
- □입력값이나 모드를 한 번 이상 바꿔 결과 비교
- □왜 결과가 바뀌었는지 한 문장으로 설명
반도체 설계 · 07
여러 비트
덧셈·뺄셈
전가산기 하나는 한 자리만 더한다.
줄줄이 이어 자리올림을 옆으로 넘기면 여러 비트가 더해진다.
뺄셈은 따로 만들지 않는다. 2의 보수를 더하면 된다.
전가산기를 줄줄이 잇는다
전가산기 하나는 A·B·carry-in 세 비트를 받아 Sum 한 비트와 carry-out 한 비트를 낸다. 딱 한 자리만 처리한다.
여러 비트를 더하려면 전가산기를 자리 수만큼 깐다.
그리고 한 칸의 carry-out을 옆 칸의 carry-in으로 꽂는다.
이렇게 자리올림이 물 흐르듯 옆으로 넘어가서 리플 캐리(ripple = 잔물결) 가산기라 부른다.
맨 오른쪽(LSB) 칸의 carry-in은 보통 0이다.
맨 왼쪽(MSB) 칸의 carry-out이 자리 넘침(올림) 여부를 알려준다.
기본 머신은 16비트라 전가산기 16개를 같은 방식으로 잇는다.
2의 보수로 음수를 만든다
뺄셈 회로를 따로 만들지 않는다. 음수를 더하면 그게 곧 뺄셈이다.
음수를 표현하는 약속이 2의 보수다.
모든 비트를 반전하고(1의 보수) 1을 더하면 그 수의 음수가 된다.
예로 4비트에서 0011(3)을 반전하면 1100, +1 하면 1101, 즉 −3이다.
이 약속의 좋은 점은 더하기 회로를 그대로 쓴다는 것이다.
맨 위 비트(MSB)가 1이면 음수로 읽는다. 4비트는 −8부터 7까지, 16비트는 −32768부터 32767까지 범위다.
0은 표현이 하나뿐이라 깔끔하다.
0000=0 · 0111=7 · 1000=−8 · 1111=−1
MSB가 1이면 음수 · 0은 하나뿐
뺄셈 = 보수를 더하기
A − B는 A + (B의 2의 보수)와 같다.
B의 2의 보수는 ‘B 반전 + 1’이다.
그 +1은 가산기 맨 오른쪽 칸의 carry-in에 1을 넣어 더한다.
그래서 뺄셈은 B를 반전하고 시작 carry를 1로 두기만 하면 된다.
여기서 carry와 borrow가 갈린다.
무부호 뺄셈에서 결과의 carry-out이 1이면 빌림이 없고, 0이면 빌림이 발생한다(B가 더 크다). borrow는 carry를 뒤집어 읽은 것뿐이다.
ADD 회로 한 종류에 반전기와 모드 스위치만 붙이면 더하기와 빼기를 다 처리한다.
| 항 | 비트 | 설명 |
|---|---|---|
| A | 0111 | 7 |
| ¬B | 1010 | B=0101 반전 |
| Cin | +1 | 시작 carry |
| = | 0010 | 결과 2 · Cout 1이면 빌림 없음 |
직접 자리올림을 흘려 본다
A·B를 정하고 결과를 먼저 예측한 뒤 carry를 한 칸씩 흘려본다.
STEP은 bit0부터 한 자리씩 확정한다. carry가 옆 칸으로 넘어간다.
모드를 A − B로 바꾸면 B가 반전되고 시작 carry가 1이 된다.
더할 때 자리가 넘치면 CARRY, 뺄 때 빌리면 BORROW, 부호가 깨지면 OVERFLOW 깃발이 켜진다.
| bit | Cin | A | B | Sum | Cout |
|---|---|---|---|---|---|
| 0 | · | · | · | · | · |
| 1 | · | · | · | · | · |
| 2 | · | · | · | · | · |
| 3 | · | · | · | · | · |
carry가 bit0에서 bit3로 한 칸씩 흐른다. 이 전파 시간이 가산기 속도의 한계다.
부호 오버플로우와 전파 지연
두 가지 한계를 알아야 한다. 결과가 틀리는 경우인 오버플로우와, 느려지는 이유인 전파 지연이다.
부호 오버플로우는 결과가 부호 범위를 벗어났을 때 생긴다.
같은 부호 둘을 더했는데 부호가 뒤집히면 오버플로우다. 예로 4비트에서 7+1=1000은 −8로 읽혀 틀린다.
판정은 간단하다. MSB로 들어간 carry와 MSB에서 나온 carry가 다르면 오버플로우다.
그리고 carry가 bit0에서 MSB로 한 칸씩 가야 하므로, 비트가 많을수록 전파에 시간이 더 걸린다.
이 전파 지연이 리플 가산기의 속도 한계다. 그래서 빠른 칩은 carry를 미리 계산하는 carry-lookahead를 쓴다.
속도를 높이려면 면적이 늘어난다. 둘 사이의 트레이드오프가 ALU 설계의 핵심이다.
Q. 2의 보수 체계에서 A − B는 어떻게 계산하나?
정답은 빼는 수 B의 2의 보수를 더한다이다.B의 모든 비트를 반전하고 1을 더한 게 −B의 표현이다.
그 +1은 가산기 맨 오른쪽 carry-in에 1을 넣어 처리한다. 그래서 더하기 회로 하나로 뺄셈까지 된다.
| 0111 | 7 |
| + 0001 | 1 |
| 1000 | −8 (틀림!) |
둘이 다르면 OVERFLOW
carry: bit0 ▸ bit1 ▸ bit2 ▸ bit3 ... 줄이 길수록 느림
속도 한계는 carry-lookahead로 해결