※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.
※ 해당 게시글은 J. 클라크 스코트, 『그래서 컴퓨터는 어떻게 동작하나요?』, 지유록, 인사이트(2019) 책을 참고하였습니다.
이전 글들을 통해
ALU 연산 과정을 파악함으로써 모든 연산이 연산자만 다를 뿐 같은 방법/단계를 거쳐
처리된다는 것을 알게 되었다.
그리고 출력 결과를 안정적으로 저장하고 전달하기 위해서
누산기(ACC)라는 레지스터가 필요함을 알게 되었다.
또, 제어장치는 종합 클럭(clk, clk_d, clk_e, clk_s)과
각 작업의 순서와 타이밍을 부여해 주는 스테퍼(Stepper) 대해 탐구해 보면서
ALU 연산 과정에서 "단계(Step)"를 정의할 수 있었다.
그러면서 각 단계가 활성화하고, 비활성화하는 신호 간격 사이에
출력 제어클럭을 활성화시키고, 다시 비활성화되도록
그리고 출력 제어 클럭이 활성화하고, 비활성화하는 신호 간격 사이에
입력 제어클럭을 활성화시키고, 다시 비활성화되도록
설계하였다.
이를 통해서 각 장치로부터 안정적으로 데이터를 외부 버스(Bus)로
데이터를 전송할 수 있게 해 주거나,
버스(Bus)에 있는 데이터를 특정 장치만 받을 수 있도록 조율해 줄 수 있게 되었다.
참고로 출력제어 클럭 신호(clk_e)와 입력제어 클럭 신호(clk_s)를 포함한
종합적인 클럭에 대해서는 다음 글을 통해 구현해 볼 수 있었다.
이에 따라
산술 논리 연산을 자동화하는 것을 목적으로 설계된 초기의 컴퓨터가
연산 결과를 재사용하는 메모리 회로를 구현함으로써
컴퓨터 발전에 중요한 전환점 맞이하게 되고,
이후
각 장치들을 연결하고, 연산을 자동화하며 동기화하는 제어장치가
클럭과 스테퍼를 통해 구현되면서
또 한 번 중요한 전환점을 맞이하게 되었다.
하지만 산술 논리 장치(ALU)와 레지스터(메모리 회로) 그리고
제어장치만으로는 레지스터에 값을 직접 입력해 주어야 하고,
덧셈 연산을 제외한 뺄셈, 곱셈, 나눗셈 연산 등은
여러 개의 연산 회로를 연속적으로 사용해야 함에 따라
여러 개의 명령어가 요구되고, 이를 연속적 처리할 수 있어야 하는데
지금까지 구현한 회로는
하나의 명령어를 입력하고 해당 명령어가 처리된 후에
다음 명령어를 또다시 직접 입력해 주어야 한다는
자동화의 한계가 남아있다.
이에 따라 이번 글을 통해 자동화의 한계점을
어떻게 극복할 수 있는지 탐구해 보겠다.
< RAM (Random Access Memory) : 임의 접근 메모리 >
< 레지스터 vs RAM (Random Access Memory) >
레지스터에 입력되는 값은 'ALU 연산에 사용되는 피연산자 값' 또는,
'명령어 ( [ALU 연산 유무] + [OPcode] + [RA] + [RB] )'에 해당된다.
그러나 복잡한 연산을 위해서는 여러 개의 데이터와 명령어가 필요해지고,
이에 따라 여러 개의 데이터와 명령어를 저장할 메모리 회로가 요구된다.
이에 대해서, 그러면 기본적으로 8bit 레지스터는
한 개의 8bit 명령어 또는 한 개의 8bit 데이터(값)를 저장하므로
레지스터의 크기를 늘려 만약 256bit로 확장한다면,
여러 개의 명령어와 값을 저장할 수 있지 않을까?
<8bit 레지스터 회로 : Paul falstad 사이트 > (AND게이트로 구현한 출력제어기) |
<8bit 레지스터 회로 : logisim 프로그램> (Tri-state buffer로 구현한 출력제어기) |
하지만 단순히 레지스터 용량을 확장만 한다면 다음과 같은 문제가 발생한다.
만약 레지스터의 용량을 확장하여 여러 개의 명령어 또는 데이터(값)를
하나의 레지스터에 저장하게 된다면,
제어장치를 통해 입력되거나, 출력될 때
확장된 용량만큼 한 번에 처리되어
여러 명령어가 나누어지지 않을뿐더러,
다른 장치들도 동일한 크기로 데이터를 처리해야 하는 제약이 발생할 수 있다.
이는 결국 레지스터의 용량이 컴퓨터의 처리 단위를 결정하는
중요한 요소라 볼 수 있다.
따라서, 과학자들은 초기의 컴퓨터가 기본적으로 8bit 단위로 처리됨에 따라
8bit 레지스터를 여러 개 연결하여 사용하는 방안을 생각해 냈다.
그러나 단순히 여러 개의 레지스터들을 연결한 것이 아닌,
디코더를 결합시켜 각 레지스터마다 특정한 이진수 : 주소(Address)를
부여하여 레지스터의 물리적인 순서에 관계없이 특정 레지스터만
선택하여 사용할 수 있도록 연결하였다.
이렇게, 디코더를 결합하여 레지스터마다 부여된 특정한 이진수를
"주소(Address)"라고 불렀고, 디코더와 결합된 레지스터들을
총칭 "RAM(Random Access Memory) : 임의 접근 메모리"라고 불렀다.
RAM은 원하는 주소에 있는 레지스터에 빠르게 접근할 수 있기에
데이터와 명령어를 효율적으로 처리할 수 있도록 도와주었다.
< RAM(Random Access Memory) : 임의 접근 메모리 >
이에 따라 간단하게 4개의 레지스터를 연결한
32bit(4byte) RAM에 대한 회로를 살펴보면 다음과 같다.
< 32bit RAM >
각 레지스터는 좌표평면과 비슷하게
왼쪽 상단부터 다음과 같은 주소(신호)를 부여받음을 알 수 있다.
(X, Y = 0, 0) (X, Y = 1, 0)
(X, Y = 0, 1) (X, Y = 1, 1)
해당 주소 신호가 활성화된 레지스터만
입력 또는 출력 클럭 신호에 맞추어 값을 입력받거나, 출력할 수 있다.
< RAM 동작 과정 >
RAM에 대해 더 자세히 파악하기 위해서 RAM 동작 과정을 살펴보겠다.
다음은 8bit 레지스터 4개를 연결한 32bit RAM에 대해서
(X, Y) = (1,1), Input(Data) = 0000 0001 일 때 RAM 동작과정이다.
[1] (X, Y) = (1,1), Input(Data) = 0000 0001, clk_e = 1, clk_s = 0
(1,1)에 대응되는 레지스터가 활성화되며,
출력 클럭 신호도 활성화 되었지만
저장되어 있는 값이 없으므로 값이 출력되지 않는다.
[2] (X, Y) = (1,1), Input(Data) = 0000 0001, clk_e = 1, clk_s = 1
(1,1)에 대응되는 레지스터만 활성화되어 있는 상태에서
입력 클럭 신호가 활성화됨에 따라
Input(Data) = 0000 0001 값을 저장하고,
출력 클럭 신호도 여전히 활성화되어 있음에 따라
출력 결과(Output)가 0000 0001 임을 확인할 수 있다.
[3] (X, Y) = (1,1), Input(Data) = 0000 0000, clk_e = 1, clk_s = 0
(1,1)에 대응되는 레지스터만 활성화되어 있는 상태에서
출력 클럭 신호는 여전히 활성화되어 있지만,
입력 클럭 신호가 비활성화됨에 따라 Input(Data) 값이 변경되어도
저장된 값과 출력 결과(Output)는 여전히 0000 0001 임을 확인할 수 있다.
[4] (X, Y) = (1,1), Input(Data) = 0000 0000, clk_e = 0, clk_s = 0
(1,1)에 대응되는 레지스터만 활성화되어 있는 상태에서
출력 제어 클럭 신호도 비활성화됨에 따라
출력 결과(Output) 값이 없음을 확인할 수 있다.
<MAR>
이처럼 RAM은 다른 장치들과 마찬가지로 외부 버스(Bus)와 연결되어
데이터를 입출력하며, 제어장치의 클럭과 스테퍼와 연결되어 제어된다.
그러다 보니,
RAM의 입출력 제어기는 입력 제어 클럭 및 출력 제어 클럭에 맞추어
안정적인 타이밍에 활성화되지만,
주소를 선택하는 과정에서는 외부 버스로부터 전송된 값을 그대로 받아들이기 때문에,
잘못된 레지스터가 선택되는 문제가 발생한다.
따라서 안정적으로 주소를 받기 위해서 RAM이 입력 부분에
MAR (Memory Address Register) : 메모리 주소 레지스터가 필요하다.
< MAR + RAM >
그리고 MAR 용량은 RAM의 최대 용량을 결정하는 역할도 한다.
즉, 예를 들어 MAR이 8bit 이면 최대 2⁸개의 주소를 가지고 있는 것이므로,
이는 256개의 레지스터가 RAM을 구성하고 있는 것과 같다.
따라서 MAR의 용량은 8bit, RAM을 구성하는 레지스터들의 각 용량도 8bit 일경우
RAM의 최대 총용량은 2⁸ × 8 = 2048bit (256byte)가 된다.
<256byte RAM : 256개의 8bit 레지스터>
< PC : Progrem Counter 프로그램 카운터 >
< IAR : Instruction Address Register 명령어 주소 레지스터 >
그렇다면 데이터(값) 또는 명령어를 RAM에 입력하고, 이를 사용하는 것인데,
실질적으로 RAM에 입력은 어떻게 하며, RAM의 레지스터들을 어떻게 접근할까?
우선 초기의 컴퓨터에는 RAM에 데이터나 명령어를 스위치를 눌러 직접 입력했다.
( 후에 천공카드와 테이프 그리고 키보드 순서로 발전되었다. )
그렇게 RAM에 첫 번째 주소부터 순서대로
입력된 명령어들은 컴퓨터의 전원이 켜지면 해당 순서대로 실행된다.
이때, 입력된 명령어들을 순차적으로 실행하려면
MAR(메모리 주소 레지스터)의 입력 제어기를 활성화하여
각 주소를 입력받아 접근할 수 있어야 한다.
그렇다면 첫 명령어가 저장된 주소부터 마지막 명령어가 저장된 주소까지
주소를 출력해 줄 장치가 필요하다는 것인데,
이때 사용되는 장치가 바로
PC (Progrem Counter) [또는 IAR(Instruction Address Register)]라 불리는
레지스터이다.
해당 레지스터 PC (Progrem Counter)는 메모리 주소만을 저장한다.
대부분 명령어는 주소 0부터 저장하며,
해당 주소를 MAR에 전달해 RAM에 접근한다.
이후 명령어 또는 데이터를 명령어 레지스터(IR)로 가져온다.
그리고 PC (Progrem Counter)의 값을 +1 증가시켜
다음 명령어가 담긴 주소를 가리키도록 한다.
(이때 명령어 중 PC을 변경하는 명령어가 존재하며, 이에 따라 주소를 임의로 지정할 수도 있다.)
< 실질적인 RAM을 이용한 ALU 연산 과정 >
이전에 살펴보았던 ALU의 연산 과정을 다시 한번 살펴보면 다음과 같다.
[1 단계]
A레지스터 출력 제어기 활성화
→ ALU의 입력제어기 활성화
→ ALU 입력제어기 비활성화 →
A 레지스터 출력 제어기 비활성화
[2 단계]
B 레지스터 출력 제어기 활성화
→ [연산 바로 진행]
→ 연산 결과 저장 레지스터(ACC) 입력 제어기 활성화
→ 연산 결과 저장 레지스터(ACC) 입력 제어기 비활성화 →
B 레지스터 출력 제어기 비활성화
[3 단계]
연산 결과 저장 레지스터(누산기 : ACC) 출력 제어기 활성화
→ A 레지스터 입력제어기 활성화
→ A 레지스터 입력제어기 비활성화 →
연산 결과 저장 레지스터(누산기 : ACC) 출력 제어기 비활성화
이와 같이 3단계를 통해 ALU 연산이 이루어지며
만약 디코더를 이용해 각 장치와 연결된
특정 이진수 신호와 OPcode, 그리고 입출력 제어 신호 클럭,
추가로 스테퍼에서
임의의 RA:A레지스터 신호,
임의의 RB:B레지스터 신호,
임의의 ALU 연산 신호,
를 각 단계에 맞게 연결하면
사용자가 입력한 명령어에 따라 대응되는 단계에, 대응되는 장치가,
클럭에 맞추어 대응되는 연산이 진행될 것이다.
[STEP 1]
STEP1 신호[A레지스터] and 출력 제어 클럭 신호(clk_e) and A레지스터 선택 코드[00~11]
TEP1 신호[ALU입력] and 입력 제어 클럭 신호[clk_s] and ALU 연산 코드 [1]
[STEP 2]
STEP2 신호[B레지스터] and 출력 제어 클럭 신호(clk_e) and B레지스터 선택 코드(00~11)
STEP2 ACC레지스터 신호 and 입력 제어 클럭 신호(clk_s) and [ALU 연산] 코드[1]
STEP2 OPcode 입력 신호 and OPcode (000~111) and [ALU 연산] 코드[1]
[STEP 3]
STEP 3 ACC레지스터 신호 and 출력 제어 클럭 신호(clk_e) and ALU 연산 코드[1]
STEP 3A레지스터 신호 and 입력 제어 클럭 신호(clk_s) and [피연산자_1] 레지스터 선택 코드
[STEP 4]
초기화
하지만 실질적으로는 초기에 레지스터에는 아무 값도 없으며,
RAM으로부터 명령어와 피연산자(/데이터/값)를 받아온 후에야
위의 과정을 진행할 수 있다.
이에 따라 다시 단계를 나누어 보면 다음과 같다.
[1 단계]
PC(Progrem Counter) 출력 제어기 활성화 + [SET 1 활성화]
→ MAR 입력제어기 활성화 + [ACC 입력제어기 활성화]
→ MAR 입력제어기 비활성화 + [ACC 입력제어기 비활성화] →
PC(Progrem Counter) 출력 제어기 비활성화 + [SET 1 비활성화]
[2 단계]
MAR 출력 제어기 활성화 →
IR 입력제어기 활성화 →
IR 입력제어기 비활성화 →
MAR 레지스터 출력 제어기 비활성화
[3 단계]
ACC 출력 제어기 활성화 →
PC 입력제어기 활성화 →
PC 입력제어기 비활성화 →
ACC 출력 제어기 비활성화
[4 단계]
A레지스터 출력 제어기 활성화
→ ALU의 입력제어기 활성화
→ ALU 입력제어기 비활성화 →
A 레지스터 출력 제어기 비활성화
[5 단계]
B 레지스터 출력 제어기 활성화
→ [연산 바로 진행]
→ 연산 결과 저장 레지스터(ACC) 입력 제어기 활성화
→ 연산 결과 저장 레지스터(ACC) 입력 제어기 비활성화 →
B 레지스터 출력 제어기 비활성화
[6 단계]
연산 결과 저장 레지스터(누산기 : ACC) 출력 제어기 활성화
→ A 레지스터 입력제어기 활성화
→ A 레지스터 입력제어기 비활성화 →
연산 결과 저장 레지스터(누산기 : ACC) 출력 제어기 비활성화
[7단계]
초기화
이때 [SET 1] 장치에 대해서, 해당 장치에 신호를 주면
ALU에 A의 값을 1로 설정해 주는 기능을 한다.
[SET 1] 스테퍼의 한 사이클(STEP 1 ~ STEP 7) 동안,
명령어를 수행하면서 추가적으로 IAR의 값을 +1 증가시킬 수 있다.
자세한 내용은 후에 알아보겠다.
그래서 RAM을 포함한 ALU 연산 과정에 대해서
스테퍼의 단계 신호와 클럭 신호를 연결하면 다음과 같다.
[STEP 1]
PC(Progrem Counter) 출력 제어기 : STEP 1 신호 and 출력 제어 클럭 신호(clk_e)
[SET 1] : STEP 1 신호 and 출력 제어 클럭 신호(clk_e)
MAR 입력제어기 : STEP 1 신호 and 입력 제어 클럭 신호(clk_s)
[ACC 입력제어기] : STEP 1 신호 and 입력 제어 클럭 신호(clk_s)
[STEP 2]
MAR 출력 제어기 : STEP 2 신호 and 출력 제어 클럭 신호(clk_e)
IR 입력 제어기 : STEP 2 신호 and 입력 제어 클럭 신호(clk_s)
[STEP 3]
ACC 출력 제어기 : STEP 3 신호 and 출력 제어 클럭 신호(clk_e)
IR 입력 제어기 : STEP 3 신호 and 입력 제어 클럭 신호(clk_s)
[STEP 4]
STEP 4 신호[A레지스터] and 출력 제어 클럭 신호(clk_e) and A레지스터 선택 코드[00~11]
STEP 4 신호[ALU입력] and 입력 제어 클럭 신호[clk_s] and ALU 연산 코드 [1]
[STEP 5]
STEP 5 신호[B레지스터] and 출력 제어 클럭 신호(clk_e) and B레지스터 선택 코드(00~11)
STEP 5 ACC레지스터 신호 and 입력 제어 클럭 신호(clk_s) and [ALU 연산] 코드[1]
STEP 5 OPcode 입력 신호 and OPcode (000~111) and [ALU 연산] 코드[1]
[STEP 6]
STEP 6 ACC레지스터 신호 and 출력 제어 클럭 신호(clk_e) and ALU 연산 코드[1]
STEP 6A레지스터 신호 and 입력 제어 클럭 신호(clk_s) and [피연산자_1] 레지스터 선택 코드
[STEP 7]
초기화
이에 따라 해당 동작과정을 회로로 구현하기 위해서는
[SET 1] 장치와 STEP 7까지 확장한 스테퍼를 구현해야 한다.
< SET 1 >
그래서 우선 [SET 1] 장치에 대해 알아보면 우선 회로는 다음과 같다.
SET 1 장치는 ALU 입력제어기를 통과한 후에 위치해 있으며
Tri-state buffer 소자를 사용하여 해당 장치로 신호’ 1’이 들어올 경우
ALU입력제어기로부터 출력된 값(A)을 무시하고,
무조건 ‘1’이라는 값으로 변경하여 출력한다.
반대로 만약 [SET 1] 장치에 신호’ 0’이 들어올 경우,
기존 그대로 ALU 입력제어기로부터 출력된 값(A)을 출력한다.
<SET 1 기호>
※Tri-state buffer에 대한 내용은 다음과 같다.
(1)
Tri-state buffer는 트랜지스터와 같이 화학적 제조를 거쳐 구현된 특수 소자이다.
(2)
Tri-state buffer는 사실상 물리적 스위치 역할과도 같은 특수 트랜지스터이다.
물리적 스위치는 크기가 매우 크고 직접 조작해야 한다는 단점이 있다.
(3)
Tri-state buffer는 전류 흐름, 전류 아주 살짝 흐름, 전류 완전 차단 이렇게 3가지 기능이 있다.
(4)
Tri-state buffer는 대부분 출력제어기로 사용된다.
(5)
게이트를 구현하는 데 사용되는 트랜지스터는
구조적 한계로 OFF여도 일부 전류가 누설된다.
하지만 동일한 연산을 하였을 때 일반 트랜지스터가 비용과 전력소비
그리고 속도와 크기 등에 있어서 Tri-state buffer보다 효율적이다.
< 스테퍼 확장 (STEP 1 ~ STEP 4) ⇒ (STEP 1 ~ STEP 7) >
이어서 기존 스테퍼 (STEP 1 ~ STEP 4)에서
(STEP 1 ~ STEP 7)까지 확장한 회로는 다음과 같다.
기능은 기존 스테퍼와 같다.
< 산술논리장치(ALU) + 제어장치(스테퍼, 클럭) + 레지스터 + RAM >
그러면 다음 과정을 바탕으로
[STEP 1]
PC(Progrem Counter) 출력 제어기 : STEP 1 신호 and 출력 제어 클럭 신호(clk_e)
[SET 1] : STEP 1 신호 and 출력 제어 클럭 신호(clk_e)
MAR 입력제어기 : STEP 1 신호 and 입력 제어 클럭 신호(clk_s)
[ACC 입력제어기] : STEP 1 신호 and 입력 제어 클럭 신호(clk_s)
[STEP 2]
MAR 출력 제어기 : STEP 2 신호 and 출력 제어 클럭 신호(clk_e)
IR 입력 제어기 : STEP 2 신호 and 입력 제어 클럭 신호(clk_s)
[STEP 3]
ACC 출력 제어기 : STEP 3 신호 and 출력 제어 클럭 신호(clk_e)
IR 입력 제어기 : STEP 3 신호 and 입력 제어 클럭 신호(clk_s)
[STEP 4]
STEP 4 신호[A레지스터] and 출력 제어 클럭 신호(clk_e) and A레지스터 선택 코드[00~11]
STEP 4 신호[ALU입력] and 입력 제어 클럭 신호[clk_s] and ALU 연산 코드 [1]
[STEP 5]
STEP 5 신호[B레지스터] and 출력 제어 클럭 신호(clk_e) and B레지스터 선택 코드(00~11)
STEP 5 ACC레지스터 신호 and 입력 제어 클럭 신호(clk_s) and [ALU 연산] 코드[1]
STEP 5 OPcode 입력 신호 and OPcode (000~111) and [ALU 연산] 코드[1]
[STEP 6]
STEP 6 ACC레지스터 신호 and 출력 제어 클럭 신호(clk_e) and ALU 연산 코드[1]
STEP 6A레지스터 신호 and 입력 제어 클럭 신호(clk_s) and [피연산자_1] 레지스터 선택 코드
[STEP 7]
초기화
완성된 산술논리장치와 확장된 제어장치,
그리고 레지스터에 추가로 RAM(MAR+PC)까지 연결하면
다음과 같은 회로를 확인할 수 있다.
하지만 해당회로는 동작할 수 없다.
왜냐하면 logisim 프로그램을 통해 지금까지
구현한 회로들을 기호로 추상화하였기에
메모리와 레지스터 내부에 있는 스위치를 직접적으로도 조작할 수 없는 상태이다.
이에 따라 다음과 같은 초기화 문제가 발생한다.
(1)
모든 레지스터는 0으로 초기화해야 한다. (8bit 일경우 0000 0000)
(2)
PC(Progrem Counter) 역시 RAM의 가장 처음 주소를 가리키도록 초기화해야 한다.
(8bit 일 경우 x:0000, y:0000으로 초기화해야 한다.)
(3)
RAM(Random Access Memory)에서 해당 주소에는
실행할 명령어가 존재해야 한다. (명령어 초기화)
등등
따라서 이를 해결하기 위해서는 logisim에서
기본적으로 제공해 주는 레지스터와 RAM을 이용해야 한다.
< 최종 정리 >
이번 글까지 포함하여 요약하면
(1)
컴퓨터는 프로그램을 동작시키는 기계이며
(2)
프로그램은 스위치 회로에 대응되는 이진수들의 집합이었음을 알고
(3)
스위치 회로는 부울 대수를 통해 이해하고 표현할 수 있음을 알고
(4)
이에 따라 부울 대수에서 제공되는 연산자들도
스위치 회로로 구현할 수 있음을 알고,
그렇게 스위치 회로로 구현된 부울 대수 연산자들이
‘게이트’ 라 불림을 알게 되고,
(5)
NOT, XOR게이트는 스위치 회로만으로는
구현할 수 없는 한계가 있음을 파악하여,
그 한계를 극복시켜 줄 릴레이 회로를 알게 되고,
(6)
NAND 게이트만으로 다른 게이트들을 모두 구현할 수 있음을 알게 되고,
(7)
컴퓨터는 초기에 산술 논리 연산을 자동화하고자 설계되었다는 것을 알게 되고,
(8)
이에 따라 덧셈, 뺄셈, 곱셈, 나눗셈 연산을 하기 위해서는 메모리가 필요하고,
또 자동화하기 위해서는 제어장치와 메모리 회로(레지스터)가 필요함을 알게 되고
(9)
그리고 메모리 장치와 제어장치와 결합하여 효율적으로
연산을 위해서는 우선 산술 논리 장치(ALU)를 형성해야 함을 알고 구현해 보았고,
(10)
이어서 자동화를 위해 제어장치에 대해 알아보았고,
그 결과 클럭과 스테퍼로 구성되어 있음을 알게 되고
(11)
클럭과 스테퍼를 구현함으로써 제어장치를 구현하였지만,
여러 명령어를 수행하기 위해서는 RAM(Random Access Memory)이라는
메모리 회로가 필요함을 알게 되고
(12) 이에 따라 RAM 동작과정을 파악하고 구현해 볼 수 있었다.
그래서 컴퓨터가 동작하기 위해 기본적으로 필요한
산술 논리 장치(ALU), 제어장치(CU : Control Unit), RAM(Random Access Memoryt)
등에 대해서 각 장치가 어떻게, 어떤 부품들을 통해서 구현되고,
또, 어떻게 동작하는지는 파악하여
최종적으로 컴퓨터가 어떻게 동작하는지 그 원리를 알 수 있게 되었다.
※만약 logisim 시뮬레이션을 통해서 지금까지 구현한 장치들을 모두 결합하여
실질적인 컴퓨터의 동작과정을 보고 싶다면
logisim에서 제공되는 레지스터와 RAM을 통해 다시 구현하기를 바란다.
다음 글의 주제는 컴퓨터 동작 원리 넘어
키보드와 모니터 등 입력 장치와 출력 장치에 대해 탐구해 볼 것 같다.
※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.
※ 해당 게시글은 J. 클라크 스코트, 『그래서 컴퓨터는 어떻게 동작하나요?』, 지유록, 인사이트(2019) 책을 참고하였습니다.