Project 1. Elementary logic gates implement

Project1: Logic gates implemention

image

프로젝트에서 제공 하는 NAND 게이트로 나머지를 구현하세요.

제출

작업 결과는 빌드해야 하는 15개 칩의 HDL 코드가 포함된 텍스트 파일 세트가 될 것입니다. 15개의 칩을 모두 빌드하는 데 성공하면 좋습니다. 일부 칩만 빌드하는 데 성공한 경우에도 일부만 제출하여 부분 점수를 받을 수 있습니다.

적절한 테스트와 피드백을 받으려면 제출하는 HDL 파일 이름은 컴퓨터의 nand2tetris/projects/01 폴더에 표시되는 파일 이름과 정확히 일치해야 합니다. 대소문자를 구분해야 합니다. 대소문자를 구분하지 않은 파일 이름은 테스트 및 채점 절차에서 불합격 처리될 수 있습니다(정확한 이름은 And.hdl이어야 합니다). 파일을 만들거나 이름을 지정하지 않고도 이 모든 번거로움을 덜 수 있습니다. 텍스트 편집기를 사용하여 nand2tetris/projects/01 폴더에 있는 *.hdl 파일을 편집하고 그 안에 HDL 코드를 작성한 다음 주어진 이름으로 저장하면 됩니다.

작성한 모든 *.hdl 파일을 프로젝트1.zip이라는 이름의 zip 파일로 압축한 후(폴더 안에 넣지 말고 파일 자체만 압축) 제출해야 합니다. 코스에서 지정하지 않은 도우미 칩을 빌드하는 경우 해당 도우미 칩을 zip 파일에 포함해야 합니다. 제출 횟수는 무제한이며 성적은 모든 제출물의 최대치가 되므로 다시 제출해도 점수를 잃지 않습니다.

감사관으로 코스를 수강하는 경우 설명된 테스트를 사용하여 자신의 작업을 직접 확인할 수 있습니다.

\

Table of Contents

\

Elementary Logic Gates

NOT

CHIP Not {
  IN in;
  OUT out;

  PARTS:
  Nand(a=in, b=in, out=out);
  }

AND

CHIP And {
  IN a, b;
  OUT out;

  PARTS:
  Nand(a=a, b=b, out=tmp);
  Not(in=tmp, out=out);
}

OR

  CHIP Or {
      IN a, b;
      OUT out;

      PARTS:
      Not(in=a, out=aNot);
      Not(in=b, out=bNot);
      Nand(a=aNot, b=bNot, out=out);
  }

XOR

  CHIP Xor {
      IN a, b;
      OUT out;

      PARTS:
      Not(in=a, out=notA);
      Not(in=b, out=notB);
      Nand(a=a, b=notB, out=temp1);
      Nand(a=b, b=notA, out=temp2);
      Nand(a=temp1, b=temp2, out=out);
  }

MUX

  CHIP Mux {
    IN a, b, sel;
    OUT out;

    PARTS:
    Not(in=sel, out=notSel);
    And(a=notSel, b=a, out=temp1);
    And(a=sel, b=b, out=temp2);
    Or(a=temp1, b=temp2, out=out);
  }

DMUX

  CHIP DMux {
    IN in, sel;
    OUT out;

    PARTS:
    Not(in=sel, out=notSel);
    And(a=notSel, b=in, out=a);
    And(a=sel, b=in, out=b);
  }

\

16-Bit Variants

Multi-bit logic gates: Not/And/Or 기본 버전에서 n개의 비트 수 만큼 반복적인 비트 연산을 행할 수 있게 만들면 된다.

그 중, Multiplexor 같은 경우는 selector 선택 비트를 모두 같은 값을 입력 하게 만들면 된다.

이 외, 나머지 기본 논리 게이트의 16비트 변형은 모두 이와 비슷한 형태를 띄고 있다.

MUX16-Bit

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

    PARTS:
    Mux(a=a[0], b=b[0], sel=sel, out=out[0]);
    Mux(a=a[1], b=b[1], sel=sel, out=out[1]);
    Mux(a=a[2], b=b[2], sel=sel, out=out[2]);
    Mux(a=a[3], b=b[3], sel=sel, out=out[3]);
    Mux(a=a[4], b=b[4], sel=sel, out=out[4]);
    Mux(a=a[5], b=b[5], sel=sel, out=out[5]);
    Mux(a=a[6], b=b[6], sel=sel, out=out[6]);
    Mux(a=a[7], b=b[7], sel=sel, out=out[7]);
    Mux(a=a[8], b=b[8], sel=sel, out=out[8]);
    Mux(a=a[9], b=b[9], sel=sel, out=out[9]);
    Mux(a=a[10], b=b[10], sel=sel, out=out[10]);
    Mux(a=a[11], b=b[11], sel=sel, out=out[11]);
    Mux(a=a[12], b=b[12], sel=sel, out=out[12]);
    Mux(a=a[13], b=b[13], sel=sel, out=out[13]);
    Mux(a=a[14], b=b[14], sel=sel, out=out[14]);
    Mux(a=a[15], b=b[15], sel=sel, out=out[15]);
  }

\

Multi-Way Variants

image

Mux4Way16

  CHIP Mux4Way16 {
    IN a[16], b[16], c[16], d[16], sel[2];
    OUT out[16];

    PARTS:
    Mux16(a=a, b=b, sel=sel[0], out=temp1);
    Mux16(a=c, b=d, sel=sel[0], out=temp2);
    Mux16(a=temp1, b=temp2, sel=sel[1], out= out);
  }

Mux8Way16

  CHIP Mux8Way16 {
      IN a[16], b[16], c[16], d[16],
        e[16], f[16], g[16], h[16],
        sel[3];
      OUT out[16];

      PARTS:
      Mux4Way16(a=a, b=b, c=c, d=d, sel=sel[0..1], out=temp1);
      Mux4Way16(a=e, b=f, c=g, d=h, sel=sel[0..1], out=temp2);
      Mux16(a=temp1, b=temp2, sel=sel[2], out=out);
  }

DMuxMux역순을 기억하고 구현하면 된다.

DMux4Way

  CHIP DMux4Way {
      IN in, sel[2];
      OUT a, b, c, d;

      PARTS:
      DMux(in=in, sel=sel[1], a=aB, b=cD);
      DMux(in=aB, sel=sel[0], a=a, b=b);
      DMux(in=cD, sel=sel[0], a=c, b=d);
  }

Dmux8Way

  CHIP DMux8Way {
      IN in, sel[3];
      OUT a, b, c, d, e, f, g, h;

      PARTS:
      DMux4Way(in=in, sel=sel[1..2], a=aB, b=cD, c=eF, d=gH);
      DMux(in=aB, sel=sel[0], a=a, b=b);
      DMux(in=cD, sel=sel[0], a=c, b=d);
      DMux(in=eF, sel=sel[0], a=e, b=f);
      DMux(in=gH, sel=sel[0], a=g, b=h);
  }

\