수 체계, 데이터 표현과 논리회로
진법·보수·문자·실수 표현과 부울대수·조합·순서논리회로를 학습한다.
1. 정보 단위와 진법
- bit: 0 또는 1
- nibble: 4bit
- byte: 8bit
- word: CPU가 한 번에 처리하는 기본 비트 수
2진수는 3비트씩 묶으면 8진수, 4비트씩 묶으면 16진수로 쉽게 바꿀 수 있다. 10진 정수는 목표 진수로 반복 나누고 나머지를 역순으로 읽는다. 소수 부분은 목표 진수를 반복 곱해 정수 부분을 순서대로 읽는다.
2. 부호 있는 정수
n비트 2의 보수 정수 범위는 다음과 같다.
-2^(n-1) ~ 2^(n-1)-1
2의 보수는 비트를 반전한 뒤 1을 더한다. 덧셈 회로를 뺄셈에도 재사용할 수 있어 현대 컴퓨터의 대표 표현이다.
같은 부호의 두 수를 더했는데 결과 부호가 달라지면 오버플로를 의심한다. 최상위 비트의 자리올림만으로 부호 오버플로를 판단하면 안 된다.
3. 실수와 문자 표현
부동소수점은 부호, 지수, 가수(유효숫자)로 표현한다. 제한된 비트로 실수를 근사하므로 0.1처럼 정확히 표현되지 않는 값이 존재한다. 정규화, 지수 바이어스, 반올림 오차를 함께 이해해야 한다.
- ASCII: 대표적인 7비트 문자 코드
- Unicode: 전 세계 문자를 코드 포인트로 표현하는 표준. UTF-8·UTF-16·UTF-32는 인코딩 방식이다.
Unicode를 단순히 16비트·65,536문자로 한정해서는 안 된다.
4. 부울대수와 게이트
기본 연산은 AND, OR, NOT이며 XOR는 입력이 다를 때 1이다.
(A+B)' = A'B'
(AB)' = A'+B'
NAND와 NOR는 모든 논리함수를 구성할 수 있는 범용 게이트이다.
5. 조합논리회로
현재 출력이 현재 입력으로만 결정된다.
- 반가산기:
S=A⊕B,C=AB - 전가산기: 두 입력과 이전 자리올림을 더한다.
- 디코더: n비트 입력을 최대 2^n개 출력 중 하나로 변환
- 인코더: 여러 입력을 코드로 변환
- 멀티플렉서: 여러 입력 중 하나를 선택
- 디멀티플렉서: 하나의 입력을 선택된 출력으로 전달
6. 순서논리회로
현재 입력뿐 아니라 이전 상태의 영향을 받는다. 플립플롭, 레지스터, 카운터가 대표적이다.
- SR: Set·Reset, 금지 입력에 주의
- JK: SR의 금지 상태를 보완
- D: 입력 D를 저장
- T: 입력 조건에서 상태를 토글
7. 진법 변환과 소수 표현
10진수 45.625를 2진수로 바꾸면 정수부 45는 101101, 소수부는 다음처럼 구한다.
0.625×2 = 1.25 → 1
0.25 ×2 = 0.5 → 0
0.5 ×2 = 1.0 → 1
따라서 45.625₁₀ = 101101.101₂이다. 10진 유한소수가 2진에서도 항상 유한한 것은 아니다. 분모를 기약분수로 만들었을 때 2의 거듭제곱만 포함해야 2진 유한소수가 된다.
8. 2의 보수 덧셈과 오버플로
8비트에서 100 + 40을 계산하면 다음과 같다.
0110 0100 (100)
+ 0010 1000 (40)
= 1000 1100 (-116으로 해석)
양수 두 개를 더했는데 부호 비트가 1이 되었으므로 signed overflow다. 반면 unsigned 해석에서는 140으로 정상이다. 같은 비트 패턴도 자료형 해석에 따라 값과 오버플로 판단이 달라진다.
빼기 A-B는 A + (B의 2의 보수)로 수행할 수 있다. n비트 결과 바깥의 자리올림은 버리지만 signed overflow는 피연산자와 결과 부호 관계로 판단한다.
9. IEEE 754 단정도 해석
단정도는 부호 1비트, 지수 8비트(바이어스 127), 가수 23비트다. 정규수는 다음처럼 해석한다.
(-1)^sign × 1.fraction × 2^(exponent-127)
예를 들어 비트가 0 | 10000001 | 010000...이면 부호는 +, 실제 지수는 129-127=2, 유효숫자는 1.01₂=1.25이므로 값은 1.25×2²=5.0이다.
지수 필드가 모두 0이면 0 또는 비정규수, 모두 1이면 무한대 또는 NaN을 나타낸다. 부동소수점 비교에서 작은 반올림 오차를 고려해야 한다.
10. 부울식 간소화와 카르노 맵
F = AB + AB' = A(B+B') = A
F = A + A'B = A + B
카르노 맵에서는 1을 1,2,4,8…개 직사각형으로 묶고 가장 큰 묶음을 우선해 항을 줄인다. 행·열은 그레이 코드 순서라 가장자리도 서로 인접할 수 있다. don't-care 항은 간소화에 유리할 때만 포함한다.
11. 멀티플렉서로 논리함수 구현
2:1 MUX 출력은 다음과 같다.
Y = S'·I0 + S·I1
I0=0, I1=1이면 Y=S, I0=1, I1=0이면 Y=S'가 된다. 선택선에 변수 일부를 연결하고 데이터 입력에 0,1 또는 다른 변수를 넣으면 일반 논리함수를 구현할 수 있다.
12. 전가산기와 자리올림
Sum = A ⊕ B ⊕ Cin
Cout = AB + Cin(A ⊕ B)
여러 전가산기를 연결한 리플 캐리 가산기는 단순하지만 낮은 자리의 carry가 높은 자리까지 전파되어 지연이 커진다. carry lookahead는 생성·전파 신호를 이용해 지연을 줄인다.
13. 플립플롭·레지스터 타이밍
순서회로에서는 클록 에지 전 입력이 안정되어야 하는 setup time과 에지 후 유지되어야 하는 hold time이 중요하다. 위반하면 출력이 일정 시간 0과 1 사이에서 불안정한 metastability에 빠질 수 있다. 비동기 입력을 여러 플립플롭으로 동기화하는 이유다.
D 플립플롭은 유효 클록 에지에서 Q(next)=D, T 플립플롭은 T=1이면 토글하고 T=0이면 유지한다.
최종 확인 문제
- 10진수 13.375를 2진수로 변환하시오.
- 8비트 signed 2의 보수에서 90+50의 비트 결과와 signed overflow 여부를 쓰시오.
- IEEE 754 단정도
0 | 10000000 | 100000...의 값을 구하시오. - 부울식
XY + XY'를 간소화하시오. - T 플립플롭에서 현재 Q=0이고 연속 두 클록 동안 T=1이면 각 클록 후 Q 값을 쓰시오.