분류 전체보기
-
NAND to Tetris - 3장: 순차 게이트 실습만들면서 배우기/Nand to Tetris 2021. 8. 4. 02:10
레지스터 1비트 레지스터를 만드는 방법은 아래 그림을 보면 이해가 된다. load가 0이면 MUX는 DFF의 출력을 선택한다. DFF의 출력은 다시 DFF의 입력으로 들어가고, 다음 싸이클에 출력된다. load가 1이면 MUX는 in을 선택한다. 이번에는 in이 DFF의 입력으로 들어가고, 다음 싸이클에 출력된다. CHIP Bit { IN in, load; OUT out; PARTS: Mux(a=newout, b=in, sel=load, out=muxout); DFF(in=muxout, out=out, out=newout); } 16비트 레지스터는 단순히 1비트 레지스터를 이어 붙이면 되므로 코드는 생략한다. 메모리 우선 8개의 레지스터로 이루어진 메모리를 구현해보자. 주소를 선택하여 원하는 레지스터에 ..
-
NAND to Tetris - 3장: 순차 게이트만들면서 배우기/Nand to Tetris 2021. 8. 4. 01:57
이전까지 다룬 게이트들은 모두 주어진 입력에 대해서만 계산을 할 뿐, 계산된 결과를 저장하고 나중에 다시 불러와 쓸 수는 없었다. 데이터를 저장하는 것은 플립플롭이라는 순차 게이트를 활용하여 구현할 수 있다. 플립플롭 자체의 구현은 매우 복잡해서 이 과정에서는 생략하고, 우리가 조합 게이트를 만들기 위해 NAND 게이트를 사용했던 것처럼 이번에는 플립플롭이 구현되어있다고 가정하고 진행한다. 플립플롭, 특히 우리가 사용하려는 데이터 플립플롭 (DFF)의 출력은 이전 클록 사이클의 입력이다. out(t) = in(t-1) 산 위에서 소리를 지르면 한 박자 늦게 메아리가 울리는 것을 생각하면 될 것 같다. 만들 것들 1비트 레지스터, 16비트 레지스터 플립플롭은 단순히 이전 입력을 출력할 뿐이므로 데이터를 저..
-
NAND to Tetris - 2장: Adder, Inc, ALU 실습만들면서 배우기/Nand to Tetris 2021. 8. 3. 00:39
반가산기 반가산기의 진리표를 보면 sum은 두 입력의 XOR과 같고, carry는 두 입력의 AND와 같다. 전가산기 전가산기의 구현은 다음과 같다. 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: HalfAdder(a=a, b=b, sum=sum1, carry=carry1); HalfAdder(a=sum1, b=c, sum=sum, carry=carry2); Or(a=carry1, b=carry2, out=carry); } 16비트 가산기 가장 오른쪽 비트부터 한 비트씩 전가산기로 더해가면서, carry를 다음 비트 덧셈으로 넘긴다. CHI..
-
NAND to Tetris - 2장: Adder, Inc, ALU만들면서 배우기/Nand to Tetris 2021. 8. 3. 00:23
이번 장에서는 지난 장에서 만든 게이트들을 사용하여 두 이진 수를 더하는 Adder 게이트, 입력에 1을 더한 수를 반환하는 Inc 게이트, 그리고 CPU의 모든 연산을 담당하는 아주 중요한 ALU 게이트를 만들어 볼 것이다. 불 연산으로 덧셈을 구현한다는 것은 개인적으로 신기했는데, 어떻게 했는지 같이 살펴보자. 2진수의 음수 표현 덧셈을 구현하려면 우선 2진수에서 음수를 어떻게 표현할지를 생각해봐야 한다. 왜냐하면 컴퓨터는 식 3 - 2를 사실 3 + (-2)로 계산하는데, 음수를 어떻게 표현했는지에 따라 이 계산이 조금 더 쉬워질 수도 있고 어려워질 수도 있기 때문이다. 2진수로 음수를 표현하는 방법은 3가지가 있다. 1) 부호와 크기를 표현 가장 쉬운 방법은 가장 왼쪽 비트로 양수 또는 음수인지를..
-
NAND to Tetris - 1장: 조합 게이트 실습만들면서 배우기/Nand to Tetris 2021. 8. 1. 01:39
지난 글에서 정의한 게이트 인터페이스들을 하나씩 직접 구현해보자. Not Not 게이트는 Nand 게이트 하나만으로 구현할 수 있다. x Nand x는 Not (x And x)이고, x And x는 x와 같으므로 x Nand x는 Not x와 같다. CHIP Not { IN in; OUT out; PARTS: Nand(a=in, b=in, out=out); } And And 게이트는 단순히 Nand 게이트의 결과를 뒤집으면 된다. Not 게이트는 위에서 만든 것을 가져다 쓴다. CHIP And { IN a, b; OUT out; PARTS: Nand(a=a, b=b, out=aNandb); Not(in=aNandb, out=out); } Or 드 모르간의 법칙: A Or B = Not (Not A And..
-
NAND to Tetris - 1장: 조합 게이트만들면서 배우기/Nand to Tetris 2021. 7. 31. 20:20
우리가 처음으로 만들어 볼 것은 AND, OR, NOT, XOR, MUX, DMUX 등의 불 함수의 결과를 반환하는 게이트웨이이다. 이 게이트를 만들면 다음에는 이 게이트들로 가산기와 ALU를 만들 것이다. 게이트는 트랜지스터로 만들 수 있다. 하지만 트랜지스터는 컴퓨터과학보다는 물리학의 분야이기 때문에 이 과정에서는 트랜지스터 이하 계층은 생략하고, 태초에 누군가가 트랜지스터로 NAND 게이트를 만들어 두었다고 생각하고 진행한다. 이후에 설명하겠지만, NAND 게이트 하나로 모든 게이트를 만들 수 있다. 불 함수 불 함수는 m개의 불리언 값을 입력받아 n개의 불리언 값을 반환하는 함수이다. 게이트는 이 불 함수를 물리적으로 만든 것이다. 불 함수를 표현하는 방법은 두 가지가 있다. 하나는 진리표를 이용..
-
NAND to Tetris - 서론만들면서 배우기/Nand to Tetris 2021. 7. 31. 15:39
추상화: 복잡한 시스템을 만들 수 있게 하는 힘 public class Main { public static void main(String[] args) { int a = 1; } } 위 자바 코드가 지역변수 a을 선언하고 1로 초기화한다는 것은 코딩을 해본 사람이라면 누구나 알고 있을 것이다. 하지만 더 자세하게는 어떤 일이 일어나는 걸까? 우선 자바 컴파일러가 위 코드를 컴파일하여 JVM이 이해할 수 있는 어셈블리어 코드로 바꾼다. 또 JVM은 이 어셈블리어 코드를 해석하여 0과 1로 이루어진 기계어로 바꾼다. 이 기계어를 레지스터, 메모리, ALU로 이루어진 하드웨어 아키텍처가 읽어 적절히 처리한다. 레지스터, 메모리, ALU는 모두 게이트라는 것으로 이루어져 있고, 이 게이트는 트랜지스터 같은 물..
-
반대하려면 마찬가지로 설득해야 한다내 생각 2020. 5. 19. 09:14
상사나 동료에게 어떤 새로운 아이디어를 제시하려면 우리는 당연히 적절한 근거를 가지고 그들을 설득해야한다. 그런데 우리의 아이디어가 마음에 들지 않을 경우 상대방도 마찬가지로 우리를 설득해야한다. 상사A와 상사B가 있다. 나는 2년 동안 상사A에게는 수십개의 새로운 아이디어를 제시했고 상사B에게는 많아봐야 다섯 개의 아이디어만 제시했다. 상사A에게 제시한 아이디어 중 몇 개는 실제로 받아들여졌고 어떤 것들은 회사에 긍정적으로 큰 영향을 끼치기도 했다. 하지만 상사B에게 제시한 아이디어들은 모두 죽었다. 지금 나는 상사B에게 새로운 아이디어를 제시하는 것을 완전히 포기한 상태다. 단순히 상사A가 내 아이디어를 더 수용해주는 착한 상사라는 것은 아니다. 실제로 상사A에게 제시한 아이디어들 중 대부분은 반대를..