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

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

core-basic 2024. 9. 12. 23:30
728x90

※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.


이전 글들을 통해 메모리 회로가 필요하게 된 이유는

산술/논리 연산 회로 중에서 나눗셈 연산 회로를 구현하기 위해서

연산 과정 중간에 있는 값 또는 결괏값 등을 저장하고 재사용할 수 있는

무언가가 필요했기 때문이었다.

그리고

그러한 메모리 회로는 더 복잡한 연산과 작업을 수행할 수 있도록 해주어

컴퓨터 발전의 중요한 전환점 중 하나가 되었다.

그래서

이전 글을 통해 메모리 회로란 무엇인지,

무엇을 저장하는 것인지,

저장이란 무엇을 의미하는지,

그리고, 저장하는 회로는 어떻게 구현되는지 등

메모리에 대한 기본적인 내용에 대해 알아보았다.

 

[컴퓨터][19] 메모리 회로 (SR 래치(S-R latch), D 래치(D latch), JK플립플롭)

※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.처음에 컴퓨터는 산술/논리 연산을 자동화하는 것을 목적으로 설계되었다.그리고 이후 두 번의 중요한 전환점을

core-basic.tistory.com

그러면 이어서 래치(latch)들을 메모리 회로로써

실질적으로 어떻게 사용하는지 알아보겠다.

 

< 바이트와 출력 제어기 그리고 레지스터 >
( Byte , Enabler , Register )


< 바이트 ( byte ) >

컴퓨터는 2진수를 사용하므로,

2의 거듭제곱 단위로 연산하는 것이 효율적이었다.

이에 따라 초기에는 8bit 단위로 연산하고 데이터를 처리하는 것이

경제적이고 성능 면에서도 효율적이었고,

설계 측면에서도 최적화할 수 있었다.

 

이를 바탕으로

데이터의 저장 및 표현을 표준화하기 위해

8bit를 1byte (1 바이트)라고 부르기로 약속했다.

 

그리고 이러한 표준화는 현재까지도 유지되어,

컴퓨터에서 사용하는 연산 단위는

8bit(1byte), 16bit(2byte), 32bit(4byte), 64bit(8byte) 등

최소 8bit로 시작해서 2의 거듭제곱을 따른다.

 

이에 따라

초기의 컴퓨터의 모든 회로는 대부분 1byte(8bit)를 기준으로 하여 설계되었다.

이에 따라 앞서 구현한 산술/논리연산회로와 메모리 회로 등 모두

8bit 단위로 구현되어야 한다.

따라서

앞서 구현한 산술/논리 연산 회로들과 메모리 회로들을

기호들을 통해 1byte(8bit) 단위로 구현해 보겠다.


< 1byte(8bit) AND 연산기 >

ex) 0000 1100 AND 0000 1010 = 0000 1000

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


< 1byte(8bit) OR 연산기 >

ex) 0000 1100 OR 0000 1010 = 0000 1110

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


< 1byte(8bit) NOT 연산기 >

ex) NOT 1010 1010 = 0101 0101

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


< 1byte(8bit) XOR 연산기 >

ex) 0000 1100 XOR 0000 1010 = 0000 0110

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


< 1byte(8bit) AND/OR/XOR + NOT 연산기 >
( NAND )

 

ex) 0000 1100 NAND 0000 1010 = 1111 0111

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

< 1byte(8bit) AND/OR/XOR + NOT 연산기 >
( NOR )

ex) 0000 1100 NOR 0000 1010 = 1111 0001

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

< 1byte(8bit) AND/OR/XOR + NOT 연산기 >
( XNOR )

ex) 0000 1100 XNOR 0000 1010 = 1111 1001

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


< 1byte(8bit) 덧셈/뺄셈기 >
(덧셈)

ex) 0000 0001 (2) + 0000 0010 (1) = 0000 0011 (3)

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

 

< 1byte(8bit) 덧셈/뺄셈기 >
(뺄셈)

ex) 0000 0001 (2) - 0000 0010 (1) = 0000 0011 (1)

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

이때 실질적으로는

 0000 0001 (1)을 1111 1111 (-1)로 2의 보수를 취하고 더함으로써

자리 올림이 발생한다.

자세한 뺄셈 과정은 다음 글을 통해 알아볼 수 있었다.

 

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

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

core-basic.tistory.com


< 1byte(8bit) 시프트(Shift) 연산기 >
(오른쪽 시프트 연산)

ex) SHR 0000 1000 = 0000 0100 

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

< 1byte(8bit) 시프트(Shift) 연산기 >
(왼쪽 시프트 연산)

ex) SHL 0000 1000 = 0001 0000 

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


< 1byte(8bit) 비교기 >

ex) CMP:Compare (0000 0000, 0000 0000)

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


< 1byte(8bit) D 래치 >

이어서 데이터를 저장하는 메모리 회로 역시 1bit가 아닌 8bit 메모리 회로가 필요했다.

그래서 데이터를 저장하는 1bit 회로인 D 래치를 8개를 연결하였다.

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

그런데 나눗셈 연산과 같이 중간 연산 결과를 저장하고,

사용자가 원할 때 출력하는 등

실질적으로 유용하게 사용하기 위해서는

사용자가 원할 때만 데이터를 출력할 수 있도록 해야 했다.

이에 따라 출력 제어기(Enabler) 회로가 만들어졌다.


< 1byte(8bit) 출력 제어기(Enabler) >

사용자가 원할 때만 데이터를 출력할 수 있도록 도와주는 출력 제어기는

Enabler 입력이 활성화될 경우 입력받은 데이터를 그대로 출력할 수 있도록 해주고,

Enabler 입력이 비활성화 0을 출력하도록 한다.

이를 논리표로 표기하면 다음과 같다.

Enable = 0 0 0 0 0 0 0 0 0
입력(Data) 1 0 1 0 1 1 0 0
출력 0 0 0 0 0 0 0 0
Enable = 1 1 1 1 1 1 1 1 1
입력(Data) 1 0 1 0 1 1 0 0
출력 1 0 1 0 1 1 0 0

이를 논리 게이트와 비교하면 각 입력과 E를 AND 연산한 결과와 같다.

E = 0
(Enable)
0 0 0 0 0 0 0 0
D
(Data)
1 0 1 0 1 1 0 0
E AND D
(출력)
0 0 0 0 0 0 0 0
E = 1
(Enable)
1 1 1 1 1 1 1 1
D
(Data)
1 0 1 0 1 1 0 0
E AND D
(출력)
1 0 1 0 1 1 0 0

이에 따라 다음과 같이 출력제어기를 구현할 수 있다.

E = 0, D = 1010 1100  E = 1, D = 1010 1100 

< 1byte(8bit) 레지스터(Register) >

그래서 기존 메모리 회로와 출력 제어기(Enalber)를 연결시키면

출력을 제어할 수 있는 메모리 회로(D 래치) 즉, ‘레지스터’라는 회로를 구현할 수 있다.

(1byte D 래치 + 1byte 출력 제어기 = 1byte 레지스터)

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

따라서 기존 D 래치에 있는 Enable 입력은

메모리 회로에 주어진 데이터로 설정(Set)하는 신호로 동작하고,

출력 제어기의 Enable은 저장되어 있는 데이터 출력을 허용(Enable)하는 신호로

동작하게 된다.

이에 대해 데이터 1010 1100을 저장하고 출력하는 과정을

회로로 살펴보면 다음과 같다.

 

(1) D = 1010 1100, S = 0, E = 0,

1010 1100이라는 데이터가 들어오지만
아직, 회로에 해당 데이터를 설정(Set) 하지 않고,
저장되어 있는 데이터도 출력을 허용(Enable) 하지 않는다.

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

 

(2) D = 1010 1100, S = 1, E = 0,

1010 1100이라는 데이터를 회로에 설정(Set)함으로써 저장한다.
그러나 저장한 데이터는 아직 출력을 허용(Enable) 하지 않는다.

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

 

(3) D = 0000 0000, S = 0, E = 0,

이후, 0000 0000 데이터 입력이 들어왔지만,
설정값(Set)이 비활성화되어 있으므로 받아들이지 않아,
회로 내부에 저장되어 있는 데이터는 변경되지 않고 1010 1100으로 유지된다.
그리고
출력을 아직 허용(Enable) 하지 않았으므로 저장된 데이터가 출력되지 않는다.

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

 

(4) D = 0000 0000, S = 0, E = 1,

출력이 허용(Enable)됨에 따라,
이전에 저장되었던 1010 1100 데이터가 출력되는 것을 확인할 수 있다.

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

 

이에 따라서 레지스터는 

사용자가 원할 때 레지스터 내부 회로에 데이터를 저장하고,

사용자가 원할 때 레지스터 내부 회로에 저장되어 있는 데이터를 출력할 수 있다.

 

 

이번 글은 요기서 마치며,

다음 주제는 완성된 레지스터와 비교기를 통해서

나눗셈 연산 회로를 구현하는 것에 대해 탐구해 보겠다.


※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.

728x90