View
이 글은 insight 출판사의 [밑바닥부터 만드는 컴퓨팅 시스템 / The Elements of Computing System]이라는 책에 있는 프로젝트(과제) 를 수행하는 글입니다. 과제 수행을 위한 언어로 C#을 선택했지만, Java와 거의 유사하여 Java를 알면 쉽게 이해할만한 코드들이예요.
해외에서는 Nand2Tetris라는 이름으로 더 잘 알려져있는 프로젝트입니다. 내용은 동일하니 참고해주세요!
그림을 아이패드가 아니라 갤럭시노트로 그려서 넣는게 쉽지가 않네요!! ㅋㅋㅋㅋ 엉성하게 보이는 그림들 ㅠㅠ 얼른 필기노트를 스캔해서 올리고싶슴당!
앞 장에서 공부한 칩들은 입력값의 조합에 의존하는 조합 칩 (Combinational Chip)이다. 이 칩들에는 상태유지의 기능이 없다. 시간이 지나도 데이터가 저장되고 불러올 수 있는 메모리 소자가 필요하다. 이를 순차 칩 (Sequentioal Chip)으로 구현한다.
Flip-Flop이라는 저수준의 순차게이트는 동기화_Syncronization, 클로킹_Clocking, 피드백 루프_Feedback Loop 등의 특성을 가지고 있다. 이번 장에서는 이 특성을 이해하고 2진셀_Binary Cell, 레지스터_Register, 메모리뱅크_Memory Bank, 계수기_Counter을 설계해보자.
배경
클록 Clock (CLK)
기억(저장)은 시간에 관련된 행위이다. 따라서 시간 진행을 나타내는 도구가 필요하다.
보통은 마스터 클록_Master Clock에서 신호를 발생시켜 시간을 진행시킨다. 이는 발진기_Oscillator로 구현한다. 이 신호가 모든 순차칩에게 동시에 전달된다.
플립플롭 Flip-Flop (데이터 플립플롭 DFF)
In 값과 CLK 값을 조합하여 Out값을 반환한다. Out(t) = In(t-1) : 이전 시간의 입력을 출력한다.
DFF를 통해 2진셀, 레지스터, RAM까지 만들 수 있다. 따라서 DFF는 상태유지 HW의 기초가 된다.
레지스터 Register
시간이 지나도 값을 저장 및 로드할 수 있는 장치. Out(t) = Out(t-1) ( cf) DFF는 전 입력을 출력한다. - Out(t) = In(t-1) )
내부 핀의 입력원은 하나여야 하므로, MUX를 이용해 Load Bit에 따라 In 값을 저장하거나 내부 값을 유지시킨다. 저장/로드의 시점이 정확해지기 위해 MUX를 사용한다.
1Bit 레지스터를 필요한 만큼 배열하면 멀티비트 레지스터가 된다. 이때 한 레지스터 배열이 저장하는 Bit 수를 Width 라 한다. 보통 이 크기를 Word_단어 라고 칭한다. (32Bit 프로세서의 Word는 32Bit, 64Bit 프로세서의 Word는 64Bit)
메모리 Memory
RAM-Random Access Memory 임의 접근 메모리
레지스터를 여러개 쌓아올려서 만든 메모리뱅크. 순서에 상관없이 메모리 어느 곳이든 같은 속도로 접근 가능하다는 의미에서 임의_random라고 부른다. 저장하지 않을 때 (load=0) address가 들어오면 선택한 레지스터의 값을 반환한다. 저장할 때 (load=1) address가 들어오면 다음 Cycle 부터 In의 값을 레지스터에 저장하고 값을 출력한다.
보통 RAM은 64Bit / 32Bit의 Width와 수억만 개의 Size를 가진다.
계수기 Counter
매 시간마다 내부상태 값을 증가시킨다. Out(t) = Out(t-1) + C
Program Counter가 적절한 예시이다! (어셈블리때 공부한당)
일반적으로 Counter에는 0으로 값을 초기화하거나 새로운 C 값을 입력하거나 합 대신 차를 하는 기능도 있다.
시간
위 칩들은 모두 Sequential하다; 하나 이상의 DFF게이트와 Feedback Loop를 이용한다. 만약 조합 칩이라면 출력이 입력을, 입력이 출력을 따르게 되어 자기 자신이 자신을 따르게 되는 문제가 발생한다. 순차 칩은 CLOCK을 이용하여 시간을 따르기 때문에 Feedback Loop에 의한 데이터 레이스 _Data Race를 피할 수 있다.
순차 칩의 출력은 클록 사이클이 넘어갈 때만 바뀔 수 있다. 다시 말하자면 이산화 discretization 되어있다. 이를 통해 전체 컴퓨터 구조를 동기화시킬 수 있다. 구조에서 가장 긴 경로로 데이터가 이동하는데 걸리는 시간을 한 Clock Cycle 길이보다 짧아지도록 시간 텀을 Clock에 지정해주면 가까이 있는 레지스터 값과 멀리 있는 레지스터 값의 연산결과가 유효하게 된다. 만약 조합칩이였다면 시간관계없이 연산이 진행되므로 멀리 있는 데이터가 도달하기 전까지의 연산결과는 무효할 것이다.
명세
데이터 플립플롭 DFF
Nand 게이트처럼 매우 중요하고 기본적인 게이트이다. 수많은 조합칩의 기본이 된다.
Clock Cycle에 따라 동시에 값이 설정되고 출력된다. 그 외의 시간에는 DFF가 잠금_latch 상태가 되어 값이 고정된다. HW적으로 마스터 CLK의 신호를 모든 DFF에게 동시에 전달하여 동기화를 꾀한다. (Sequential 해진다!)
레지스터 Register
Bit / 2진 셀이라 칭하는 1 Bit 레지스터는 1개의 정보비트를 저장하는 소자이다. Load Bit의 값에 따라 In을 저장할 지, 내부 값을 계속 출력할 지가 결정된다.
레지스터는 단순히 2진 셀의 멀티버스 버전으로, 2진 셀과 작동방식이 완전히 같다.
메모리 Memory
n개의 W-Bit 레지스터를 쌓아올려 RAM을 만들 수 있다. (n : size, W : width = word)
address에 레지스터 번호를 신호로 넣으면 해당 레지스터의 값이 반환된다. 이 작업은 조합연산으로 CLK의 영향을 받지는 않는다. In에 저장할 데이터를 보내고 Load Bit의 값을 1로 바꾸면 해당 레지스터 주소의 레지스터에 입력한 데이터가 저장된다. 이후 그 데이터를 출력한다.
계수기 Counter
구현
플립플롭
DFF는 저수준의 논리게이트만으로도 구현이 가능하다. Nand 게이트 만으로도 구현할 수 있다. 그러나 DFF 역시 기본게이트로 취급한다.
1 Bit 레지스터 (2진 셀)
레지스터
8-레지스터 메모리
n-레지스터 메모리
Address가 3282F3이라면 328은 어느 RAM8인지 ... Address(1), 2F3은 RAM8의 어느 위치에 있는지 ... Address(2)를 가리키는지 분리해서 생각하자. 이를 통해 MUX, DMUX의 설계복잡도를 낮출 수 있다.만약에 이를 일일이 가리켰다면 MUX와 DMUX의 Select가 24Bit이고, 배선의 수가 2^24개에 달할 정도로 무지막지하게 복잡해진다.
계수기 Counter
Load Bit -> In 값을 저장한다
Reset Bit -> 값을 0으로 초기화한다.
Inc Bit -> 계수를 더하도록 설정한다. (시작 신호)
C_계수 -> 한 사이클마다 더해지는 수
정리
플립플롭은 설명한 모든 메모리 시스템의 기본 틀이다. 플립플롭에 대해서 더 자세히 찾아보려면 교과서를 꼭 찾아보자. (논리회로 시간에 공부할 수 있었슴당!)
물론 현대의 메모리장치는 플립플롭이 아닌 다른 더 세밀하고 최적화된 기술을 사용한다. 이때 비용과 성능을 고려하여 기술을 선택하게 된다. 그러나 플립플롭을 이용하는 것이 가장 표준적인 방법이다!
'학부생 CS > Elements of Comp-Sys' 카테고리의 다른 글
5. Computer Architecture - [밑바닥부터 만드는 컴퓨팅 시스템] (0) | 2019.11.24 |
---|---|
4. Machine Language - [밑바닥부터 만드는 컴퓨팅 시스템] (0) | 2019.11.23 |
2. Boolean Arithmetic - [밑바닥부터 만드는 컴퓨팅 시스템] (0) | 2019.11.23 |
1. Boolean Logic - [밑바닥부터 만드는 컴퓨팅 시스템] (0) | 2019.11.23 |
0. 새로운 공부 - [밑바닥부터 만드는 컴퓨팅 시스템] (0) | 2019.11.19 |