해야될 건 많은데 너무 오래걸리니까

 

좀 간단하게 정리해야지

 

 

4. Xor

Xor 게이트는 nand 4개로, nand+or+and로 만들수 있다.

https://ko.m.wikipedia.org/wiki/XOR_%EA%B2%8C%EC%9D%B4%ED%8A%B8

여기서는 nand + or + and로 해보자

CHIP Xor {
    IN a, b;
    OUT out;

    PARTS:
    Nand(a=a, b=b, out=nandOut);
    Or(a=a,b=b,out=orOut);
    And(a=nandOut, b=orOut, out=out);
}

 

 

 

5. Multiplexer

- (1비트) 멀티플렉서는 입력들 중에 하나를 선택하여 출력으로 내보낸다.

- 입력으로 a, b 그리고 입력 선택을 위한 sel 단자, 출력으로 out 단자가 있다.

- sel이 0이면 출력은 a, 아니면 b를 출력하도록 구현한다.

- 아래는 기본 논리게이트로 구현한 먹스

 

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

    PARTS:
    // Put your code here:
    Not(in=sel, out=selNot);
    Nand(a=a, b=selNot, out=outNandA);
    Nand(a=sel, b= b, out=outNandB);
    Nand(a=outNandA, b=outNandB, out=out);
}

 실행 결과를 보면

- a = 1, b = 0, sel = 1일때, b의 값을 선택하여 출력이 0이 나오는걸 알수있다.

 

 

 

 

6. Demultiplexer

- 1비트 디멀티플렉서는 입력으로 in, sel, 출력은 a, b가 된다.

- 동작은 sel의 값에 따라 in의 값을 a(sel==0), b(sell==1)로 보낸다.

- 선택받지 못한 출력단자는 0을 출력한다.

CHIP DMux {
    IN in, sel;
    OUT a, b;

    PARTS:
    // Put your code here:
    Not(in =sel, out=selNot);
    And(a=in, b=selNot, out=a);
    And(a=in, b=sel, out=b);
}

 

dmux의 경우 in = 1, sel = 1일때 b 단자에서 1 출력하는걸 볼수있다.

 

 

 

 

 

* 멀티 비트 HDL

- 이제 멀티 비트를 다루는 논리 회로를 구현해야 한다.

- 책에 따르면 내부 버스 핀을 연결하는 경우와 참값 거짓값을 내보내는 경우가 나온다.

   내부 핀 입력 : chipPart1(..., x[i]= u, ...);   chipPart2(..., x[i..j]=v, ...);

   참/거짓값 입력 : chipPart(..., x[0..2] = true, ..., x[6..7] = true, ...); 

* 하지만 이 내용은 멀티 비트 논리 회로를 사용할때 필요하고, 멀티비트 논리회로를 만들때는 여러개를 해줘야될거같다..

 

 

** 16bit 논리회로 구현하는 이유

- 이 책의 3장인가? 4장쯤에 보면 hack 컴퓨터는 16비트씩 데이터를 처리하고, 레지스터 한개가 16비트를 차지한다.

 

 

7. Multi-bit Not(16bit)

이전에 이미 Not게이트를 구현한걸 위 내용 참고해서 16개를 사용해서 16비트 Not게이트를 만들었다.

CHIP Not16 {
    IN in[16];
    OUT out[16];

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

 

* 좌측은 10진수 우측은 2진수, 음수는 2의 보수

 이전의 Not 게이트 연산때는 0아니면 1만 나왔는데, 이제는 16비트를 다루면서 십진수로 변환되어 나오고 있다.

아래의 분홍색으로 표시한 부분일때의 경우 %B11111111111111같은 식으로 입력이 됬는데,

좌측의 입력 핀에는 -1이 입력된 것으로 나오고 있다.

아마 2진수 1을 2의 보수를 취해 음수로 표현해서 그런것 같다.

2진수 1 = B00000000001

1의 보수로 음수 표현한다면 -1 =B111111111110 같은 식일것이고

2의 보수로 음수 표현한다면 -1 =B111111111111 이 된다. 

그래서 아래의 2진수 입력값이 10진수로 -1이 된다.  

 

8. Multi-bit And(16bit)

9. Multi-bit Or(16bit)

그냥 and, or는 and hdl 작성후 복사해서 파트 이름만  or로 바꿔서 만들었다.

 

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

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

 

 

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

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

 

 

 

 

10. Multi-bit multiplexer(16bit)

- Mux도 동일하게 16줄짜리 파트 내용 복붙해서 이름만 바꾸려 했는데, sel이 있는걸 잊었다. sel도 추가하자.

CHIP Mux16 {
    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]);
}

 

 

 

11. Multi-way Or(8way)

- 이제 multi-way Or 게이트다! 멀티 웨이 뭐라고 적는게 좋을까 . 그냥 or는 입력을 2개받지만 이건 8way 8개 입력을 받는다는게 다르다.

- 8개의 입력다 or연산하면 되니까, or게이트 7개 가지고 다 or연산하면된다.

* 그림 찾다 보니까 nand2tetris.github.io도 있다. 여기에 설명 코드랑 그림 있으니 참고해도 괜찬을듯

https://nand2tetris-hdl.github.io/

 

HDL API & Gate Design

in[16], load, address[6] out[16]

nand2tetris-hdl.github.io

 

저기 나오는데로 해도되지만 난 그냥 쉽게 이런 식으로 해보려고한다.

비효율적인것 같긴한데 이해하기 쉬우면 됫지.

CHIP Or8Way {
    IN in[8];
    OUT out;

    PARTS:
    Or(a=in[0], b=in[1], out=or1);
    Or(a=or1, b=in[2], out=or2);
    Or(a=or2, b=in[3], out=or3);
    Or(a=or3, b=in[4], out=or4);
    Or(a=or4, b=in[5], out=or5);
    Or(a=or5, b=in[6], out=or6);
    Or(a=or6, b=in[7], out=out);
}

 

 

 

 

12. Multi-way Demultiplexer(4way)

- 이번에는 4way 디먹스다. 4way dmux의 경우 이름 그대로 4개의 길로 출력하는데 출력할 길을 선택하기 위해서 sel 단자 2개가 존재한다.

sel = 11 -> d

sel = 10 -> c

sel = 01 -> b

sel = 00 -> a

셀렉터 단자랑 출력 순서가 좀 햇갈리긴한데 일단 구현해보자.

여기서 and 게이트가 입력 3개를 받으니 고려해서 구현하면 되긴한데 되게 햇갈리네

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

    PARTS:
    Not(in=sel[1], out=not1);
    Not(in=sel[0], out=not0);
    And(a=in, b=not1, out=and1);
    And(a=and1, b=not0, out=a);

    And(a=in, b=not1, out=and2);
    And(a=and2, b=sel[0], out=b);

    And(a=in, b=sel[1], out=and3);
    And(a=and3, b=not0, out=c);

    And(a=in, b=sel[1], out=and4);
    And(a=and4, b=sel[0], out=d);
}

그래도 생각한데로 in 1일때, sel 값에 따라 생각대로 출력이 되긴한다.

 

 

 

 

 

13. Multi-way Demultiplexer(8way)

4출력 디멀티플렉서 만드는것도 머리햇갈리는데 8출력는 어떻게 하나 싶었지만

잠깐 찾아보니 일렉트로 허브란곳에서 4출력 디먹스 2개로 만드는 그림을 올려둿다.

https://www.electronicshub.org/demultiplexerdemux/

이거 참고해서 만들면 문제없겟지..?

구현하다가 문제가 위의 4출력 디먹스에는 E 단자가 존재한다.

E 단자를 고려하지 않고 hdl을 작성하면 똑같은 디먹스 두개를 사용하게 된다.

    PARTS:
    Not(in=sel[0], out=nota);
    DMux4Way(in=in, sel[1]=sel[1], sel[0]=sel[2]);
    DMux4Way(in=in, sel[1]=sel[1], sel[0]=sel[2]);

 

위 링크에서 잘보니까 E가 enable이더라

A가 0인경우 not으로 위의 디먹스가 사용되어 위 그림기준으로 Y3 ~ Y0중에서 선택

A가 1일때는 아래의 디먹스가 사용되서 Y7 ~ Y4중 하나를 선택한다.

는건 알겠는데 다시보니까

a, b, c, 출력 단자들 맞춰줘야되서 Dmux4way 두개 쓸게아니라 그냥 구현해야되겠다..

 

 

다행인지 불행인지 위의 일렉트로닉스허브에는 

어떻게 구현할지 그림도 있다. 이걸 hdl로 써보는게 ㅈ브ㅔㅂㅈ자체ㅐ

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

    PARTS:
    Not(in=sel[2], out=not2);
    Not(in=sel[1], out=not1);
    Not(in=sel[0], out=not0);

    And(a=in, b=not2, out=and12);
    And(a=and12, b=not1, out=and13);
    And(a=and13, b=not0, out=a);

    And(a=in, b=not2, out=and22);
    And(a=and22, b=not1, out=and23);
    And(a=and23, b=sel[0], out=b);

    And(a=in, b=not2, out=and32);
    And(a=and32, b=sel[1], out=and33);
    And(a=and33, b=not0, out=c);

    And(a=in, b=not2, out=and42);
    And(a=and42, b=sel[1], out=and43);
    And(a=and43, b=sel[0], out=d);


    And(a=in, b=sel[2], out=and52);
    And(a=and52, b=not1, out=and53);
    And(a=and53, b=not0, out=e);

    And(a=in, b=sel[2], out=and62);
    And(a=and62, b=not1, out=and63);
    And(a=and63, b=sel[0], out=f);

    And(a=in, b=sel[2], out=and72);
    And(a=and72, b=sel[1], out=and73);
    And(a=and73, b=not0, out=g);

    And(a=in, b=sel[2], out=and82);
    And(a=and82, b=sel[1], out=and83);
    And(a=and83, b=sel[0], out=h);
}

 

길어서 햇갈리긴 했지만 이상없이 잘동작한다.

 

 

이렇게 많이 구현했는데도

 

2개가 남았다. 시간도 늦었으니 내일해야지.

 

내일 해도 CPU 까지 할수있을지는 모르겠다..

 

 

14. Multi-way/Multi-bit multiplexer(4way 16bit)

15. Multi-way/Multi-bit multiplexer(8way 16bit)

최근 글을 아무것도 안올리고 있었는데,

 

수학 공부부터 해야할까, 알고리즘-자료구조를 해야할까, 파이썬 프로그래밍 하면서 경험을 쌓을까 등등..

 

뭘할지를 고민하다가 지금 하고 있는 것들이 조금씩 질리기 시작했고

(하나만 하면 질리니까 여러개를 느리지만 돌아가면서 하곤 있긴했다.)

 

결국에는 뭐든 만들기 위해서 컴퓨터 구조부터 다시 해보는게 필요하다고 생각이 들었다.

 

 

마침 생각난게 전에 하다가 만 nand2tetris 

 

우리나라에서는 아두이노나 라즈베리파이에 비하면 유명하지는 않다.

 

 

그렇지만 이 nand2tetris의 가장 큰 매력은 이름 그대로 nand 게이트를 이용해서 hack이라고

 

비교적 간단한? 구조의 컴퓨터(cpu, memory, registor 등을 하드웨어 시뮬레이션으로 직접 구현한다!)를 만들고 

 

jack이라고 하는 자바 비스무리한 객체지향 언어를 통해 테트리스를 구현하는 내용을 다루고 있다.

 

 

 

나는 일반적인 대학교 컴공과를 나오지는 않고 얼핏얼핏 디지털 논리회로 수업을 듣긴했었는데

 

처음 디지털 논리회로에 대해서 배울때는 카르노맵까지만 공부했었고, 정보처리기사 자격증 딸때도

 

이 논리회로가 뭐하는건지 몰랐다! 그냥 게이트에 입력이 어떻게 들어가면 어떻게 나오구나를 진리표대로외우기만 했다.

 

 

 

이 프로젝트에 대해서는 전에 밑바닥부터 시작하는 딥러닝 책에서 보고 알게되면서

 

 

우리가 알던 컴퓨터가 논리 게이트로 만들고, 난드게이트만가지고도 컴퓨터를 만들수 있다는것에 놀랐다.

 

처음 이걸 알았을 당시(4~5년 전쯤)에는 원서를 직접 구입해서 따라가려고는 했었지만 

 

 

우리나라에는 한글 자료도 없었고, 영어 원서 자료 뿐이다보니 책 한페이지 한페이지를 번역해가면서 보는데

 

처음에는 1페이지에 3~40분 걸릴만큼 오래걸렸고 힘들어서 포기 하고 말았다.

(2년 전쯤에  이전에 쓰던 블로그를 시작하면서 컴퓨터아나토미 책을 보고 다시 했었던것 같았는데 그때도 가산기인가? 거기까지밖에 가지 못했었다.)

 

 

 

지금이야 남인천 폴리텍 다니면서 그 동안 삽질하면서 영어 실력도 늘고,

 

전기전자에 대해서 공부하고나서 다시 디지털 논리회로를 보니 보는 눈이 달라지게 되었다.

 

and니 or 게이트란게 있는데 이전에는 진리표만 알고 있었다면,

 

지금은 다이오드나 트랜지스터에 대해서 조금이라도 알고나서 이러한 게이트를 어떻게 만드는지를 보니까

 

그동안 그놈의 게이트 게이트라는게 뭐하는 놈인지 덜 막연해지고 조금은 이해된다고 해야될까.

 

 

 

아무튼 블로그에 올려야지 생각만 하고 귀찬아서 안올렸지만 프로테우스라고 하는 전자 시뮬레이터를 이용해서

 

jk 플립플롭 가지고 (책을 참고했지만) 동기 카운터도 만들었고 영어 실력도 전보다는 늘었으니까

 

지금이라면 이 책을 할수 있겠다는 생각이 들었다.

 

그래서 한동안 이책을 보느라 블로그에 아무것도 올리지도 못하고 있었다.

 

전보다 영어 실력이 늘었다 해도 원서 보는건 힘들고 오래걸렸다.

 

 

 

 

기회가 되면 이 프로젝트가 코세라 강의에도 있고 책의 절반 정도(하드웨어  구현)까지는 공개되어있으니까

 

번역이라도 해볼까 싶다.

 

코딩 교육한답시고, 아두이노나 라즈베리파이 같은걸로 깔짝깔짝대는것 보다는 유익하다 생각하는데

 

생각해보니까 처음 코딩 공부할때 해보는게 괜찬은거같네

 

 

프로그래밍은 어느정도 땟는데 컴퓨터 구조를 제대로 느껴보고 싶은 사람에게 딱 맞다.

 

 

기본 게이트에서 테트리스 게임 만드는 것까지 목표로 하다보니,

 

한 개념이 나오면 구현에 필요한 정도로만 짧고 쉽게 이야기하고 넘어가는데

 

어떤 용어가 나오면 그걸 또 어렵게 설명하거나 번역을 엉망으로 해서 이해하기 힘든 책도 많은만큼

 

정말 영어 원서지만 엉터리 번역서보다 이해하기 훨씬 쉬웠다.

 

 

 

....

 

글을 적다가 알았는데 번역서가 나왔었네?

 

책 이름은 밑바닥부터 만드는 컴퓨팅 시스템이다.

 

아무튼 그건 그렇고 1/3 정도는 이미 그냥 읽었고 영어 공부한다 생각하고 계속 봐야겠다.

 

책 저자분이 만드신 홈페이지에 가면 이 HACK 컴퓨터를 FPGA로 실제로 구현했다던가

 

재밌어보이는 프로젝트가 꽤 존재한다.

 

 

 

 

아무튼 이 책은  두 파트로 나눠져있다.

 

1. 하드웨어

2. 소프트웨어

 

여기서 설명하기를 하드웨어 기본 소자인 게이트에서 부터 바닥에서 위로 바텀업식으로 진행하는데

 

1장에서 게이트

2장에서 조합 논리 회로(가산기, ALU)

3장에서 순차 논리 회로(플립플롭->레지스터->메모리)

4장에서는 기계어와 어셈블리어

5장에서는 CPU, IO장치

까지가 하드웨어 구현에 관한 내용이 되겠다.

 

이 이후로는 어셈블리어, 가상머신, 운영체제, 객체지향언어 등에 관한 내용이 있는데

 

아직은 6장 어셈블리어 조금까지만 봤지 뒷 내용은 보지않아서 잘 모른다.

 

 

자 그럼 이 프로젝트를 시작하기 위해서 필요한 툴 부터 다운로드 하자

 

아래의 링크에 들어가면 바로 보인다.

 

옆에 보면 papers나 demos에서 책/ppt 내용, 그리고 실제로 구현한 내용들을 확인할수 있다.

https://www.nand2tetris.org/software

 

 

 

 

굳이 여기서는 게이트가 뭔지 설명 하지도 않고, 설명 잘하는 분들도 많은데

 

진행할수 있는데까지는 대충 진행하는거 올리려고한다.

 

압축 풀고 tools에 들어오면

 

hardware simulator로 시작하면 되는데

 

자바 개발 키트 jdk 설치 안했다고 이런 경고창이 나온다.

 

 

 

jdk에는 오라클 jdk랑 open jdk가 있는데

 

오라클 jdk는 몇년 전부터 유료화 됬으니까 (개인으로 써도 괜찬은진 몰르겟다.)

 

그냥 공짜인 open jdk 다운받아서 쓰려고한다.

 

다운 설정하는 방법은 검색하면 금방 나오니 pass

 

 

------

 

하려했는데 나도 자바 설치하는법 잊어서 찾아봤다

 

이 글은 쓴지 좀오래되서 jdk 버전 13인데, 지금 openjdk 사이트 들어가면 18버전을 다운받을수 있다.

 

https://recipes4dev.tistory.com/173

 

예전에 자바 웹개발자 과정 수업 들으면서 자주 했었던건데 오랜만에 한다.

 

 

 

자바 설치랑 환경변수 잘 등록하고

 

다시 hadware simulator를 실행해보자

 

그러면 콘솔창이 갑자기 떳다 사라지면서 조용해진다.

 

잘못 된줄 알았는데 조금 기다렸더니 곧 시뮬레이터 창이 뜬다.

 

 

 

 

 

첫 번째 장에서 구현해야할 하드웨어 칩으로는

 

Nand, Not, And, Or/XOr, 멀티플렉서, 디멀티플렉서, 멀티비트/다중통로 게이트/먹스 들을 만들면 된다.

 

책 상에는 빌트인(이미 구현된) 칩과 이 빌트인 칩을 왜 쓰는지 어떻게 불러오는지 설명이 있긴한데

 

nand2tetris 사이트에 들어가면 책 나오니까 거기 내용 번역해서 보거나 번역서 보면 나와있다.

 

일단 바로 기본 논리게이트 구현부터 해보자

 

 

 

일단 1장에서 구현해야할 논리게이트는 난드를 제외한 15가지가 있는데,

 

* Nand - 난드 게이트의 경우, 이 프로젝트가 nand 게이트를 이용하여 쌓아올라가는것 만큼 기본 게이트로 제공하여 구현안해도 된다. 이걸로 다른 게이트들 만들고, nand로 만든 여러 게이트들로 조합 -> 순차논리회로->CPU까지 만들어간다.

 

아래의 15가지 기본 논리 게이트를 구현하면 된다! 

 

1. Not

2. And

3. Or

4. Xor

5. Multiplexer

6. Demultiplexer

7. Multi-bit Not(16bit)

8. Multi-bit And(16bit)

9. Multi-bit Or(16bit)

10. Multi-bit multiplexer(16bit)

11. Multi-way Or(8way)

12. Multi-way Demultiplexer(4way)

13. Multi-way Demultiplexer(8way)

14. Multi-way/Multi-bit multiplexer(4way 16bit)

15. Multi-way/Multi-bit multiplexer(8way 16bit)

 

 

 

nand2tetris에서는 HDL 하드웨어 기술 언어로 논리 회로를 작성하면 되고

(책 부록 참조)

 

논리 게이트를 구현하고 테스트 하는 방법은

 

아래의 projects/해당챕터/*.hdl 파일을 텍스트 에디터로 작성후에

 

하드웨어 시뮬레이터로 아래의 projects/해당챕터/*.hdl 파일과 *.tst를 로드해서 실행하면 된다.

 

 

- project 파일 유형 정리 - 

*.hdl : 논리 게이트 인터페이스(입출력이 뭔지), 동작 정의

*.tst : 테스트를 위한 스크립트. *.hdl을 실행한 결과가 *.cmp 파일과 동일한지 보고, 에러없이 일치하면 맞게 구현한것

*.cmp : hdl 파일과 tst 파일로 실행한 결과가 맞는지 비교하기 위한 파일

 

 

not.hdl과 not.hdl 테스트를 위한 not.tst을 로드하면 아래의 사진처럼 나오는데

 

텍스트 에디터로 클래스 정의하듯이 작성하자.

 

CHIP 논리회로명{

     입력단자 a, b, ...

     출력단자 out, ...

 

    PARTS:

       이미 구현된 게이트 or 빌트인 NAND 등으로 원하는 연산이 뜨도록 작성

}

 

 

 

 

이 책에서는 인터페이싱, abstract이라고 자주 표현이 자주 나오는데

 

여기서 말하는 인터페이스란 입력이 몇 개고 어떤 이름으로 들어오고, 출력은 무슨 이름으로 어떻게 나오는지를 말한다.

 

여기서 나오는 과제들은 *.hdl 파일에서 인터페이스 내용들은 이미 정의되어 나오니

 

해당 회로가 원하는 동작을 할수 있도록 PART에서 OUT이 원하는 데로 나오도록 회로들을 잘 연결해주면 된다.

 

일단 Not 게이트부터 시작해보자

 

 

 

 

1. Not

- 입력 : in

- 출력 : out

- 동작 : 입력을 반전시키면 된다

 막상 시작하려고 하니까 nand 게이트로 이걸 어떻게 만드나 싶다. 

not은 입력이 1개고, nand는 2개인데? 책에서 말하기를 난드 하나로 만들수 있다고한다.

난드 게이트 진리표를 보고 조금 생각해보니 알거같다.

x1과 x2에 똑같은 입력이 들어가면, 입력이 0일때 출력이 1, 입력이 둘다 1일때 0인게 보이니까.

Not의 in을 하나의 난드게이트 x1, x2에 바로 연결해주고

Not의 out과 난드게이트 F를 연결해주면 되겠다.

 

* 아까 빌트인 nand 게이트를 쓴다고 했는데 우리는 nand 게이트가 어떻게 구현됬는지 알필요 없이

입출력이 어떻게 되는지(=인터페이스)만 보면된다

빌트인 칩들은 tools/builtinChips에 존재한다.

 

구현 내용인 PARTS는 없고 입출력을 제외하면 BULTIN Nand;만 보이는데 Nand.class의 내용을 읽어서 처리하나보다.

 

이제 Nand 게이트가 어떻게 되어있는지 봤고, Nand로 Not게이트를 어떻게 만드는지도 알았다.

그럼 텍스트 에디터로 not.hdl을 열어서 수정하자.

나는 vs코드나 다른게 없어서 그냥 메모장에다가 했다.

주의 사항은 ';'을 빼먹은것처럼 문법을 틀린경우 칩이 로드되지 않는다.

 

Nand 게이트로 Not.hdl을 구현하고

CHIP Not {
    IN in;
    OUT out;

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

 

테스트 스크립트를 돌리면 에러없이 입력핀이 0일때 출력핀은 1, 반대의 경우도 잘 나온다.

 

 

 

2. And

- And 게이트는 간단하다.

- 난드게이트에 A, B를 넣은 후 앞에 구현한 Not 게이트의 in에다가 넣어주면 끝.

* hdl 을 작성할때 언더스코어 _를 썻더니 로드가 안된다. 아무래도 매개변수 자리에는 특수문자를 넣으면안되나보다.

CHIP And {
    IN a, b;
    OUT out;

    PARTS:
    // Put your code here:
    Nand(a=a, b=b, out=notIn);
    Not(in=notIn, out=out);
}

 

 

3. Or

or 게이트에서 부터 어떻게 해야할지 머리가 아프기 시작한다.

고민해서 만들 시간 없으니 검색해서 만들자.

- 책에서는 and랑 not 게이트로 만들수 있다고하는데, nand만으로도 or를 만들수 있다. 근데 책대로 해야지

 

위 그림과 똑같이 hdl를 작성하면

CHIP Or {
    IN a, b;
    OUT out;

    PARTS:
    Not(in=a, out=aOut);
    Not(in=b, out=bOut);
    And(a=aOut, b=bOut, out=andOut);
    Not(in=andOut, out=out);
}

 

역시 or 게이트도 잘 동작된다.

그런데 하다보니까 이렇게 에러 안뜨고 잘 넘어가면 되는건지 아리까리하다

다시 책보면 되긴한데 몇일 내내 원서로 보다보니 눈에 잘 들어오지는 않아서

그냥 한번 마지막 Not을 빼고 and 출력을 out으로 해봤다.

 

역시나! 잘못 출력이 나온때부터 테스트는 멈춘다.

다음으로 넘어가기를 눌러줘야 테스트 스크립트가 아래로 가는데 원하는 결과랑은 다르게 나온다.

 

 

 

 

 

앞으로 남은 1장 게이트는 13개.. 이거 왜이렇게 많냐

다른 챕터는 복잡하긴 해도 구현할게 적은데

내용을 줄이던가 해야되겟다.

 

4. Xor

5. Multiplexer

6. Demultiplexer

7. Multi-bit Not(16bit)

8. Multi-bit And(16bit)

9. Multi-bit Or(16bit)

10. Multi-bit multiplexer(16bit)

11. Multi-way Or(8way)

12. Multi-way Demultiplexer(4way)

13. Multi-way Demultiplexer(8way)

14. Multi-way/Multi-bit multiplexer(4way 16bit)

15. Multi-way/Multi-bit multiplexer(8way 16bit)

선형미분방정식과 비선형 미분방정식

- 선형미분방정식 : 도함수/종속변수가 1차인 미방

   * n계 선형미방 : 가장 많이 미분한 항이 n번 미분한 미방

- 비선형미분방정식 : 도함수/종속변수가 1차가 아닌 미방

 

선형 미방과 비선형 미방 비교

- 아래의 예시에서 첫번째 미방의 경우 다차항이없고, y''가 가장 많이 미분하였므로 2계 선형 미방

- 두번째 미방의 경우 (y')를 제곱하여 2차가 되므로 비선형 미방

 

 

1계 선형 상미방의 대수적 표현과 표준형

- 1계 선형 상미방 : 아래와 같이 다차항이 없는 1계 상미분방정식

 * 우항의 r(x)는 입력을 의미(ex: 힘, 전류, 변위 등)

 * y(x)는 입력에 대한 출력

-  y'의 계수가 f(x)일 때 f(x)를 나누어 아래와 같이 y'의 계수를 1로 만들었을때의 미방을 1계 선형 상미방의 표준형

 

 

동차와 비동차

- 아래와 같이 우항이 0인 선형미분방정식을 동차 선형미방이라 하고, 0이 아닌 경우를 비동차 선형미방이라 한다.

- 동차 선형 미분 방정식 : 모든 항이 y 혹은 y의 도함수를 가지고 있다.

- 비동차 선형 미분 방정식 : 모든 항이 y 혹은 y의 도함수를 가지고 있지는 않다.

 

 

동차 선형 미방과 자명해(trivial solution)

- 다음의 동차 선형 미방의 표준형을 변수 분리하고, 적분 한후, 지수함수를 취하면 아래의 일반해(동차해)를 얻음

- 이 일반해에 c = 0을 대입하면 해당 구간 모든 x에 확실한 자명해 y(x)=0이나옴

 * 자명해는 당연한 해로 필요 x

 

비동차 선형 미방의 해

- 아래의 비동차 선형 미방이 주어질때, 적분 인자 F를 곱하자

- pF = F'의 조건을 주고, 변수 분리법으로 분리한 후, 적분과 지수함수를 취한 결과 F = e^h가 나온다.

- 이를 Fy의 합성함수 미분 식에다가 대입한 결과. (Fy)' = r * F임을 얻는다.

- (Fy)'를 적분 후, 양변에 F(=e^h)를 나눈 결과 응답 y(x)에 대한 식이 나오며, 입력의 응답과 초기조건응답으로나뉜다.

 

 

ex1) 1계 선형 상미분방정식의 초기값이 주어질때 응답 y 구하기

- 아래의 미분방정식과 초기조건, y에 대한 식이 주어지면  입력 r = sin 2x, p = tanx

- h = p = tan x의 적분이며 e^h = sec x가 나온다. 이를 통해 식 y의 r*e^h와 e^-h를 구한다.

- 정리한 식 y에 초기조건을 대입한 결과 c = 3이 나왔으므로, 이 선형 미분 방정식의 특수해는 아래와 같다.

 

ex2) RL 회로의 전류를 구해보자

- RL 회로가 주어지면,  KVL과 옴의법칙을 통해 구한 1계 선형 상미분방정식과 그의 표준형은 다음과 같다

- 비동차 선형미방의 일반 해를 구해보자

- 초기조건 I(0) = 0  <= 인가 시작떄 전류가 0이다. 초기조건을 통해 특수해를 구하자

 * 회로이론의 RL회로 전류 인가시 전류의 과도응답 식과 같다! wow

 

 

베르누이 방정식(비선형 상미방을 선형 상미방으로 바꾸기)

- 베르누이 방정식 : 실제 많은 문제는 비선형 -> 선형 상미분으로 변환하면 쉽게 풀수 있있으며 이 방법 중 하나

- 아래의 식에서 우항 y의 차수가 0 or 1이면 선형이지만 그렇지 않으면 비선형 상미방이 된다.

- 아래의 u에 대한 식을 미분하고 y'를 대입하자. u에 대한 선형 상미방이 나온다!

+ Recent posts