[無에서 시작하는 컴퓨터&과학]

[컴퓨터][26] 산술논리장치, 제어장치, RAM 총정리 및 CPU 구현 (ALU : Arithmetic Logic Unit, CU : Contol Unit, RAM : Random Access Memory, Central Processing Unit)

core-basic 2024. 10. 25. 20:48
728x90

※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.
※ 해당 게시글은 J. 클라크 스코트, 『그래서 컴퓨터는 어떻게 동작하나요?』, 지유록, 인사이트(2019) 책을 참고하였습니다

※ 2024-11-28, 8bit 전가산기 회로에서 최상위 비트 부분 회로 오류(합, 자리올림 위치 변경)를 수정하여 이미지 재업로드
※ 2024-11-28, ALU 회로에서 자리 올림 출력(CO) 부분 회로 오류(OR 게이트 누락)를 수정하여 ALU 이미지 재업로드 


이전 글들을 통해서

컴퓨터의 기본적이고 필수 구성요소인

산술논리장치 (ALU : Arithmetic Logic Unit)
제어장치 (CU : Contol Unit)
임의 접근 메모리 (Random Access Memory)

등을 logisim 프로그램과, Paul falstad 사이트를 통해

구현하면서 기본적인 컴퓨터의 원리와 동작과정을 파악하였다.

 

처음 글을 작성할 때는 전자, 스위치, 릴레이 단위로 구현하다 보니

Paul falstad 사이트를 주로 사용하게 되었다.

Paul falstad  사이트는 전자의 움직임을 확인할 수 있어서,

시각적 측면에서 더욱 좋게 느껴짐에 따라 초반에 주로 사용하게 되었다.

 

하지만 회로의 복잡성이 증가하면서

logisim 프로그램을 사용하는 것이 회로를 기호화 및 간략화하는데

더 유용함에 따라 중후반부터는 logisim 프로그램을  주로 사용하게 되었다.

 

그래서 logisim 프로그램을 통해

자체적으로 제작한
산술논리장치 (ALU : Arithmetic Logic Unit)
제어장치 (CU : Contol Unit)
임의 접근 메모리 (Random Access Memory)

등을 결합하여 컴퓨터를 구현하였지만,

레지스터 초기화 문제 등으로 

logisim 프로그램에서 기본적으로 제공하는 레지스터를 사용하지 않는 이상

실질적인 전체적인 동작 과정을 확인하지는 못했다.

 

[컴퓨터][25] RAM (Random Access Memory : 임의 접근 메모리)

※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.※ 해당 게시글은 J. 클라크 스코트, 『그래서 컴퓨터는 어떻게 동작하나요?』, 지유록, 인사이트(2019) 책

core-basic.tistory.com

 

따라서 이번 글을 통해

logisim에서 기본적으로 제공하는 레지스터를 사용하여

산술논리장치와 제어장치 그리고 RAM을 구현해 보고

실질적인 CPU의 동작과정을 탐구해 보겠다.

< CPU 구현 >


< 산술 논리 장치 (ALU : Arithmetic Logic Unit) >

컴퓨터는 초기에 산술논리를 자동화하기 위해 설계되었다.

이에 따라 가장 먼저 산술논리 장치(ALU : Arithmetic Logic Unit)를 구현했다.

이때 데이터 처리 단위는 8bit를 기준으로 한다.

 컴퓨터는 2진수를 사용하므로, 2의 거듭제곱 단위로 연산하는 것이 효율적이었다.
그래서 초기에는 8bit 단위로 연산하고 데이터를 처리하는 것이 경제적이고
성능 면에서도 효율적이었고, 설계 측면에서도 최적화할 수 있었다.

< 논리 연산 >

 

1. AND

[스위치 회로를 통해 1bit AND 연산기 구현]

더보기
※ 해당 이미지는 Paul falstad 사이트를 통해 제작하였습니다.

 

[게이트를 통해 1bit AND 연산기 구현]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[게이트를 통해 8bit AND 연산기 구현]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[8bit AND 연산 기호 자체 제작]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

2. OR

[스위치 회로를 통해 1bit OR 연산기 구현]

더보기
※ 해당 이미지는 Paul falstad 사이트를 통해 제작하였습니다.

 

[게이트를 통해 1bit OR 연산기 구현]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[게이트를 통해 8bit OR 연산기 구현]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[8bit OR 연산 기호 자체 제작]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

3. NOT

[스위치/릴레이 회로를 통해 1bit NOT 연산기 구현]

더보기
※ 해당 이미지는 Paul falstad 사이트를 통해 제작하였습니다.

 

[게이트를 통해 1bit NOT 연산기 구현]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[게이트를 통해 8bit NOT 연산기 구현]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[8bit NOT 연산기 기호 자체 제작]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

4. XOR

[스위치/릴레이 회로를 통해 1bit XOR 연산기 구현]

더보기
※ 해당 이미지는 Paul falstad 사이트를 통해 제작하였습니다.

 

[게이트를 통해 1bit XOR 연산기 구현]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[게이트를 통해 8bit XOR 연산기 구현]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[8bit XOR 연산 자체제작 기호]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

※ NAND, NOR, NXOR은 각각 AND/OR/XOR 연산 결과에 NOT을 적용한 한 것과 동일하므로, ALU에서 제거한다.
※ 실질적으로는 NAND, NOR 게이트만으로 모든 게이트를 구현할 수 있기 때문에 구현한 것과 반대로 NAND 게이트와 NOR 게이트만 사용한다.

< 산술 연산 >

스위치 회로는 전류가 흐르거나, 흐리지 않거나

두 가지 논리 상태를 기반으로 작동한다.

이에 따라, 논리를 피연산자로 사용하는 부울 대수를 통해

수학적으로 회로를 설계할 수 있다.

 

그러나 산술 연산(덧셈, 뺄셈, 곱셈, 나눗셈 등)은

피연산자로 ‘숫자’를 사용하기 때문에

논리 기반인 스위치 회로로 산술 연산을 구현하기 어렵다.

 

그래서 이를 해결하고자

스위치 회로의 두 논리 상태를 이진법의 두 숫자(0,1)에 대응시켰다.

두 숫자(0,1)만으로 모든 숫자를 표현할 수 있는 ‘이진법’을 사용하여

덧셈, 뺄셈, 곱셈, 나눗셈 등 연산 과정을 파악한 후,

이를 다시 부울 대수로 변환하여 산술 연산 회로를 설계할 수 있기 때문이다.

 

1. 덧셈

이진법의 덧셈 과정은 XOR, AND 게이트로 구현할 수 있다.

※ 이진수 덧셈 원리에 대한 자세한 내용은 다음글을 따른다.

 

[컴퓨터][14] 산술/논리 연산 회로 - 2 (덧셈 회로 : 전가산기, 8bit 전가산기)

※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.이전 글을 통해서컴퓨터는 초기에 산술/논리 연산 등 수학적 계산을 자동화하고자 설계되었고,이에 따라 산술/논

core-basic.tistory.com

[1bit 반가산기(덧셈회로) 구현]

더보기
※ 해당 이미지는 Paul falstad 사이트를 통해 제작하였습니다.

 

[1bit 전가산기(덧셈회로) 구현]

더보기
※ 해당 이미지는 Paul falstad 사이트를 통해 제작하였습니다.

 

[1bit 전가산기(덧셈회로) 자체제작 기호]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[8bit 전가산기(덧셈회로) 구현]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[8bit 덧셈 회로 (전가산기) 기호 자체 제작 ]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

2. 뺄셈

이진법의 뺄셈 과정은 A - B에 대해서 A + (-B)의 형태로 변환하여

덧셈과 동일한 과정으로 처리한다.

이를 위해 회로 내에서 표현할 수 있는 숫자의 범위를

반으로 나누어 양수와 음수로 표현한다.

 

예를 들어 회로 내에서 회로 시스템이 8bit일 때

0~255까지의 숫자를 표현할 수 있다.

이에 대해 두 부분으로 나누어

양수 : [0 ~ 127 = 0 ~ 127],

음수 : [128 ~ 255 = -128 ~ -1]

로 표현한다.

이는 덧셈 결과가 8bit를 초과할 경우 초과된 부분은

무시하기 때문에 뺄셈과 같은 효과를 준다.

따라서 0부터 계속 +1 씩 더하면

값이 0,1,…126,127,-128,-127,…-2,-1 순으로 순환하게 된다.

 

[2의 보수]

이때 A - B에 대해서

A + (-B) 즉, 1(0000 0001)을 -1로(1111 1111)로 변환하기 위해

2의 보수라는 수학적 방법을 이용한다.

그리고 2의 보수는 XOR 게이트와 +1을 더해주는 것으로 표현할 수 있다.

 

※ 이진수 뺄셈 원리에 대한 자세한 내용은 다음글을 따른다.

 

[컴퓨터][15] 산술/논리 연산 회로 - 3 (뺄셈 회로와 2의 보수)

※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.이전 글을 통해서컴퓨터는 초기에 산술/논리 연산 등 수학적 계산을 자동화하고자 설계되었음에 따라, 기본적인

core-basic.tistory.com

 

[8bit 뺄셈 회로]
ex) 0001 0101(21) - 0000 1111(15) = 0000 0110(6)

더보기
※ 해당 이미지는 Paul falstad 사이트를 통해 제작하였습니다.

 

※ [8bit 뺄셈 회로]는 [8 Bit XOR 연산기], [8bit 덧셈 회로(전가산기)]로 구현될 수 있다.
※ 하지만 ALU 회로의 구성의 최소화 및 효율성을 위해 별도의 뺄셈회로를 구현하기보다는 전가산기와 XOR 연산기를 여러 번 사용한다.


3. 곱셈

이진법의 곱셈 과정은 십진법의 곱셈 과정과 유사하다.

각 자릿수 값을 곱한 후 자릿수에 맞게 더해주는 과정으로 진행된다.

이때 이진법은 0과 1만 다루기 때문에

한 자리 곱셈은 AND 게이트로 처리할 수 있다.

 

그러나, 각 자릿수를 AND게이트를 통해 곱한 후,

자릿수에 알맞게 더 해야 하는데 

단순히 더하는 것이 아닌, 각 자릿수에 알맞게 더 해주어야 한다.

 

이에 따라 십진법은 각 자릿수마다 x10을,

이진법은 x2를 자릿수만큼 거듭제곱해 주어 자릿수를 맞춘다.

이는 이진법에서 모든 비트를 왼쪽으로 옮기는 것과 같다.

 

따라서 모든 비트를 왼쪽으로 옮기는 Shift(시프트) 연산기를 구현한다면,

별도의 곱셈 회로 없이도 전가산기,

AND 게이트 그리고 Shfit 연산기만으로 곱셈을 진행할 수 있다.

 

※ 이진수 곱셈 원리에 대한 자세한 내용은 다음글을 따른다.

 

[컴퓨터][16] 산술/논리 연산 회로 - 4 (곱셈 회로와 시프트(Shift) 연산)

※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.이전 글을 통해서컴퓨터는 초기에 산술/논리 연산 등 수학적 계산을 자동화하고자 설계되었다는 것을 알게 되었

core-basic.tistory.com

[8bit 왼쪽 시프트 연산기 스위치]

더보기
※ 해당 이미지는 Paul falstad 사이트를 통해 제작하였습니다.

 

[8bit 왼쪽 시프트 연산기 간략화]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[8bit 왼쪽 시프트 연산기 기호 자체 제작]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

 

[8bit 오른쪽 시프트 연산기 구현]

더보기
※ 해당 이미지는 Paul falstad 사이트를 통해 제작하였습니다.

 

[8bit 오른쪽 시프트 연산기 간략화]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[8bit 오른쪽 시프트 연산기 기호 자체 제작 ]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

※ ALU 회로의 구성의 최소화 및 효율성을 위해 별도의 곱셈회로를 구현하기보다는 전가산기와 AND 연산기 그리고 Shift 연산기를 여러 번 사용한다.


4. 나눗셈

이진법의 나눗셈 과정에 대해 곱셈이 덧셈의 반복이라면,

나눗셈은 뺄셈을 반복하여 몫과 나머지를 구한다.

그러나 이진법의 곱셈은 각 자릿수마다 조건 없이 덧셈을 진행하지만

이진법의 나눗셈은 각 자릿수마다 조건이 성립해야 뺄셈이 가능하다.

그리고 몫과 나머지를 저장할 메모리회로도 요구된다.

 

이에 대해 두 이진수 A ÷ B의 연산과정을 간략히 요약하면 다음과 같다.
(A와 B는 n bit이다.)

 

[1] 왼쪽부터 한 자릿수씩 처리

나눗셈을 진행할 때, 이진수 A(피제수)를 왼쪽에서부터 하나씩 처리한다.

A의 자릿수를 나누어 계산할 수 있는지 확인하는데,

이를 위해 비교기가 필요하다.

비교기는 A [n] 값과 B(제수)를 비교하여,

A [n]이 B보다 크거나 같을 경우에만 뺄셈을 진행한다.

(이때 뺄셈은 전가산기와 2의 보수를 사용한 뺄셈 방식으로 처리된다.)

 

[2] 조건부 뺄셈

비교 결과에 따라 A [n]이 B보다 크거나 같으면 뺄셈을 진행하고,

몫 자리에는 1을 기록한다.

반대로 A가 B보다 작으면 뺄셈을 진행하지 않고

몫 메모리 회로에는 0을 기록한다.

해당 자리에서 더 이상 뺄 수 없는 값인 나머지는

메모리 회로에 저장하여 다음 자릿수 연산에 이용된다.

(ex, A[n] = 1, B = 0011 일 경우 0011을 뺄 수 없으므로 1은 나머지 메모리 회로에 저장된다.)

 

[3] 다음 자릿수 이동 및 결합 (시프트 연산)

왼쪽에서 다음 자릿수인 A [n-1]은 왼쪽 시프트 연산된 나머지와 결합 후

다시 비교되고 그 결과에 따라 뺄셈이 진행할지 말지 결정된다.

 

즉, 가장 최상단 비트(가장 높은 자릿수) 하나 떼어내어 B(제수)와 비교하고,

B보다 작으면 해당 비트를 나머지로 보내고 몫은 0으로,

반대면 몫은 1로 기록한다.

그리고 나머지는 왼쪽 시프트 연산하여 다음 자릿수와 결합하여

다시 B(제수)와 비교하게 된다.

이후 더 이상 결합 할 자릿수가 없을 때까지

위의 과정을 반복하여 최종 몫과 나머지를 구한다.

 

이에 따라 나눗셈 연산을 위해 비교기와 메모리 회로가 필요하다.

※ 나눗셈에 대한 자세한 원리는 다음글을 따른다.

 

[컴퓨터][17] 산술/논리 연산 회로 - 5 (나눗셈 회로와 비교 연산 그리고 메모리)

※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.이전 글을 통해서컴퓨터는 초기에 산술/논리 연산 등 수학적 계산을 자동화하고자설계되었다는 것을 알게 되었

core-basic.tistory.com

 

[1bit 비교기 (이전 비트 고려하지 않음)]

더보기
※ 해당 이미지는 Paul falstad 사이트를 통해 제작하였습니다.

 

[2bit 비교기 (이전 비트 고려함)]

더보기
※ 해당 이미지는 Paul falstad 사이트를 통해 제작하였습니다.

 

[8bit 비교기]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[8bit 비교기 기호 자체 제작 ]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

 

[8bit AND 출력 제어기]

더보기
E = 0

E = 1

 

[8Bit Tri-state Buffer 출력 제어기]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[8bit 출력 제어기 기호 자체 제작]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

※ 출력 제어기에 대한 자세한 내용은 다음글을 따른다.

 

[컴퓨터][20] 메모리 회로 - 2 (바이트와 출력 제어기 그리고 레지스터 : Byte , Enabler , Register )

※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다. 이전 글들을 통해 메모리 회로가 필요하게 된 이유는산술/논리 연산 회로 중에서 나눗셈 연산 회로를 구현하기

core-basic.tistory.com

 

※ 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보다 효율적이다

 

[컴퓨터][25] RAM (Random Access Memory : 임의 접근 메모리)

※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.※ 해당 게시글은 J. 클라크 스코트, 『그래서 컴퓨터는 어떻게 동작하나요?』, 지유록, 인사이트(2019) 책

core-basic.tistory.com

 

[8bit D래치/플립플롭 + AND 출력 제어기 : 레지스터]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[8bit D래치/플립플롭 + Tri-state Buffer 출력 제어기 : 레지스터]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[8 bit 레지스터 장치 (logisim 기본 제공 이용)]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[8 bit 레지스터 장치 기호 자체 제작 (logisim 기본 제공 이용)]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

※ 메모리 회로(래치와 플립플롭, 레지스터)에 대한
자세한 원리는 다음글을 따른다.

 

[컴퓨터][20] 메모리 회로 - 2 (바이트와 출력 제어기 그리고 레지스터 : Byte , Enabler , Register )

※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다. 이전 글들을 통해 메모리 회로가 필요하게 된 이유는산술/논리 연산 회로 중에서 나눗셈 연산 회로를 구현하기

core-basic.tistory.com

※ ALU 회로의 구성의 최소화 및 효율성을 위해 별도의 나눗셈회로를 구현하기보다는 전가산기와 XOR연산기 그리고 비교기와 메모리 회로를 구현하여 여러 번 사용한다.

5. ALU 

ALU는 AND, OR, NOT, XOR, 전가산기,

SHR(오른쪽 시프트 연산기), SHL(왼쪽 시프트 연산기), 비교기

총 8가지의 연산 통해 기본적인 산술/논리 연산을 할 수 있으며,

비교기는 XOR 연산을 포함하므로,

비교기와 XOR 연산기를 하나로 결합하여

최종적으로는 7개의 장치로 ALU를 구현할 수 있다.

※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

※ OPcode (디코더)

디코더는 n비트의 입력을 받아 조합에 따라 2^n비트의 출력 중 하나만을 활성화한다.

이를 이용해 ALU에서 디코더의 각 출력 비트를 연산기들의 출력 제어기와 연결시키면

특정 입력 조합에 해당되는 연산의 출력제어기만 활성화되어

ALU의 최종 출력이 선택된다.

디코더의 회로는 다음과 같다.

※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

※ ADD 연산기의 OPcode가 000 이어야 하는 이유
추후 플래그 레지스터의 정확한 동작을 보장하기 위해서이다.
OPcode 000은 특정 상황에서 ALU 연산이 아니라도, 플래그 레지스터의 상태를 업데이트할 수 있도록 특별히 예약된 코드이다.


< 제어장치(CU : Control Unit) >

초기 컴퓨터 설계 목적은 산술 논리 연산을 ‘자동화’ 하는 것이다.

앞서서 ALU와 레지스터가 도입되어 기본적인 연산은 자동화되었지만,

사용자는 여전히 초기 값(OPcode, A, B)을 직접 입력하고,

ALU 연산 결과를 직접 확인하고 수동으로 레지스터에 저장해 주어야 했다.

그리고 레지스터에 저장되어 있는 값을 재활용(연속 연산) 할 때에도

수작업으로 진행해야 했다.

 

이러면 결국 레지스터와 같은 메모리 회로는

연산 결과를 수기로 메모하여 기억하는 것과 다를 게 없다.

그래서 비록 초기값은 직접 입력해 주어야 하는 것은 변함이 없지만,

ALU 연산 결과를 자동으로 메모리 회로(D래치/레지스터)에 저장해 주고,

이후 필요한 경우 레지스터에 저장되어 있는 값을 자동으로 ALU로 제공하여,

추가 연산에 활용할 수 있도록 제어장치가 도입되었다.

 

제어장치는 클럭과 스테퍼를 통해

데이터를 적절한 시점에 전달할 수 있도록 신호를 주는 역할을 한다.

이때 제어장치가 각 장치의 동작을 클럭 신호에 맞춰 조율하지 않으면,

모든 장치가 동시에 데이터를 주고받으려고 하여

데이터 혼선/충돌이 발생하게 된다.

 

따라서 제어장치를 통해

각 장치가 언제 입력을 받고 언제 출력을 할지 제어하면서

데이터의 충돌을 방지하고, 데이터를 재활용하기 위해서는

각 장치마다 입출력 제어기 역할도 하면서

데이터를 일시적으로 저장하고, 다음 연산이 준비될 때까지 대기할 수 있는

메모리 회로(D래치/레지스터)가 필요하다.

 

1. 클럭

각 장치들이 언제 입력을 받고, 언제 출력을 할지 제어하기 위해서는

‘언제’ 즉, ‘시간의 흐름’을 물리적으로 표현해 줄 장치가 필요하다.

이에 따라서 클럭은 전류가 흐르는 상태(1), 흐르지 않는 상태(0)를

주기적으로 반복하여 신호를 생성하며,

이를 통해 장치들에게 동작 시점을 알려준다.

이는 모든 장치가 동일한 클럭 신호를 기반으로 동작하기 때문에,

입력과 출력을 정확한 순간에 충돌 없이 수행할 수 있도록 한다.

 

[NOT 게이트 또는 LC 오실레이터로 구현된 기본 클럭]

더보기
[NOT 게이트로 구현된 기본 클럭]

[LC 오실레이터로 구현된 기본 클럭]

 

[JK플립플롭 : 지연 클럭 (기본 클럭 주기 x2)]

더보기
※ 해당 이미지는 Paul falstad 사이트를 통해 제작하였습니다.

 

[종합 클럭 : 지연 클럭, 출력 제어 클럭, 입력 제어 클럭]

더보기
※ 해당 이미지는 Paul falstad 사이트를 통해 제작하였습니다.
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

※ 클럭에 대한 자세한 원리는 다음글을 따른다.

 

[컴퓨터][23] 제어장치 - 2 ( JK플립플롭과 클럭)

※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.※ 해당 게시글은 J. 클라크 스코트, 『그래서 컴퓨터는 어떻게 동작하나요?』, 지유록, 인사이트(2019) 책을

core-basic.tistory.com


2. 스테퍼

스테퍼는 클럭 신호에 따라 주기적으로 동작하며,

각 주기마다 정해진 순서대로 특정 단계가 활성화되는 제어 신호를 생성한다.

※ 해당 이미지는 Paul falstad 사이트를 통해 제작하였습니다.

신호들은 각 장치의 입출력 제어기와 연결되어,

활성화된 단계에서만 연결된 장치가 동작하도록 한다.

이를 통해 여러 장치가 동시에 출력하려는 상황에서 발생할 수 있는

데이터 충돌을 방지하고, 동기화를 통해

각 장치의 동작이 정확한 순서에 따라 진행되도록 한다

 

[STEP 1 ~ STEP 7 스테퍼]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

※ 스테퍼에 대한 자세한 원리는 다음글을 따른다.

 

[컴퓨터][24] 제어장치 - 3 (스테퍼와 명령어, Stepper and Instruction )

※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.※ 해당 게시글은 J.클라크 스코트, 『그래서 컴퓨터는 어떻게 동작하나요?』, 지유록, 인사이트(2019) 책을 

core-basic.tistory.com


< 제어장치와 ALU 결합 (ALU 입출력 제어기) >

제어장치가 효율적으로 이용되고 각 장치를 결합하기 위해서는

위에서 언급하였듯이 각 장치의 입력과 출력 부분에

제어기능을 하는 메모리 회로, 즉 레지스터가 배치되어야 한다.

이에 따라

ALU는 두 입력 A, B 중 하나의 입력 부분에만

입력제어 레지스터를 배치한다.

이는 특정 입력의 값을 레지스터를 통해 고정시켜 두고,

다른 입력까지 주어졌을 때만 연산이 진행되도록 제어할 수 있기 때문이다.

그리고 각 연산 장치와 전체 ALU 출력 부분에도

출력 제어 레지스터를 배치한다.

이때 출력 제어 레지스터는 특별히 ACC(누산기)라고 부른다.

왜냐하면 ALU의 출력 제어 레지스터 ACC도 다른 레지스터들과 똑같이

제어장치의 조율을 받아 데이터를 받고, 출력하지만,

처리하는 데이터가 ALU 연산 결과만을 다루기 때문이다.

 

따라서 ALU 연산 결과는 항상 ACC(누산기)에 저장된다는 것을

이용하여 ALU 연산을 연속적으로 진행할 때 연산 결과를

재활용할 수 있는 등 효율적으로 사용할 수 있다.

 

※ 제어장치에 대한 자세한 원리는 다음 글을 따른다.

 

[컴퓨터][22] 제어장치 - 1 (디코더 그리고 산술/논리 장치(ALU : Arithmetic and Logical Unit ))

※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.※ 해당 게시글은 J. 클라크 스코트, 『그래서 컴퓨터는 어떻게 동작하나요?』, 지유록, 인사이트(2019) 책을

core-basic.tistory.com

 

1. ALU 입력 제어기 레지스터

[8bit ALU 입력 제어 D래치]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[8bit ALU 입력 제어 레지스터 (E=1, logisim 기본 제공)]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

2. ALU 출력 제어기 레지스터 : ACC(누산기)

[8bit ACC:누산기 (D플립플롭+Tri-State buffer)]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[8bit ACC:누산기 (Logisim 기본 제공 이용)]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 


3. 제어장치와 ALU 그리고 데이터 레지스터 결합

ALU의 두 입력(A, B)에 전달할 데이터를 저장하거나,

이후 설명 할 RAM에 접근하기 위한 주소를 저장하고

출력하는 레지스터들을 "데이터 레지스터"라 한다.

 

[CU + ALU + 데이터 레지스터]

※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 


<명령어>

ALU 연산을 위해서는

먼저 연산에 사용할 값들을 레지스터에 직접 입력하고

OPcode를 통해 사용할 연산자를 선택해야 한다.

또한, 값을 저장한 레지스터들을 선택해야

제어장치가 해당 장치들을 순서대로 동작시킨다.

 

이에 대해 ‘선택’을 어떻게 할지와

위의 과정을 간소화하기 위해 '명령어(Instruction)'와

'명령어 레지스터(IR : Instruction Register)'가 도입되었다.

 

명령어는 OPcode를 포함하고, 디코더를 이용해서

특정 이진수 값에 맞는 특정 출력만 활성화되도록 하여

특정 연산자, 특정 레지스터만 해당 활성화 신호를 받아

스테퍼의 단계 신호와 결합(AND)하여

순차적으로 활성화되도록 하는 이진수 코드이다.

 

1. 명령어 레지스터(IR)

[8bit 명령어 레지스터 회로]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[8bit 명령어 레지스터 기호 자체 제작]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[8bit ALU 연산 명령어]

더보기

[1] [000] [00] [00]

[명령어 종류]
1bit : [0] ~ [1]
[연산자:OPcode]
3bit : [000] ~ [111]
[RA : A레지스터]
2bit : [00] ~ [11] 
[RB : B레지스터]
2bit : [00] ~ [11] 
0 : ALU 이외의 명령어 ADD = 000 R0 = 00 R0 = 00
1 : ALU 명령어 SHR = 001 R1 = 01 R1 = 01
  SHL = 010 R2 = 10 R2 = 10
  NOT = 011 R3 = 11 R3 = 11
  AND = 100    
  OR = 101    
  XOR = 110    
  CMP = 111    
명령어 해석
1 000 [RA] [RB] ADD RA, RB RA와 RB를 ADD연산 후 RA에 저장
1 001 [RA] [RB] SHR RA, RA를 SHR연산 후 RA에 저장
1 010 [RA] [RB] SHL RA, RA를 SHL연산 후 RA에 저장
1 011 [RA] [RB] NOT RA, RA를 NOT 연산 후 RA에 저장
1 100 [RA] [RB] AND RA, RB RA와 RB를 AND연산 후 RA에 저장
1 101 [RA] [RB] OR RA, RB RA와 RB를 OR연산 후 RA에 저장
1 110 [RA] [RB] XOR RA, RB  RA와 RB를 XOR연산 후 RA에 저장
1 111 [RA] [RB] CMP RA, RB RA와 RB를 비교연산 후 RA에 저장

 

 

※ 명령어대한 자세한 내용은 다음글을 따른다.

 

[컴퓨터][24] 제어장치 - 3 (스테퍼와 명령어, Stepper and Instruction )

※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.※ 해당 게시글은 J.클라크 스코트, 『그래서 컴퓨터는 어떻게 동작하나요?』, 지유록, 인사이트(2019) 책을 

core-basic.tistory.com


2. 명령어 레지지스터와 ALU+CU+데이터 레지스터 결합

※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[명령어 레지지스터와 ALU+CU+데이터 레지스터 결합]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

※ logisim에서 제공하는 레지스터를 사용하는 이유는 다음과 같다.

더보기

 

모든 장치들의 출력 데이터들은 하나의 버스로 통하기 때문에

데이터들의 충돌을 방지하기 위해서는 출력 제어기를 사용한다.

 

이때 출력제어기는 0과 1 어떤 신호도 보내면 안 된다.

따라서 tri-state buffer는 0,1 그리고 신호 없음을 출력할 수 있기에

tri-state buffer를 출력 제어기로 하여금 D래치를 결합하여

레지스터를 만들어 버스에서 데이터 충돌을 방지할 수 있다.

 

그러나 logisim 프로그램에서 위와 같이 제작할 경우

레지스터 즉 D플립플롭(D래치)이 처음에 0으로

초기화 과정을 거쳐야 동작될 수 있는데

구조적 한계로 0으로 초기화되지 않는다.

즉 Power on reset : 전원이 들어왔을 때 초기 설정이 0이어야 한다.

 

해당 기능을 사용하기 위해서는

logisim에서 제공하는 레지스터를 사용해야 한다.


< 임의 접근 메모리 (RAM : Random Access Memory) >

산술 논리 장치(ALU : Arithmetic Logic Unit )와 제어장치(CU : Control Unit)

그리고 레지스터 등을 통해서 산술 논리 연산을 자동화할 수 있었다.

하지만 초기값은 여전히 직접 입력해 주어야 한다는 문제가 남아있지만,

더 큰 문제는 나눗셈 연산과 같이

여러 명령어들을 연속적으로 처리해야 하는 경우

초기 명령어에 이어서 다음 명령어들도 직접 입력해야 한다는 것이다.

이러한 문제를 해결하기 위해

임의 접근 메모리(RAM : Random Access Memory)가 도입되었다.

 

RAM은 여러 레지스터의 집합으로,

각 레지스터는 명령어 또는 데이터(값)를 저장한다.

그리고 제어장치에 의해 특정 레지스터가 선택되고,

해당 레지스터에 저장된 명령어를 명령어 레지스터(IR)에 전달된다.

이때 제어장치가 RAM을 구성하는 레지스터들 중 하나를 선택하기 위해

디코더를 이용하여 각 레지스터마다 특정 이진수를 대응시켰다.

그리고 그렇게 RAM 레지스터에 대응된 이진수들을

“주소(Address)”라고 한다.

 

RAM은 이처럼

여러 명령어와 데이터 그리고 연산 결과 등을 저장할 수 있고,

이를 다시 명령어 레지스터나, 데이터 레지스터 등으로 출력할 수 있다.

 

1. RAM

[8bit 레지스터 (tri-state buffer 이용한 제작)]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

 

[8bit 레지스터 (logisim 기본 제공 이용)]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[2048bit RAM (자체 제작)]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[2048bit RAM (logisim 기본 제공 이용)]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

※ RAM에 대한 자세한 원리는 다음 글을 따른다.

 

[컴퓨터][25] RAM (Random Access Memory : 임의 접근 메모리)

※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.※ 해당 게시글은 J. 클라크 스코트, 『그래서 컴퓨터는 어떻게 동작하나요?』, 지유록, 인사이트(2019) 책

core-basic.tistory.com

 


<제어장치와 ALU 그리고 RAM 결합 >

RAM도 ALU와 같이 제어장치에 의해 제어되기 위해서는

RAM의 입력 제어 레지스터와 출력 제어 레지스터가 필요하다.

그러나 ALU는 RAM 자체가 레지스터들의 집합이기 때문에

RAM의 출력 부분은 출력 제어기만 결합해 준다.

 

그리고 입력 부분에 대해서 RAM은 레지스터를 선택하는 주소 입력과

만약 데이터를 저장하는 경우 사용하는 데이터 입력,

이렇게 두 개의 입력을 받을 수 있다.

그러나, 데이터를 입력받아도 레지스터가 선택되지 않으면

해당 데이터를 저장할 수 없기 때문에 RAM은

주소에 대한 입력 제어 레지스터만 요구된다.

이때 RAM의 입력 제어 레지스터는 항상

RAM 내부 레지스터의 주소를 저장 및 출력해서

MAR(Memory Address Register)라고 부른다.

 

제어장치는 명령어가 저장된 RAM의 특정 주소를

MAR로 전달하여, 해당 주소에 있는 명령어를 읽어온다.

이를 위해 명령어가 위치하고 있는 주소를 가리키는 장치가 필요하다.

이에 따라 프로그램 카운터(PC:Progrem Counter)

[=명령어 주소 레지스터(IAR: Instruction Address Register)]

가 도입되었다.

 

프로그램 카운터(PC)는 레지스터와 같은 구조로 되어있으며

이를 효율적으로 제어하기 위해 ‘SET 1 (필자 명명)’ 장치가 도입되었다.

 

컴퓨터 전원이 켜지면 프로그램 카운터는 0번지 주소를

MAR에게 전달 후 +1 증가시켜

다음 주소를 MAR에게 전달하는 방식으로 동작한다.

(이에 따라 초기에 실행할 명령어들은 대부분 0번지부터 순서대로 입력한다.)

이때 프로그램 카운터(PC)를 +1 증가시키는데 ALU 명령어를 사용하지 않고

스테퍼 STEP1~STEP3 과정을 통해 효율적으로 진행하기 위해서

‘SET 1 (필자 명명)’이라는 장치가 사용된다.

 

※ MAR, 프로그램 카운터(PC), SET 1에 대한 자세한 원리는 다음 글을 따른다.

 

[컴퓨터][25] RAM (Random Access Memory : 임의 접근 메모리)

※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.※ 해당 게시글은 J. 클라크 스코트, 『그래서 컴퓨터는 어떻게 동작하나요?』, 지유록, 인사이트(2019) 책

core-basic.tistory.com

 

1. MAR

[RAM 입력 제어 레지스터 : 명령어 주소 레지스터(IAR) 회로]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[RAM 입력 제어 레지스터 : 명령어 주소 레지스터(IAR) 기호 제작]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

2. PC

[프로그램 카운터(PC) 회로]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[프로그램 카운터(PC) 기호 제작]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

3. SET 1

[SET 1 회로]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[SET 1 기호 제작]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[ALU + SET 1]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

4. CU+ALU+RAM 결합

※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

[CU+ALU+RAM 결합]

더보기
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.
※ 해당 이미지는 Logisim 프로그램을 통해 제작하였습니다.

 

결합 과정에서 제어장치와 각 장치들 사이의 연결 방식은 다음 내용을 따른다.

< ALU 연산 한정 (명령어 레지스터 최상위 비트 : 1) >

 

[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]

RAM 출력 제어기
: STEP 2 신호 and 출력 제어 클럭 신호(clk_e)

IR 입력 제어기
: STEP 2 신호 and 입력 제어 클럭 신호(clk_s)


[STEP 3]

ACC 출력 제어기
: STEP 3 신호 and 출력 제어 클럭 신호(clk_e)

PC 입력 제어기
: STEP 3 신호 and 입력 제어 클럭 신호(clk_s)


[STEP 4]

A레지스터 출력 제어기
: STEP 4 신호 and 출력 제어 클럭 신호(clk_e) and A레지스터 선택 코드[00~11]

ALU 입력 제어기
: STEP 4 신호 and 입력 제어 클럭 신호[clk_s] and ALU 연산 코드 [1]


[STEP 5]

B 레지스터 출력 제어기
: STEP 5 신호 and 출력 제어 클럭 신호(clk_e) and B레지스터 선택 코드(00~11)

ACC 입력 제어기
: SETP 5 신호 and 입력 제어 클럭 신호(clk_s) and [ALU 연산] 코드[1]

OPcode 입력 부분
: STEP 5 신호 and OPcode (000~111) and [ALU 연산] 코드[1]


[STEP 6]

ACC 출력 제어기
: STEP 6 and 출력 제어 클럭 신호(clk_e) and ALU 연산 코드[1]

A레지스터 입력제어기
: STEP 6 신호 and 입력 제어 클럭 신호(clk_s) and [피연산자_1] 레지스터 선택 코드


[STEP 7]

초기화

※ STEP 3, STEP6 두 단계 모두 ACC 출력 제어기가 사용되는 것처럼, 여러 단계에서 똑같은 장치의 똑같은 제어기가 사용될 경우 제어 클럭을 제외하고서는 OR 게이트로 결합한다.

 

 

 

다음 주제는 ALU 연산 명령어 이외의 명령어들에 대해 탐구해 보겠다.


※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.
※ 해당 게시글은 J. 클라크 스코트, 『그래서 컴퓨터는 어떻게 동작하나요?』, 지유록, 인사이트(2019) 책을 참고하였습니다

728x90