backend/computer science

Nand2tetris: 01. boolean functions and gate logic

seul chan 2021. 4. 5. 09:06

image

1.1 boolean logic

불 대수: true/false, yes/no, on/off, 1/0 같은 2진수(bool) 값을 다루는 대수학.

bool function: 2진수를 입력받아 2진수를 출력하는 함수

컴퓨터는 2진수를 표현하고 처리하는 하드웨어이기 때문에 불 함수는 하드웨어 아키텍처의 중심.

Boolean Operation

  • AND, OR, NOT

Boolean expression

NOT(0 OR (1 AND 1)) =
NOT(0 OR 1) =
NOT(1) =
0

general expression을 만들 수 있음

f(x, y, z) = (x AND y) OR (NOT(x) AND z)

이 함수가 어떤 함수인지 알기 위해서는

  • 모든 x, y, z을 truth table로 만들어보면 된다.

1.2 Boolean Functions Synthesis

Boolean Identities

특정 boolean expression이 같은지 확인

commutative laws (교환법칙)

  • (x AND y) = (y AND x)
  • (x OR y) = (y OR x)

Associative laws (결합법칙)

  • (x AND (y AND z)) = ((x AND y) AND z)
  • (x OR (y OR z)) = ((x OR y) OR z)

Distributive laws (분배법칙)

  • (x AND (y OR z)) = (x AND y) OR (x AND z)
  • (x OR (y AND z)) = (x OR y) AND (x OR z)

De Morgan laws (드모르간법칙)

  • NOT(x AND y) = NOT(x) OR NOT(y)
  • NOT(x OR y) = NOT(x) AND NOT(y)

이를 활용해서 boolean algebra를 풀 수 있음

NOT(NOT(x) AND NOT(x OR y)) =
# de morgan laws
NOT(NOT(x) AND (NOT(x) AND NOT(y))) = 
# associative laws
NOT((NOT(x) AND NOT(x)) AND NOT(y)) =
# idempotence laws (x AND x = x)
NOT(NOT(x) AND NOT(y)) =
# de morgan laws
NOT(NOT(x)) OR NOT(NOT(y)) =
x OR y

위 문제는 truth table을 만들어서도 풀 수 있다.

Truth table to boolean function

우선 모든 1을 AND boolean expression으로 표현

해당 express들을 OR로 묶음

-> 모든 boolean function은 AND, OR, NOT operation만 사용한 expression으로 표현 가능

-> 정말 세가지가 다 필요할까? AND, NOT만으로도 가능하다.

(x OR y) = NOT(NOT(x) AND NOT(y)

-> NAND function

x NAND y = NOT(x AND y) -> NOT(x) OR NOT(y)

| x | y | NAND |
| 0 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |

-> NAND operation만 사용해서 모든 boolean function을 표현할 수 있다.

1. NOT(x) = (x NAND x)

NOT(x AND x) = NOT(x) OR NOT(x) = NOT(x)

2. (x AND y) = NOT(x NAND y)

NOT(x NAND y) = NOT(NOT(x AND y)) = NOT(NOT(x) OR NOT(y)) = x AND y
(x NAND y) NAND (x NAND y) = (NOT(x) OR NOT(y)) NAND (NOT(x) OR NOT(y))
= NOT(NOT(x) OR NOT(y)) OR NOT(NOT(x) OR NOT(y))
= (x AND y) OR (x AND y)
= x AND y

3. (x OR y) = NOT(x) NAND NOT(y)

(x NAND x) NAND (y NAND y)

NOT(x) NAND NOT(y) = NOT(NOT(x) AND NOT(y)) = x OR y

1.3. Logic Gates

Gate Logic

  • logic gates를 통해 boolean function을 구현하는 테크닉
  • Logic gates란?
    • Nand, And, Or, Not같은 기본 게이트
    • Mux, Adder같은 composite 게이트

elementary logic gates

Nand

  • gate diagram: (사진)

  • functional specification:

if (a==1 and b==1) then out=0 else out=1
  • truth table

| x | y | NAND |
| 0 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |

And, Or, Not

And

if (a==1 and b==1) then out=1 else out=0

Or

if (a==1 or b==1) then out=1 else 0

Not

if (in==0) then out=1 else 0

Composite gates

여러개의 elementary logic gates를 조합하여 만든 게이트.

아래 게이트는 3개의 input을 받아서 1개의 output을 반환. 두개의 and gate로 만들 수 있다.

if (a==1 and b==1 and c==1) then out=1 else 0

Gate Interface / Gate Implementation

Interface answer the question, what.

Implementation answer how the chip is doing.

Interface의 기능을 설명하는 방법은 딱 하나임.
Only one unique way to describe the function.

구현하는 방법은 여러가지.

One obstruction, many different implementations.

Circuit implementatinos

1.4. Hardware Description Language

Design: from requirements to interface

Requirement: truth table & diagram

이를 바탕으로 HDL을 작성 가능

NAND gate로부터 시작할 수 있지만, And, Or, Not gate를 만들었다고 가정하고 시작.

Xor

| a | b | out |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |

General idea를 생각해내기

out=1 when
a AND NOT(b)
OR 
NOT(a) AND b

design diagrams

(Xor diagram 추가)

HDL은 단순히 diagram의 description

  • 각 칩의 in, out을 명시적으로 적고
  • 이를 적어줌
/** Xor gate: out = (a Aand Not(b)) Or (Not(a) And b)) */

CHIP Xor {
  IN a, b;
  OUT out;

  PARTS:
  NOT(in=a, out=nota)
  NOT(in=b, out=notb)
  AND(a=a, b=notb, out=aAndNotb)
  AND(a=b, b=nota, out=notaAndb)
  OR(a=aAndNotb, b=notaAndb, out=out)
}
  • HDL: functional / declarative language
  • The order of HDL statement is insignificant -> but typically left to right
  • Interface
    Not(in= , out=), And(a=, b=) ...

1.5 Hardware Simulation

It's hard to know HDL program is right.

Simulation program을 사용해서 검증 가능.

1.6. Multi-bit Buses

  • sometimes we manipulate "together" an array of bits
  • 이 그룹을 하나의 entity로 그룹지어 생각하는게 편하다: "bus"라는 용어
  • HDL은 이 buses를 다루는 notation들을 제공함

예시)

Addition of two 16-bit integer

CHIP Add16 {
    IN a[16], b[16];
    OUT out[16];

    PARTS:
}

세개의 16-bit value를 더하는 hdl.

위에서 만든 Add16을 사용하여 temp를 만들고 이를 out시킬 수 있음

CHIP Add3Way16 {
    IN first[16], second[16], [third[16];
    OUT out[16];

    PARTS:
        Add16(a=first, b=second, out=temp);
        Add16(a=temp, b=third, out=out);
}

4개의 16-bit를 더하는 hdl.

4개의 모든 bits를 input으로 함께 받을 수 있따.

이런 방식을 Multi-way chips라고 부름

CHIP AND4Way {
    IN a[4];
    OUT out;

    PARTS:
        AND(a=a[0], b=a[1], out=t01);
        AND(a=t01, b=a[2], out=t02);
        AND(a=t02, b=a[3], out=out);
}

다른 예시)

...
IN lsb[8], msb[8], ...
...
Add16(a[0..7]=asb, a[8..15]=msb ...);

요부분은 문서 한번 읽어봐야될듯..

1.7 Project 1 overview

신이 내리신(?) Nand 게이트만을 이용해서 15개의 게이트 만들 예정

Elementary logic gates

  • Not
  • And
  • Or
  • Xor
  • Mux
  • DMux

16-bit variants

  • Not16
  • And16
  • Or16
  • Mux16

Multi-way variants

  • Or8Way
  • Mux4Way16
  • Mux8Way16
  • DMux4Way
  • DMux8Way

위에서 익숙하지 않은 것들 정리

Multiplexor

3개의 input이 옴. a, b, sel

if(sel==0)
  out=a
else
  out=b
  • truth table은 a,b,sel 8가지 / sel 자체의 truth table
  • selecting, outputting 두 가지를 가능하게 함

예시) using mux logic to build a programmable gate

AndMuxOr

if (sel==0)
  out = (a And b)
else
  out = (a Or b)
CHIP AndMuxOr {
    IN a, b, sel;
    OUT out;

    PARTS:
    And (a=a, b=b, out=aAndb);
    Or (a=a, b=b, out=aOrb);
    Mux (a=aAndb, b=aOrb, sel=sel, out=out);
}

Multiplexer implementation

tip: And, Or, Not만 가지고 만들 수 있음

Demultiplexor

Multiplexor의 반대. distributor라고 생각하면 됨.

if (sel==0)
  {a,b}={in,0}
else
  {a,b}={0,in}

예시) Multiplexing / demultiplexing in communication networks

And16

16bit variants 중 하나

16bit의 intput을 받음

ex)

  a = 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 0
  b = 0 0 1 0 1 1 0 1 0 0 1 0 1 0 1 0
out = 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0
CHIP And16 {
  IN a[16], b[16];
  OUT out[16];
  ...
}

Mux4Way16

4 16bit intput, 2 bit sel

Project 1

Given: Nand

Goal: Build 15 gates


project 1

Mux

(a And Not(sel))
Nand
(b And sel)

Not((a And Not(sel)) and (b And sel))