Contents
1. Nand2Tetris ¶
- 스터디 소개 :
- 컴퓨터ì�˜ 최하위 ë ˆë²¨ 계층ì�¸ 논리회로(하드웨어)단부터 OS와 high level language까지 ë‘�루ë‘�루 ì„ë µí•˜ê³ ì‹¤ìŠµí•˜ì—¬ 최종ì—�는 테트리스를 만드는것ì�´ 목표ì�¸ 스터디입니다.
- 컴퓨터ì�˜ 최하위 ë ˆë²¨ 계층ì�¸ 논리회로(하드웨어)단부터 OS와 high level language까지 ë‘�루ë‘�루 ì„ë µí•˜ê³ ì‹¤ìŠµí•˜ì—¬ 최종ì—�는 테트리스를 만드는것ì�´ 목표ì�¸ 스터디입니다.
- 스터디� 사용하는 사�트 -> http://www.nand2tetris.org/
1.1. 9/26(목요ì�¼) ¶
- 참여� : 김윤환, 안�준, 권�기.
- 스터티� 대한 방향 :
- 누가 : 3명 + a(?)가
- ì�¸ì›�수 ë¬¸ì œ : max 5명까지 받는다.
- ì�¸ì›�수 ë¬¸ì œ : max 5명까지 받는다.
- 누가 : 3명 + a(?)가
- ì–¸ì œ : 시작ì�€? ì�´ë²ˆì£¼ë¶€í„° // 매주 ì�¼ìš”ì�¼ 1시
- 어디서 : zp실�서
- 무엇� : nand2Teris를
- 어떻게 : 집�서 ppt를 �어온뒤 만나서 실습하는 방향으로.
- 왜 :
- �준 ->재미있�것같아서.
- 윤환 ->컴퓨터 ìž�체를 아는 좋ì�€ 기회ë�¼ê³ ìƒ�ê°�해서 + í�¥ë¯¸ê°€ 있는 분야? 여서.
- ì˜�기 ->ì „ì²´ë¥¼ 꿰뚫기위해.
- �준 ->재미있�것같아서.
- 다ì�Œì‹œê°„까지 í• ì�¼ : chapter 0,1 ì�½ì–´ì˜¤ê¸°.
1.2.1. 공부한 ë‚´ìš© ¶
- Chapter1
- 기본ì �ì�¸ 논리 게ì�´íŠ¸ë¥¼ 공부함.
- Nand gate를 primitive gate로 ë†“ê³ , 나머지 논리 게ì�´íЏ Not, And, Or, Xor, Mux, Demux 등ì�„ Nand만으로 구현.
- Mux나 Demuxê°™ì�€ 경우, ìž…ë ¥ì�´ë‚˜ ì¶œë ¥ì�´ 너무 ë§Žì�„ 경우, ìž‘ì�€ 규모ì�˜ Mux를 여러 ê°œ ì�´ìš©í•´ì„œ í�° 규모ì�˜ Mux를 구현해ë�„ ë�œë‹¤. 예를 들면, 4way Mux는 2Way Mux 3개를 ì�´ìš©í•´ì„œ êµ¬í˜„í• ìˆ˜ 있다.
- HDL Code
- Not Gate
CHIP Not2 {
IN a;
OUT out;
PARTS:
Nand(a = a, b = a, out = out);
}
- And Gate
CHIP And {
IN a, b;
OUT out;
PARTS:
Nand(a = a, b = b, out = x);
Nand(a = x, b = x, out = out);
}
- Or Gate
CHIP Or {
IN a, b;
OUT out;
PARTS:
Nand(a = a, b = a, out = x1);
Nand(a = b, b = b, out = x2);
Nand(a = x1, b = x2, out = out);
}
- Xor Gate
CHIP Xor {
IN a, b;
OUT out;
PARTS:
Nand(a = a, b = a, out = nota);
Nand(a = b, b = b, out = notb);
Nand(a = nota, b = b, out = x1);
Nand(a = a, b = notb, out = x2);
Nand(a = x1, b = x2, out = out);
}
- Mux
CHIP Mux {
IN a, b, s;
OUT out;
PARTS:
Nand(a = s, b = s, out = nots);
Nand(a = a, b = s, out = x1);
Nand(a = b, b = nots, out = x2);
Nand(a = x1, b = x2, out = out);
}
- Mux 4way
CHIP Mux4way {
IN a[4], s[2];
OUT out;
PARTS:
Nand(a = s[0], b = s[0], out = nots0);
Nand(a = s[1], b = s[1], out = nots1);
Nand(a = a[0], b = s[1], out = x0);
Nand(a = a[1], b = nots1, out = x1);
Nand(a = a[2], b = s[1], out = x2);
Nand(a = a[3], b = nots1, out = x3);
Nand(a = x0, b = x1, out = xx0);
Nand(a = x2, b = x3, out = xx1);
Nand(a = xx0, b = s[0], out = xxx0);
Nand(a = xx1, b = nots0, out = xxx1);
Nand(a = xxx0, b = xxx1, out = out);
}
- Demux
Demux는 다 êµ¬í˜„í•˜ê³ ì„œ Mux 4way를 Demux 파ì�¼ì—� ì�¨ë²„리는 바람ì—� ë‚ ë ¤ë²„ë¦¼ ã…¡ã…¡;
1.2.3. 후기 ¶
- ì‡ ë¿”ë�„ 단김ì—� ë¹¼ë�¼ëŠ” ë§�ì�´ 있듯ì�´, 순ì‹�ê°„ì—� 스터디 진행합니다. 학기 ë��ë‚ ë•Œê¹Œì§€ 매주 ì§„í–‰í•´ë³´ë ¤ê³ í•˜ëŠ”ë�°, ë��까지 다 í• ìˆ˜ 있었으면 ì¢‹ê² ìŠµë‹ˆë‹¤. ë� 윤환ì�´ë‚˜ í˜�준ì�´í˜• 있으니까 잘 ì§„í–‰ë�˜ê² ì£ . ì�´ë²ˆ 시간ì—� í–ˆë�˜ 것ì�€ 기초 중ì—� 기초ì�¸ë�°, 사실 작년 논리회로 시간ì—� Nand 게ì�´íŠ¸ë¡œ 다른 gate 구현하기 따위는 해본ì �ì�´ 없어서 좀 당황ë�„ 했습니다. ê·¸ë¦¬ê³ ê·¸ë¦¼ 그리는 것ë�„ ì°¸ ê°„ë§Œì�´ê³ , 다ì�Œ 시간까지 논리회로 ppt 좀 ë³´ê³ ì„œ ì™€ì•¼ê² ë„¤ìš”. 간단한 4way MUXë�„ ì €ë¦¬ 긴ë�°, 사칙연산ì�€ 어떻게 í•´ì•¼í• ì§€.. 머리가 아픕니다. - ê¶Œì˜�기
- ê°„ë§Œì—� 논리회로를 다루면서 ë‚´ê°€ ê¹Œë¨¹ê³ ìžˆë�˜ 부분ì�´ ë§Žë‹¤ê³ ëŠ�낌니다. ë¬¼ë¡ ì¶”ìƒ�í™”ë�¼ëŠ” 좋ì�€ ë…€ì„�ì�´ 있어서 우리가 ëª¨ë“ ê²ƒì�„ ê¸°ì–µí• í•„ìš”ëŠ” 없지만, 그래ë�„ ì›�리를 ì•ˆë‹¤ê³ í•´ì„œ 안좋ì�„ 것 ì—†ì�„듯하네요. nand로 시작해서 nand로 ë��나는 시간ì�´ì—ˆìŠµë‹ˆë‹¤. - 안í˜�준
- 지금ì�€ 처ì�Œë¶€ë¶„ì�´ë�¼ 무난하게 진행했지만... 가면갈수ë¡� ì–´ë–¤ì‹�으로 ì§„í–‰ë� ì§€ 난ì�´ë�„ì—� ë”°ë�¼ì„œ ì™ ì§€ 바뀔수ë�„ ìžˆìœ¼ë ¤ë‚˜...하는 ìƒ�ê°�ì�´ 들었습니다. ê·¸ë‚˜ì €ë‚˜ 논리회로 뒷부분ì�€ ê±°ì�˜ 기억ì�´ 없는ë�°... ì „ê³µì±…í•œë²ˆ í›�ì–´ë³´ê³ ì™€ì•¼í• ê²ƒê°™ìŠµë‹ˆë‹¤. - 김윤환
1.3.1. 공부 ë‚´ìš© ¶
- half-adder, full-adder, 16bit-adder, incremental adder, ALUì—� 대해서 ê³µë¶€í•˜ê³ êµ¬í˜„í•˜ì˜€ìŠµë‹ˆë‹¤.
- Half-Adder
CHIP HalfAdder {
IN a, b; // 1-bit inputs
OUT sum, // Right bit of a + b
carry; // Left bit of a + b
PARTS:
And(a = a, b = b, out = carry);
Xor(a = a, b = b, out = sum);
}
- Full-Adder
CHIP FullAdder{
IN a, b, c; // 1-bit inputs
OUT sum, // Right bit of a + b + c
carry; // Left bit of a + b + c
PARTS:
// Put you code here:
Xor(a=a, b=b, out=s1);
And(a=a, b=b, out=c1);
Xor(a=s1, b=c, out=sum);
And(a=s1, b=c, out=c2);
Or(a=c1, b=c2, out=carry);
}
- 16bit Adder
CHIP Add16 {
IN a[16], b[16];
OUT out[16];
PARTS:
FullAdder(a = a[0], b = b[0], c = false, sum = out[0], carry = c1);
FullAdder(a = a[1], b = b[1], c = c1, sum = out[1], carry = c2);
FullAdder(a = a[2], b = b[2], c = c2, sum = out[2], carry = c3);
FullAdder(a = a[3], b = b[3], c = c3, sum = out[3], carry = c4);
FullAdder(a = a[4], b = b[4], c = c4, sum = out[4], carry = c5);
FullAdder(a = a[5], b = b[5], c = c5, sum = out[5], carry = c6);
FullAdder(a = a[6], b = b[6], c = c6, sum = out[6], carry = c7);
FullAdder(a = a[7], b = b[7], c = c7, sum = out[7], carry = c8);
FullAdder(a = a[8], b = b[8], c = c8, sum = out[8], carry = c9);
FullAdder(a = a[9], b = b[9], c = c9, sum = out[9], carry = c10);
FullAdder(a = a[10], b = b[10], c = c10, sum = out[10], carry = c11);
FullAdder(a = a[11], b = b[11], c = c11, sum = out[11], carry = c12);
FullAdder(a = a[12], b = b[12], c = c12, sum = out[12], carry = c13);
FullAdder(a = a[13], b = b[13], c = c13, sum = out[13], carry = c14);
FullAdder(a = a[14], b = b[14], c = c14, sum = out[14], carry = c15);
FullAdder(a = a[15], b = b[15], c = c15, sum = out[15], carry = c16);
}
- Incremental
CHIP Inc16 {
IN a[16];
OUT out[16];
PARTS:
FullAdder(a = a[0], b = false, c = true, sum = out[0], carry = c1);
FullAdder(a = a[1], b = false, c = c1, sum = out[1], carry = c2);
FullAdder(a = a[2], b = false, c = c2, sum = out[2], carry = c3);
FullAdder(a = a[3], b = false, c = c3, sum = out[3], carry = c4);
FullAdder(a = a[4], b = false, c = c4, sum = out[4], carry = c5);
FullAdder(a = a[5], b = false, c = c5, sum = out[5], carry = c6);
FullAdder(a = a[6], b = false, c = c6, sum = out[6], carry = c7);
FullAdder(a = a[7], b = false, c = c7, sum = out[7], carry = c8);
FullAdder(a = a[8], b = false, c = c8, sum = out[8], carry = c9);
FullAdder(a = a[9], b = false, c = c9, sum = out[9], carry = c10);
FullAdder(a = a[10], b = false, c = c10, sum = out[10], carry = c11);
FullAdder(a = a[11], b = false, c = c11, sum = out[11], carry = c12);
FullAdder(a = a[12], b = false, c = c12, sum = out[12], carry = c13);
FullAdder(a = a[13], b = false, c = c13, sum = out[13], carry = c14);
FullAdder(a = a[14], b = false, c = c14, sum = out[14], carry = c15);
FullAdder(a = a[15], b = false, c = c15, sum = out[15], carry = c16);
}
- ALU
1.4.1. 공부 ë‚´ìš© ¶
- Chapter 4
- Hack Machine language를 사용해서 프로그램� 작성해 봄.
D - data, A - address, M - memory
e.g. A - 32ì�¼ê²½ìš°, Mì�€ M32ìž„. Mì�„ ì‚¬ìš©í• ë•Œ, Aì�˜ ê°’ì�€ memoryì�˜ address
2개� Instruction� 지�한다. � Instruction� 2Byte�다.
- A-Instruction : @value // Where value is either a non-negative decimal number or a symbol referring to such number.
Binary : 0vvv vvvv vvvv vvvv
- C-Instruction : dest=comp;jump // Either the dest or jump fields may be empty.
// If dest is empty, the "=" is omitted;
// if jump is empty, the ";" is omitted;
- A-instruction � 사용하면, value는 A� 들어간다.
Aì�˜ ê°’ì�´ Mì�´ 사용ë� 때는, 주소ì�˜ ì—í• ì�„ í•˜ê³ , D와 ê°™ì�´ ì‚¬ìš©í• ë•ŒëŠ” ê°’ ê·¸ ìž�체로 작용함.
- Chapter4 ì±… ë‚´ìš©
- PPT ë‚´ìš©
{ comp }{dest }{jump}
Binary : 111a c1c2c3c4 c5c6d1d2 d3j1j2j3
1.4.2. 실습 ê³¼ì œ ¶
- 실습 ê³¼ì œ
- 1 ~ 100까지 �하기 (권�기)
0 @100 1 M=1 2 @150 3 M=0 4 @100 5 D=M 6 @100 7 D=D-A 8 @18 9 D;JGT 10 @100 11 D=M 12 @150 13 M=D+M 14 @100 15 M=M+1 16 @4 17 0;JMP 18 @18 19 0;JMP
- � 수� 곱 (권�기)
//Memory[10] = A //Memory[11] = B //Memory[12] = Dest 0 @20 1 D=A 2 @10 3 M=D 4 @20 5 D=A 6 @11 7 M=D 8 @12 9 M=0 10 @11 11 D=M 12 @22 13 D;JEQ 14 @10 15 D=M 16 @12 17 M=D+M 18 @11 19 M=M-1 20 @10 21 0;JMP 22 @22 23 0;JMP
- � 수� 곱 (김윤환)

[PNG image (303.11 KB)]
- I/O Handling, (ê¶Œì˜�기)(BLACKì�„ ìž…ë ¥í•˜ë©´ 네모가 화면ì—� ë‚˜ì˜¤ê³ , WHITE를 ìž…ë ¥í•˜ë©´ 화면ì�˜ 네모를 지움)
0 @24576 1 D=M 2 @0 3 D;JEQ 4 @66 5 D=D-A 6 @1000 7 D;JEQ 8 @24576 9 D=M 10 @87 11 D=D-A 12 @2000 13 D;JEQ 14 @0 15 0;JMP 1000 @24576 1001 D=M 1002 @1000 1003 D;JEQ 1004 @76 1005 D=D-A 1006 @0 1007 D;JNE 1008 @24576 1009 D=M 1010 @1008 1011 D;JEQ 1012 @65 1013 D=D-A 1014 @0 1015 D;JNE 1016 @24576 1017 D=M 1018 @1016 1019 D;JEQ 1020 @67 1021 D=D-A 1022 @0 1023 D;JNE 1024 @24576 1025 D=M 1026 @1024 1027 D;JEQ 1028 @75 1029 D=D-A 1030 @0 1031 D;JNE 1032 @24555 1033 M=-1 1034 @0 1035 0;JMP 2000 @24576 2001 D=M 2002 @2000 2003 D;JEQ 2004 @72 2005 D=D-A 2006 @0 2007 D;JNE 2008 @24576 2009 D=M 2010 @2008 2011 D;JEQ 2012 @73 2013 D=D-A 2014 @0 2015 D;JNE 2016 @24576 2017 D=M 2018 @2016 2019 D;JEQ 2020 @84 2021 D=D-A 2022 @0 2023 D;JNE 2024 @24576 2025 D=M 2026 @2024 2027 D;JEQ 2028 @69 2029 D=D-A 2030 @0 2031 D;JNE 2032 @24555 2033 M=0 2034 @0 2035 0;JMP
- I/O Handling, (김윤환)(BLACKì�„ ìž…ë ¥í•˜ë©´ 네모가 화면ì—� ë‚˜ì˜¤ê³ , WHITE를 ìž…ë ¥í•˜ë©´ 화면ì�˜ 네모를 지움)

[PNG image (300.59 KB)]
1.4.3. 후기 ¶
- MIPS 코딩하는 것ì�„ ìƒ�ê°�í•˜ê³ ê³¼ì œë¥¼ 진행했는ë�°, 현실ì�€ MIPS 보다 ë�” 하드코어했네요. Symbolë�„ ì‚¬ìš©ì•ˆí•˜ê³ (사실 Cpu emulatorë§Œ 사용해서 ìƒ�긴 ë¬¸ì œì�¼ 수ë�„ 있지만), ë ˆì§€ìŠ¤í„°ë�„ 2~3ê°œ ë°–ì—� 사용하지 못하는 ìƒ�황ì—�서 ìž‘ì„±í•˜ë ¤ê³ í•˜ë‹ˆ ì°¸ 막막했습니다. I/O Handling ê°™ì�€ 경우 키보드 ìž…ë ¥ì�„ í•´ê²°í•˜ë ¤ê³ ë‚˜ë¦„ ìƒ�ê°�ì�„ 해서 작성ì�„ 했는ë�°, 결과물ì�´ ì˜� 마ì�Œì—� 들지 않는군요. 아무튼 ì�´ë²ˆ 시간ì—� ëŠ�ë‚€ 것ì�€ "High-Level Languageê°€ 왜 필요한가?" ê°€ ë�˜ê² 습니다. 사실 ì�´ ëŠ�낌ì�€ 어셈블리 시간ì—�ë�„, 컴퓨터 구조 시간ì—�ë�„ ëŠ�꼈지만 ë§�ì�´ì£ . ì�´ì œ 1/3ì •ë�„를 ì§„í–‰í–ˆê³ , 계íš�대로ë�¼ë©´ 12ì›”ì�´ ë�˜ê¸° ì „ê¹Œì§€ 1/2는 ì§„í–‰í• ìˆ˜ 있ì�„ 것 같아서 기분ì�´ 좋네요. 무사히 진행해서 ë��ì�„ 봤으면 하는 ìƒ�ê°�입니다. - ê¶Œì˜�기
1.5.1. 공부 ë‚´ìš© ¶
- Von Neumann machine (circa 1940)
Memory (data + instruction) + CPU(ALU + Registers + Control) + Input device & Output device
지금까지 기본ì �ì�¸ 논리 게ì�´íŠ¸ë¥¼ (Nandë§Œ 사용해서) êµ¬í˜„í•˜ê³ , Combinational Chip ê³¼ Sequential Chip까지 ì „ë¶€ 구현했다. 지금까지 구현한 것ì�„ 모ë‘� 합치면 Computer Architectureê°€ 만들어진다.
- The Hack Computer
A 16-bit Von Neumann platform
The instruction memory and the data memory are physically separate
Screen: 512 rows by 256 columns, black and white
Keyboard: standard
- Instruction memory(ROM)
ROM�는 미리 넣어 놓� 프로그램� 있�.
ROMì—�서는 í•ìƒ� 16bitì�˜ ëª…ë ¹ì–´ê°€ 나옴.
instruction = ROM32Kaddress
- Memory(RAM)
Data memory
�기
k = address
out = RAMk
쓰기
- CPU
- Computer (위ì�˜ ëª¨ë“ logicì�„ 다 ê°€ì§€ê³ ìžˆì�Œ)
�세한 설명� architecture � 나와있다.
k = address
x = in
load = 1
RAMk = x
Screen(memory map)
Screenì�„ 위한 RAM 어딘가를 í• ë‹¹í•´ë†“ì�Œ. ì�´ 공간ì�€ Screenì�„ 위한 공간. CPU는 ê·¸ 공간ì�„ ì�½ê±°ë‚˜ ì�¨ì„œ Screen ì¶œë ¥
x = in
load = 1
RAMk = x
Screen(memory map)
Screenì�„ 위한 RAM 어딘가를 í• ë‹¹í•´ë†“ì�Œ. ì�´ 공간ì�€ Screenì�„ 위한 공간. CPU는 ê·¸ 공간ì�„ ì�½ê±°ë‚˜ ì�¨ì„œ Screen ì¶œë ¥
Keyboard(memory map)
Keyboard를 위한 RAM 어딘가를 í• ë‹¹í•´ë†“ì�Œ. ì�´ 공간ì�€ Keyboard를 위한 공간. CPU는 ê·¸ 공간ì�„ ì�½ì–´ì„œ ì–´ë–¤ keyê°€ 들어왔는지 확ì�¸.
Keyboard를 위한 RAM 어딘가를 í• ë‹¹í•´ë†“ì�Œ. ì�´ 공간ì�€ Keyboard를 위한 공간. CPU는 ê·¸ 공간ì�„ ì�½ì–´ì„œ ì–´ë–¤ keyê°€ 들어왔는지 확ì�¸.










