[Crash Course: Computer Science] #6 레지스터와 RAM

이민선(Jasmine)·2022년 12월 4일
0
post-thumbnail

이번 시간에는 래치를 이용해서 SRAM(Static Random Access Memory)을 만들어보자.

이전 시간에 논리 게이트를 이용해 산술과 논리 연산을 할 수 있는 간단한 ALU를 만들어보았다.
그렇다면 계산 결과를 저장해야 하기 때문에 컴퓨터 메모리가 필요하다.

컴퓨터는 RAM(Random Access Memory)을 사용하며, 전원이 켜져있을 때만 게임 상태 같은 것을 저장할 수 있다.
반면 지속성 메모리(Persistent Memory)라고 불리는 다른 유형의 메모리는 전력 공급 없이도 살아남을 수 있다.

지금까지 배웠던 모든 논리 회로는 오직 한 방향으로만 진행했다. (지난 시간에 배운 8비트 가산기처럼)
하지만 우리는 loop back 회로도 만들 수 있다.


쨔잔 1을 기록하는 회로
먼저, 모든 입력을 0으로 둔다. -> 0 출력
만약 A입력만 1로 바꾸더라도 출력은 여전히 0이다.
잠시 후 입력 B로 신호가 돌아와서 (loop back) or 게이트의 모든 입력이 1이 된다.
입력 A를 0으로 뒤집어도 or게이트는 여전히 1을 출력한다. 이로써 1을 기록하는 회로를 얻었다!! (출력을 1에서 0으로 바꿀 수 있는 방법은 더 이상 없다.)


쨔잔 0을 기록하는 회로
모든 입력을 1로 둔다. -> 1출력
만약 A 입력만 0으로 바꾸면 And게이트를 통과할 때 0이 되고
입력B로 신호가 돌아와서 And 게이트의 입력도 0이 된다.
입력 A를 1로 뒤집어도 And게이트는 여전히 0을 출력한다. 이로써 0을 기록하는 회로를 얻었다! (출력을 0에서 1로 바꿀 수 있는 방법은 더 이상 없다.)


이 2개를 합치면 AND-OR Latch가 된다.
Latch : 자물쇠를 의미.

AND-OR Latch는 2개의 입력을 갖고 있다.
출력을 1로 만드는 set 입력과(set이 1이고 reset이 0) 출력을 0으로 만드는 reset 입력(set이 1일 때 reset을 눌러버리면?)이다.
(사진에서 빨간 색은 reset에 1을 입력할 때 set의 1을 0으로 만들어버리는 흐름을 나타낸 것이다.)
모든 입력이 다시 0이 되어도 회로는 막판의 set의 1 입력을 계속 출력한다. 즉, 한 비트의 정보를 기억(저장)하는 것!! Memeory ~!~!
특정 값을 붙잡아서 유지하는 성질 때문에 래치라고 하는 것이다.

쓰기(writing): 메모리에 데이터를 넣는 동작
읽기(reading): 데이터를 받아오는 동작


Gated Latch -> 문을 열거나 닫을 수 있다는 뜻. 하나의 비트를 저장하는 상자라고 생각해보자.
Gated Latch는 And-or Latch에 데이터 입력 선, write enable 선을 추가하고, 논리 게이트를 좀 더 추가하면 만들 수 있다.

  • write enable 선 : 메모리쓰기를 가능하게 하거나 불가능하게 잠그는 신호
    And-or Latch에서는 데이터 입력 선이 2개 있었지만, 여기서는 1개만 있고, 0과 1만 설정하면 그 값을 저장할 수 있도록 한다.

write enable이 꺼져 있다면 데이터 input을 켜더라도 출력 불변.
write enable을 켠다면 데이터 input이 1일 때 비로소 output도 1이 된다.
만약 다시 write enable을 끈다면? 더 이상 date input을 끄더라도 출력은 1이 된다.(저장 성공!)
출력을 끄려면 write enable도 꺼야 함.

이처럼 래치는 한 비트의 정보를 저장할 수 있다.
그런데 한 비트 밖에 저장 못하면 무쓸모 아닌가 ??!! NO!
여러 개 쓰면 되지~ 래치 8개를 나란히 두면 8비트의 정보를 저장할 수 있다.

<레지스터>
레지스터(register) : 래치 그룹
너비(width) : 레지스터의 비트 수(래치 그룹 안에 몇개의 래치가 있는지)

초기의 컴퓨터는 8비트 레지스터를 가지고 있었고, 16, 32 순으로 커져 요즘 대부분의 컴퓨터는 레지스터가 너비 64비트 너비를 가진다.

모든 래치를 켜고 1개의 모든 래치에 연결한 write enable선도 켠다. 그리고 나서 8개의 데이터선을 이용하여 데이터를 보내고 enable을 다시 0으로 되돌리면 8비트값 저장 성공!

만약 64비트 레지스터라면? 64개의 데이터 입력을 위한 선들과 64개의 출력을 위한 선 필요 + 1개의 write enable선 필요. (총 129개 = 1 + 64 + 64)

만약 256비트라면? 선 513개 필요. 선이 너무 많다 !! 매트릭스(행렬)로 필요한 선의 개수를 줄여보자.

<16x16 Latch Matrix>
매트릭스에서는 래치를 일렬이 아닌 격자로 배열한다.
래치 하나만 활성화하고 싶다면? 해당 래치에 해당하는 행과 열을 같이 켜준다. -> 두 선의 교점에 있는 래치만 동작 시킨다. (나머지는 동작 X) 이를 위해 AND게이트를 사용한다. 열과 행이 모두 1이 되어야지만 1을 출력하기 때문이다. 즉, 단 하나의 래치만 선택할 수 있는 신호로 사용 가능한 것이다!

하나의 래치에 쓰기 가능해지려면, 행, 열, write enable선이 모두 1이 되어야 하는데 이때 모든 래치에 write enable을 공통으로 연결한다.
이 때 데이터에 단일 공유 회선(Single shared wire)을 사용한다. 다른 래치들은 데이터 선의 값들을 무시해버리기 때문에, 오직 1개의 래치에서만 쓰기 가능해지고 해당 래치에서만 데이터를 저장 가능하다.
(같은 방법으로 하나의 read enable선을 사용하여 원하는 래치의 데이터를 읽어오는 것도 가능.)

이로써 256비트 메모리에 총 35개의 선만 사용하면 된다. (데이터선 1개, write enable선 1개, read enable선 1개, 래치 선택을 위한 16개의 행 선과 16개의 열선.) 513개에서 35개로 줄어들다니 장족의 발전이쥬?? 신박한 와이어 절약!


매트릭스에 있는 래치 하나에 하나의 비트를 저장하고 싶다면?

ex. 12번째 행, 8번째 열의 주소에 있는 래치에 하나의 비트를 저장하고 싶다면?
행주소와 열주소를 각각 4비트로 표현한다.
12는 이진수로 1100이고,
8은 이진수로 1000이므로,
래치 주소는 11001000이다.

멀티플렉서란? 특정 행이나 열을 선택한 주소로 변환해주는 부품이다.
16개의 열을 담당하는 멀티플렉서와, 16개의 행을 담당하는 멀티플렉서 필요.
8비트 주소를 입력으로 받는다.(4비트는 행, 4비트는 열)

  • write enable, read enable 그리고 데이터 선도 필요.

하지만 256비트 메모리라고 하더라도 여전히 뭔가 하기에는 충분치 못하다.
확장해보자! 256비트 메모리 8개를 한 개의 열로 붙인다면?

이제 8비트(=1 byte)의 숫자를 저장할 수 있다.
8개의 모든 256비트 메모리에 정확히 똑같은 주소를 동시에 입력하면, 각 메모리에는 숫자의 한 비트 씩 저장하는 것이다.
이렇게 하면 256개의 주소를 256바이트에 저장할 수 있게 된다!

이처럼 256개의 주소가 있고 각 주소에 있는 8비트 값을 읽거나 쓸 수 있다면?
RAM!! 언제 어느 위치든 무작위 순서로 접근이 가능하다.
그래서 임의 접근 메모리(Random Access Memory)라고 하는 것이다.
다음 시간에 CPU를 만들 때 이 메모리를 쓴다.

메모리를 확장하고 또 확장하는 방법은 메모리를 메가바이트와 기가바이트로 확장하는 것에도 적용된다.
컴퓨터에 얼마나 큰 RAM을 달았는지는 컴퓨터 메모리를 말하는 것이다.
요즘에는 기가바이트 이상(수십억 바이트)의 메모리를 살 수 있다.

SRAM뿐만 아니라 DRAM, Flash Memory, NVRAM과 같은 다른 종류의 램도 있다.
SRAM과 기능은 거의 유사하고, 각각의 비트를 저장하는 회로(다른 논리 회로, 축전기(캐패시티), 차지 트랩, 멤리스터)에 차이가 있다.
하지만 근본적으로, 이 모든 기술은 메모리 셀이 대량으로 포개진 행과 열 안에서 정보 비트를 저장하는 기술이다.

profile
기록에 진심인 개발자 🌿

0개의 댓글