에듀테크 프로젝트 대시보드
논리 게이트와 가산기
트랜지스터 스위치 몇 개로 만든 AND·OR·XOR 게이트를 엮으면, CPU가 덧셈을 하는 가산기(Adder) 회로가 된다.
입력값을 눌러 바꿔 보면 각 게이트의 출력이 어떻게 달라지는지 볼 수 있다.
| 게이트 | 의미 | 기호식 | 현재 출력 |
|---|---|---|---|
| AND | 둘 다 1이면 1 | A · B | 0 |
| OR | 하나라도 1이면 1 | A + B | 0 |
| XOR | 서로 다르면 1 | A ⊕ B | 0 |
| NAND | AND의 반대 | (A · B)' | 1 |
| NOR | OR의 반대 | (A + B)' | 1 |
| NOT | A를 뒤집음 | A' | 1 |
NAND 하나만 있으면 다른 모든 게이트를 만들 수 있어서 "만능 게이트"라고 부른다.
한 자리 이진수 두 개를 더한다. 결과는 합(Sum)과 자리올림(Carry) 두 비트다.
1 + 1 = 10₂ 이므로 합은 0, 자리올림은 1이 된다.
| A | B | C | S |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 0 |
S = A ⊕ B (XOR), C = A · B (AND)
반가산기는 아랫자리에서 넘어온 자리올림을 받지 못한다. 입력을 세 개(A, B, 그리고 아랫자리 자리올림 Cin)로 늘린 것이 전가산기다. 반가산기 두 개와 OR 게이트 하나로 만든다.
S = A ⊕ B ⊕ Cin · Cout = (A · B) + (Cin · (A ⊕ B))
전가산기를 일렬로 연결하면 여러 자리 이진수를 더할 수 있다. 각 자리의 자리올림(Cout)이 바로 윗자리의 Cin으로 흘러 들어간다. 이 자리올림이 물결(ripple)처럼 오른쪽에서 왼쪽으로 한 칸씩 전파되기 때문에 "리플 캐리"라고 부른다.
def full_adder(a, b, cin):
s1 = a ^ b # 첫 번째 XOR
sum_ = s1 ^ cin # 두 번째 XOR → 합
cout = (a & b) | (cin & s1) # 자리올림
return sum_, cout
def ripple_add(A, B, n): # A, B: 비트 리스트 (LSB first)
carry, out = 0, []
for i in range(n):
s, carry = full_adder(A[i], B[i], carry)
out.append(s)
return out, carry # carry = 오버플로 비트
| 구성 요소 | 입력 | 출력 | 쓰임 |
|---|---|---|---|
| 논리 게이트 | 1~2 비트 | 1 비트 | 모든 디지털 회로의 기본 블록 |
| 반가산기 | A, B | S, C | 가장 낮은 자리 덧셈 |
| 전가산기 | A, B, Cin | S, Cout | 중간 자리 덧셈 |
| 리플 캐리 가산기 | n비트 × 2 | n비트 + 오버플로 | 정수 덧셈기 (ALU의 일부) |