-
NAND to Tetris - 3장: 순차 게이트만들면서 배우기/Nand to Tetris 2021. 8. 4. 01:57
이전까지 다룬 게이트들은 모두 주어진 입력에 대해서만 계산을 할 뿐, 계산된 결과를 저장하고 나중에 다시 불러와 쓸 수는 없었다. 데이터를 저장하는 것은 플립플롭이라는 순차 게이트를 활용하여 구현할 수 있다. 플립플롭 자체의 구현은 매우 복잡해서 이 과정에서는 생략하고, 우리가 조합 게이트를 만들기 위해 NAND 게이트를 사용했던 것처럼 이번에는 플립플롭이 구현되어있다고 가정하고 진행한다. 플립플롭, 특히 우리가 사용하려는 데이터 플립플롭 (DFF)의 출력은 이전 클록 사이클의 입력이다.
out(t) = in(t-1)
산 위에서 소리를 지르면 한 박자 늦게 메아리가 울리는 것을 생각하면 될 것 같다.
만들 것들
1비트 레지스터, 16비트 레지스터
플립플롭은 단순히 이전 입력을 출력할 뿐이므로 데이터를 저장하거나 불러오려면 추가 구현이 필요하다. 이런 기능을 할 수 있는 가장 작은 단위의 게이트가 바로 레지스터이다. 우리는 플립플롭을 사용하여 1비트 레지스터를 만들고 이를 여러 개 조합하여 16비트 레지스터를 만들 것이다. 레지스터의 비트 수를 폭 (width)라고 하며, 이 비트 수만큼 레지스터에 저장된 데이터들을 워드라고 부른다.
레지스터는 두 개의 입력 비트 in과 load가 있다. load는 제어 비트로써, load가 1이면 레지스터의 출력은 in(t-1)이고 load가 0이면 레지스터의 출력은 out(t-1)이다. 즉, load가 1이면 새로운 값을 저장하는 것이고 load가 0이면 저장된 값을 읽는 것이다.
메모리
메모리 (RAM)는 여러 개의 레지스터를 합치고 주소 값을 통해 특정 레지스터의 값을 읽거나 쓸 수 있는 장치이다. Random Access Memory라는 이름의 의미는 읽고 쓰려는 레지스터가 물리적으로 어디에 위치해 있는지 상관없이 접근 시간이 일정하다는 뜻이다. 메모리는 in, load, address 세 개의 입력을 받아 address에 위치한 레지스터에서 읽기 또는 쓰기를 하여 결과를 반환한다.
메모리의 크기를 나타내는 변수는 2개가 있다. 하나는 위에서 말한 레지스터의 폭과 다른 하나는 레지스터의 개수이다. 우리는 16비트 레지스터 8개로 이루어진 메모리부터 시작하여 점진적으로 64K (= 65536)개의 레지스터로 이루어진 메모리까지 확장해 나갈 것이다.
프로그램 카운터 (PC)
프로그램 카운터는 CPU가 다음에 실행할 명령어의 주소를 전달해주는 역할을 한다. 일반적으로는 이전 주소값에 +1을 하여 반환하지만, 루프, 함수 등을 실행하면 새로운 주소에서 시작되기도 한다. 따라서 새로운 주소를 쓸 수도 있도록 만들어야 한다. 우리가 만들 프로그램 카운터의 정확한 스팩은 다음과 같다.
if (reset[t] == 1) out[t+1] = 0 else if (load[t] == 1) out[t+1] = in[t] else if (inc[t] == 1) out[t+1] = out[t] + 1 (integer addition) else out[t+1] = out[t]
'만들면서 배우기 > Nand to Tetris' 카테고리의 다른 글
NAND to Tetris - 3장: 순차 게이트 실습 (0) 2021.08.04 NAND to Tetris - 2장: Adder, Inc, ALU 실습 (0) 2021.08.03 NAND to Tetris - 2장: Adder, Inc, ALU (0) 2021.08.03 NAND to Tetris - 1장: 조합 게이트 실습 (0) 2021.08.01 NAND to Tetris - 1장: 조합 게이트 (0) 2021.07.31