1. 게이트는 입력 비트로 출력 비트를 정하는 규칙입니다
논리 게이트는 입력으로부터 출력 비트를 계산하는 기본 조합 회로 요소입니다. 여기서 다룰 게이트는 입력이 한두 개이고 저장된 상태가 없습니다. 이상적인 모델에서는 현재 입력에 따라 출력이 정해지며, 실제 게이트에서는 입력이 바뀐 뒤 전파 지연을 거쳐 출력이 바뀝니다.
먼저 네 가지 게이트의 논리 기능을 익힙니다.
| 게이트 | 출력이 1이 되는 조건 | 읽는 법 |
|---|---|---|
| NOT | 입력이 0일 때 | 반전 |
| AND | 두 입력이 모두 1일 때 | 둘 다 |
| OR | 두 입력 가운데 하나라도 1일 때 | 하나라도 |
| XOR | 두 입력이 서로 다를 때 | 다르면 |
아래 실험에서 a와 b를 눌러 0과 1을 바꾸고, 출력 y가 1이 되는 조합을 찾아 보세요. 표에서
현재 입력에 해당하는 행이 함께 표시됩니다.
개념 실험 · and
컴파일한 설계가 아니라 브라우저 안의 회로 모델입니다. 실제 도구 체인은 예제에서 실행됩니다.
입력
출력
- y
- 0
| a | b | y | 현재 입력 |
|---|---|---|---|
| 0 | 0 | 0 | ◂ 현재 입력 |
| 0 | 1 | 0 | |
| 1 | 0 | 0 | |
| 1 | 1 | 1 |
2. 진리표는 규칙을 빠짐없이 적은 표입니다
진리표는 가능한 입력 조합을 모두 한 행씩 나열하고, 각 행에 출력을 적은 표입니다. 입력이 n개이면 행은 2^n개입니다. 입력 두 개는 네 행, 입력 세 개는 여덟 행입니다.
진리표는 조합 회로에서 각 이진 입력 조합에 대한 안정된 출력값을 서술합니다. 같은 진리표를 가진 두 회로는 같은 입력에 같은 논리값을 출력하지만, 지연 시간·면적·소비 전력까지 같은 것은 아닙니다.
XOR의 진리표를 직접 만들어 보세요. 네 조합을 모두 눌러 y를 확인하고, 1이 나오는 행이 두
개라는 사실을 표에서 확인합니다.
개념 실험 · xor
컴파일한 설계가 아니라 브라우저 안의 회로 모델입니다. 실제 도구 체인은 예제에서 실행됩니다.
입력
출력
- y
- 0
| a | b | y | 현재 입력 |
|---|---|---|---|
| 0 | 0 | 0 | ◂ 현재 입력 |
| 0 | 1 | 1 | |
| 1 | 0 | 1 | |
| 1 | 1 | 0 |
확인 문제
a = 1, b = 0일 때 a XOR b의 값은 무엇입니까?
확인 문제
입력이 세 개인 회로의 진리표는 몇 행입니까?
3. 조건을 논리식으로 씁니다
회로의 요구사항은 보통 말로 주어집니다. 말로 된 조건에서 어느 게이트를 쓸지 고르는 기준은 다음과 같습니다.
| 조건의 표현 | 게이트 |
|---|---|
| ~이고 ~일 때 | AND |
| ~이거나 ~일 때 | OR |
| ~가 아닐 때 | NOT |
| 둘이 서로 다를 때 | XOR |
| 둘이 같을 때 | XNOR (XOR의 반전) |
| 둘 다 0일 때 | NOR (OR의 반전) |
예를 들어 경보 회로의 요구사항이 "문이 열려 있고(door = 1) 경비가 켜져 있으면(armed = 1)
경보를 울린다"라면 식은 alarm = door AND armed입니다. 두 조건이 모두 1이어야 하므로 AND를
고릅니다. "문이 열려 있거나 창문이 열려 있으면"이라면 OR입니다.
주의. 식을 세운 뒤에는 진리표의 네 행을 모두 확인합니다. 요구사항이 말하지 않은 조합, 예를 들어 "문은 닫혔는데 경비만 켜진 경우"에도 식이 의도한 값을 내는지 보아야 합니다.
확인 문제
두 입력이 같을 때만 1을 내야 합니다. 어느 연산을 고르겠습니까?
확인 문제
NAND는 AND의 출력을 반전한 게이트입니다. a = 1, b = 1일 때 a NAND b는 무엇입니까?
4. 변형: 입력이 세 개인 다수결
입력이 세 개인 회로도 같은 방법으로 읽습니다. 아래 전가산기의 cout는 세 입력 a, b,
cin 가운데 둘 이상이 1일 때 1이 되는 다수결 출력입니다. 여덟 행을 모두 눌러 cout가 1인
행을 세어 보세요. sum은 다음 단원에서 다룹니다.
개념 실험 · full-adder
컴파일한 설계가 아니라 브라우저 안의 회로 모델입니다. 실제 도구 체인은 예제에서 실행됩니다.
입력
출력
- sum
- 0
- cout
- 0
| a | b | cin | sum | cout | 현재 입력 |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | ◂ 현재 입력 |
| 0 | 0 | 1 | 1 | 0 | |
| 0 | 1 | 0 | 1 | 0 | |
| 0 | 1 | 1 | 0 | 1 | |
| 1 | 0 | 0 | 1 | 0 | |
| 1 | 0 | 1 | 0 | 1 | |
| 1 | 1 | 0 | 0 | 1 | |
| 1 | 1 | 1 | 1 | 1 |
확인 문제
세 입력 가운데 둘 이상이 1인 조합은 모두 몇 가지입니까?
5. 각 언어에서 쓰는 기호
세 언어는 같은 게이트를 다른 기호로 씁니다. 지금 외울 필요는 없고, 각 언어 과정에서 다시 설명합니다.
| 게이트 | Verilog | BSV | Chisel |
|---|---|---|---|
| NOT | ~a (비트), !a (논리) | ~a (Bit), !a (Bool) | ~a (UInt), !a (Bool) |
| AND | a & b, a && b | a & b, a && b | a & b, a && b |
| OR | a | b, a || b | a | b, a || b | a | b, a || b |
| XOR | a ^ b | a ^ b | a ^ b |
참고. 비트 연산자와 논리 연산자의 차이는 뒤의 장에서 설명합니다. 값이 확정된 한 비트에 대해서는 대응하는 연산의 논리값이 같지만, 사용할 수 있는 피연산자 타입과 결과 타입은 언어마다 다릅니다.
6. 정리
- 게이트는 기억하지 않습니다. 출력은 현재 입력만으로 정해집니다.
- 진리표는 이진 입력 조합마다 한 행을 두며, 안정된 논리값의 관계를 서술합니다. 물리적 지연까지 나타내지는 않습니다.
- 말로 된 조건은 "이고"는 AND, "이거나"는 OR, "~가 아닐 때"는 NOT, "다르면"은 XOR로 옮깁니다.
- 식을 세운 뒤 진리표의 모든 행을 확인합니다.
다음 장에서는 게이트를 여러 개 이어 비트를 고르고 더하는 조합 회로를 만듭니다.