컴퓨터 시스템의 이론과 설치 제1장
12605 단어 컴퓨터 시스템의 이론과 실현
요즘 배우고 싶은 내용과 비슷한 내용이고, 댓글도 좋아서 기대가 됩니다.
전문 작가가 아니라 취미로 썼지만 각 장의 답변을 메모로 쓰기로 했다.
운영 환경~
MacBook Air(M1, 2020)
macOS Big Sur 11.5.1
컴퓨터 시스템의 이론과 설치 초판 7
Hardware Simulator 실행 준비(초보자용)
Simultor 준비 표시
이 책
C.3 소프트웨어 도구의 실행 방법
MAC 사용자 및 Unix/Linux 사용자
더.
다음 세 가지 기술에는 nand 2 tetris를 desktop에 놓은 사람만 있습니다.
다른 곳에 두신 분들은 CD를 각각 바꿔 주세요.
사족을 달았지만 아래 코드는 한 줄 한 줄 입력해 주세요.
단말기
cd desktop
cd nand2tetris
cd tools
chmod 777 HardwareSimulator.sh
내 Mac에 자바가 없으면 실행할 수 없기 때문에 다음과 같다.홈brew에 가입하지 않은 사람은'홈brew 설치'등을 통해 조사할 수 있다
Homebrew에 넣고 실행하십시오.
단말기
brew install java
sudo ln -sfn $(brew --prefix)/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk
비밀번호가 필요하므로 Enter 를 입력합니다.그 다음
단말기
cd ..
cd ..
~/Desktop/nand2tetris/tools/HardwareSimulator.sh &
desktop으로 돌아가서 이 책에 적힌 실행용 명령을 입력하십시오.1.5 프로젝트 도전
※ 자세한 화면 조작 등이 적혀 있습니다.바쁘신 분들은 아래 라벨의'응답'을 보세요.
단말기
~/Desktop/nand2tetris/tools/HardwareSimulator.sh &
이 책에 기재된 방법으로 Hardware Simulator를 열었습니다.여기에 편집된 파일을 입력하여 테스트를 진행합니다.그럼 Not부터 설치해 보세요. ~/nand 2tetris/project/01/내 Not.hdl 편집편집에는 Sublime Text4가 사용됩니다.
그나저나 회로 얘기는 완전 초보자라서 실제 LED를 사용하는 사람들의 기사를 많이 참고했는데...이후 이 책의 11쪽, Xor의 HDL 프로그램 출처와 그림을 읽다 보면 어느새 깨닫게 된다.int 이해력 = 0.
//Putyour code here: 변형으로 썼습니다.일부러 남겼어.
다음은 내가 쓴 것이다.
Not.hdl
/**
* Not gate:
* out = not in
*/
CHIP Not {
IN in;
OUT out;
PARTS:
// Put your code here:
Nand(in=a, in=b, out=out);
}
. hdl 파일을 편집하고 저장한 후 Hardware Simultor의 왼쪽 위 File에서 Load Chip을 선택합니다.Not.hdl Load Chip 을 선택합니다.그런 다음 Load Script에서 load를 위해 tst를 선택합니다.같은 절차.
아마 Simulaator는 다음과 같이 업데이트되었을 것입니다.
그리고 이걸로 ↓ 시험을 시작합니다.
Simultator 왼쪽 하단의 End of Script-Comporession ended successfully
나왔다. 글자 그대로 성공했다.
그러면 ~/Nand2 tetris/project/01/Not에서out 이 파일은 마음대로 만들 수 있습니다.어디 보자.
Not.out
| in | out |
| 0 | 1 |
| 1 | 0 |
0 을 입력하면 1 을 반환하고 1 을 입력하면 0 을 반환하는 것은 2 가지이기 때문에 성공!하나 더.아웃 파일을 보러 가는 것도 귀찮기 때문에 하드웨어 Simultor 오른쪽 상단에 있는 View: 아웃풋에서 자신의 테스트 결과를 볼 수 있고 compore에서 모범적인 답안을 볼 수 있습니다.
View:
Output 테스트 결과
Compoare 표준 응답
결과는 표준응답의 출력 결과와 같기 때문에 이번에 쓴 노트 회로가 정확하다.
일본 대표
대답하다.
Not
입력 in 출력 out 함수 If in = 0 theen out = 1 else out = 0
출력과 입력이 상반된 출력.
낸드의 입력과 출력은 4가지 모드가 있는데 그 중에서'a와 b의 출력이 모두 0이면 1','쌍방이 1이면 0'두 가지 모드는 Not와 같다.
따라서 Nand의 입력 두 개를 연결하는 것이 Not 회로입니다.(...여기에 쓰세요뉴스..
Not.hdl
CHIP Not {
IN in;
OUT out;
PARTS:
Nand(a=in, b=in, out=out);
}
Andin 출력 out 함수 입력 Ifa = b = 1 theen out = 1 else out = 0
Nand의 결과를 반전시키면 And의 결과가 됩니다.
Nand로 2개→출력된 것을 입력하고(Nand로 만든) Not에 =And.
목표는 낸드로만 표현하는 거니까 두 부분 다 낸드로 써요.
만약 통속적이고 알기 쉽게 썼다면, 아래의 평론 상자 안의 부품은 바로 그것이다.
And.hdl
CHIP And {
IN a, b;
OUT out;
PARTS:
Nand(a=a,b=b,out=Nout);
Nand(a=Nout,b=Nout,out=out);
/*
結局こういうこと
Nand(a=a,b=b,out=Nout);
Not(in=Nout,out=out);
*/
}
Orin 출력 out 함수 입력 Ifa = b = 0 theen out = 0 elseout = 1
만약 어느 쪽이나 쌍방이 모두 1이라면 1로 돌아간다.
Nand는 양쪽 모두 1시에 0으로만 돌아갑니다.Nand 입력을 Not으로 설정합니다.
만약 a의 반대, b의 반대가 다시 낸드에게 가해진다면 Or와 같은 결과를 얻을 수 있다.
(0, 0) 반대(1, 1) Nand-> (0)
(1, 0) 반대(0, 1) Nand-> (1)
(0,1) 반대(1,0) Nand-> (1)
(1,1) 반대(0,0) Nand-> (1)
이렇게 0, 0을 입력하면 0을 출력하고 다른 재현 1을 출력합니다.
Or.hdl
CHIP Or {
IN a, b;
OUT out;
PARTS:
Nand(a=a,b=a,out=Nouta);
Nand(a=b,b=b,out=Noutb);
Nand(a=Nouta,b=Noutb,out=out);
/*
Not(in=a,out=outa);
Not(in=b,out=outb);
Nand(a=outa,b=outb,out=out);
でも可
*/
}
Xor입력 in 출력 out 함수 Ifa≠ b the out = 1 else out = 0
ab를 입력하는 동안에만 1을 반환하지 않습니다.
입력(0, 0)출력(0)
입력(1,0)출력(1)
입력(0,1)출력(1)
입력(1,1)출력(0)
이 점에 관해서 나는 이 책의 11페이지, Xor의 HDL의 출처와 그림을 보면 더욱 인상적일 것이라고 생각한다...
다만 낸드에만 설치할 목적으로 길게 코드를 쓴다.
Xor.hdl
CHIP Xor {
IN a, b;
OUT out;
PARTS:
// Not
Nand(a=a,b=a,out=NotOutA);
Nand(a=b,b=b,out=NotOutB);
//And
Nand(a=a,b=NotOutB,out=NandOutA);
Nand(a=NandOutA,b=NandOutB,out=AndOutA);
Nand(a=b,b=NotOutA,out=NandOutB);
Nand(a=NandOutB,b=NandOutB,out=AndOutB);
//Or
Nand(a=AndOutA,b=AndOutA,out=OrOutA);
Nand(a=AndOutB,b=AndOutB,out=OrOutB);
Nand(a=OrOutA,b=OrOutB,out=out);
}
Multiplexora와 b2개에서 입력하고, sel이 0일 때, a에서 sel이 1일 때 b로 출력되는 울타리를 선택합니다.
a, b,sel 함수 입력 If sel = 0 then out = a elseout = b
어쨌든 셀은 0일 때는 a만 보고, 셀은 1일 때는 b만 본다.
a
b
sel
out
0
-
0
0
1
-
0
1
-
0
1
0
-
1
1
1
라는 양식으로 고려하면 된다.
a를 볼 때, sel은 Not로 반대로 And를 통과하고, b를 볼 때 Not로 And를 통과하지 않는다...그리고 나서
a=0,sel=1->And0a를 봤지만 0,b는 보지 않았기 때문에 결과는 0이었다.
And1a를 보면 1,b를 못 봤는데 결과는 1이에요.
나는 And0b를 보았지만 0, a는 보지 않았기 때문에 결과는 0이었다.
And1b를 보면 1,a를 못 봤는데 결과는 1이에요.
이렇게 하면 간단하다.즉 둘 다 0이면 0, 하나는 0, 다른 하나는 1이면 1이면 된다.
둘 다 불가능해.이것은 Or로 실현할 수 있다.
Mux.hdl
CHIP Mux {
IN a, b, sel;
OUT out;
PARTS:
//aを見る用のNot sel作成
Nand(a=sel,b=sel,out=NotSel);
Nand(a=a,b=NotSel,out=AndA);
Nand(a=AndA,b=AndA,out=NotSelA);
Nand(a=b,b=sel,out=AndB);
Nand(a=AndB,b=AndB,out=SelB);
//Or
Nand(a=NotSelA,b=NotSelA,out=outA);
Nand(a=SelB,b=SelB,out=outB);
Nand(a=outA,b=outB,out=out);
}
Demultiplexor멀티플렉스의 반대.in,sel 출력 a,b 입력
함수 If sel=0then (a=in, b=0)else(a=0, b=sel)
출력은 2개로 증가했지만, 설치는Multiplexor보다 간단합니다.
in이 1이고 sel이 0이면 b=0이다. 즉, in과 sel은 모두 1이 필요하기 때문에 b의 출력에는And가 필요하다.
a, 그러나 sel을 Not로 되돌리지 않으면 in=sel=1을 확인할 수 없습니다.
설치는 아래와 같습니다. ※거의 다 낸드로 쓰느라 지쳤어.
DMux.hdl
CHIP DMux {
IN in, sel;
OUT a, b;
PARTS:
Not(in=sel,out=NotSel);
And(a=in,b=NotSel,out=a);
And(a=in,b=sel,out=b);
}
도비트 Not정말 이런 파워 스킬인가요?그래서 나는 많은 것을 조사했지만 변수 선언과 for는 모두 실패했다.그리고 낸드가 아니라 노트로 쓰면 돼.
Not16.hdl
CHIP Not16 {
IN in[16];
OUT out[16];
PARTS:
Nand(a=in[0],b=in[0],out=out[0]);
Nand(a=in[1],b=in[1],out=out[1]);
Nand(a=in[2],b=in[2],out=out[2]);
Nand(a=in[3],b=in[3],out=out[3]);
Nand(a=in[4],b=in[4],out=out[4]);
Nand(a=in[5],b=in[5],out=out[5]);
Nand(a=in[6],b=in[6],out=out[6]);
Nand(a=in[7],b=in[7],out=out[7]);
Nand(a=in[8],b=in[8],out=out[8]);
Nand(a=in[9],b=in[9],out=out[9]);
Nand(a=in[10],b=in[10],out=out[10]);
Nand(a=in[11],b=in[11],out=out[11]);
Nand(a=in[12],b=in[12],out=out[12]);
Nand(a=in[13],b=in[13],out=out[13]);
Nand(a=in[14],b=in[14],out=out[14]);
Nand(a=in[15],b=in[15],out=out[15]);
}
다비드 앤드강행
And16.hdl
CHIP And16 {
IN a[16], b[16];
OUT out[16];
PARTS:
And(a=a[0],b=b[0],out=out[0]);
・・・略・・・
And(a=a[15],b=b[15],out=out[15]);
}
도비드 오르강행
Or16.hdl
CHIP Or16 {
IN a[16], b[16];
OUT out[16];
PARTS:
Or(a=a[0],b=b[0],out=out[0]);
・・・略・・・
Or(a=a[15],b=b[15],out=out[15]);
}
멀티비트 재사용기사랑을 끊다
Mux16.hdl
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]);
}
Or 입력오르통에서 7번만 연결하면 간단합니다.
Or8Way.hdl
CHIP Or8Way {
IN in[8];
OUT out;
PARTS:
Or(a=in[0],b=in[1],out=out1);
Or(a=out1,b=in[2],out=out2);
Or(a=out2,b=in[3],out=out3);
Or(a=out3,b=in[4],out=out4);
Or(a=out4,b=in[5],out=out5);
Or(a=out5,b=in[6],out=out6);
Or(a=out6,b=in[7],out=out);
}
멀티 입력 멀티비트 복용기Mux4Way16
in과 sel이 두 배로 늘어난 부분은 두 개의 Mux16 중 한 번, 마지막으로
다시 한번 Mux16을 통해 구현됩니다.
Mux4Way16.hdl
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=outA);
Mux16(a=c, b=d, sel=sel[0], out=outB);
Mux16(a=outA, b=outB, sel=sel[1], out=out);
}
Mux8Way16맥스4에서 in으로 두 배만 뒤집었기 때문에 두 개의 맥스4를 사용하고 마지막에 in은 두 개의 맥스16을 통과하면 완성된다.다만 셀[0.1]에 가까스로 도착하는 데는 시간이 필요하다.
32비트와 64비트의 기본 문을 만들면 더 큰 입력과 출력도 간단하게 이루어질 수 있다.
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=outA);
Mux4Way16(a=e,b=f,c=g,d=h,sel=sel[0..1],out=outB);
Mux16(a=outA,b=outB,sel=sel[2],out=out);
}
DMux4WayMux4way의 요령에 따라 실시하다.똑같이
CHIP DMux4Way {
IN in, sel[2];
OUT a, b, c, d;
PARTS:
DMux(in=in, sel=sel[1], a=outA, b=outB);
DMux(in=outA, sel=sel[0], a=a, b=b);
DMux(in=outB, sel=sel[0], a=c, b=d);
}
DMux8WayDmux4Way를 통해서도 출력을 8개의 Dmux로 바꾸기
4가지 설치 완료.
DMux8Way.hdl
CHIP DMux8Way {
IN in, sel[3];
OUT a, b, c, d, e, f, g, h;
PARTS:
DMux4Way(in=in, sel=sel[1..2], a=outA, b=outB, c=outC, d=outD);
DMux(in=outA, sel=sel[0], a=a, b=b);
DMux(in=outB, sel=sel[0], a=c, b=d);
DMux(in=outC, sel=sel[0], a=e, b=f);
DMux(in=outD, sel=sel[0], a=g, b=h);
}
감상전시험 준비에 3시간 정도 걸렸는데 왠지 qita를 쓰는 데 2시간 정도 걸려서 일요일 오전에 없어졌어요.
낸드부터 Not, And, Or를 만드는 감동의 순간, for를 사용할 수 없는 강행 상태에서 도비트가 시작됩니다.이런 느낌.
도비트를 사용해 도인 도아웃을 간단하게 만들었기 때문에 성취감을 느낀다.위에서 언급한 바와 같이 만약에 응용한다면 32비트, 64비트를 실현할 수 있습니까?
이상은github에 올렸으면 좋겠지만, 너무 자세하게 썼기 때문에 실종은 불가피하다
끝까지 노력하겠습니다.
Reference
이 문제에 관하여(컴퓨터 시스템의 이론과 설치 제1장), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/NY0R0N/items/c0c1e24fb2cdee7eec8d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)