계산만 하는 회로의 한계
지난 장에서 우리는 논리 게이트를 이어 붙여 덧셈하는 회로를 만들었다. 입력 A와 B를 넣으면 합과 자리올림이 나온다. 이것은 아주 중요한 출발점이다. 하지만 아직 부족한 점이 있다.
덧셈 회로는 지금 들어온 입력만 보고 바로 답을 낸다. 입력이 바뀌면 출력도 곧 따라 바뀐다. 마치 계산기를 눌렀을 때 화면이 바뀌는 것처럼 보이지만, 사실 회로 자체는 '방금 무엇을 계산했는지'를 기억하지 못한다.
예를 들어 3 + 2를 계산한 뒤, 그 결과에 다시 1을 더하고 싶다고 해 보자. 그러려면 5라는 결과를 잠시 붙잡아 두어야 한다. 그런데 기억하는 장치가 없다면 5는 지나가는 신호일 뿐이다. 손전등을 켰다 끄면 빛이 사라지는 것처럼, 신호도 붙잡아 두지 않으면 다음 순간에 사라진다.
그래서 컴퓨터에는 계산하는 회로뿐 아니라 기억하는 회로가 필요하다. 이 기억 회로가 생기는 순간, 컴퓨터는 단순히 입력에 반응하는 장치에서 '앞의 일을 바탕으로 다음 일을 하는 장치'가 된다.
AI 생성 이미지
지금만 보는 회로, 과거도 보는 회로
회로는 크게 두 종류로 나누어 생각할 수 있다.
첫째는 조합 회로다. 조합 회로는 지금 입력만 보고 출력을 정한다. AND, OR, NOT, XOR, 반가산기, 전가산기가 여기에 속한다.
예를 들어 AND 게이트는 두 입력이 모두 1이면 1을 출력한다. 어제 입력이 무엇이었는지는 전혀 상관없다. 지금 A가 1이고 B가 1이면 출력은 1이다.
둘째는 순차 회로다. 순차 회로는 지금 입력뿐 아니라 과거에 저장된 상태도 함께 본다. 여기서 상태란 회로가 기억하고 있는 값이다. 아주 작게는 0 또는 1 하나일 수도 있고, 크게는 프로그램이 어디까지 실행되었는지를 나타내는 값일 수도 있다.
비유하면 조합 회로는 묻는 즉시 대답하는 자동문 같다. 사람이 앞에 있으면 열리고, 없으면 닫힌다. 순차 회로는 번호표를 기억하는 은행 창구에 가깝다. 지금 온 사람만 보는 것이 아니라, 이전에 몇 번까지 처리했는지도 기억해야 다음 순서를 알 수 있다.
컴퓨터가 프로그램을 한 줄씩 실행하려면 반드시 순서가 필요하다. 첫 번째 명령을 실행한 뒤 두 번째 명령으로 가야 하고, 계산 결과를 잠시 저장한 뒤 다음 계산에 써야 한다. 이 일을 가능하게 하는 것이 순차 회로다.
회로 안의 박자, 클록
순차 회로가 제대로 움직이려면 모두가 같은 박자에 맞추어 행동해야 한다. 이 박자를 만드는 신호가 클록이다.
클록 신호는 0과 1이 일정하게 반복되는 신호다. 낮았다가 높아지고, 다시 낮아진다. 모양만 보면 깜빡이는 신호처럼 보인다.
낮음 높음 낮음 높음
__|‾‾|__|‾‾|__|‾‾|__클록은 컴퓨터 안의 지휘자나 메트로놈과 비슷하다. 오케스트라에서 연주자들이 각자 마음대로 연주하면 음악이 흐트러진다. 하지만 지휘자의 박자에 맞추면 여러 악기가 한 곡을 만든다. 컴퓨터도 마찬가지다. 덧셈 회로, 기억 회로, 명령어를 읽는 회로가 제멋대로 움직이면 결과가 뒤섞인다. 그래서 클록이 '지금 저장해', '이제 다음 단계로 가'라는 기준점을 만들어 준다.
클록이 한 번 똑딱할 때마다 컴퓨터는 작은 한 걸음을 내딛는다. 이 한 걸음 사이에 어떤 회로는 계산을 하고, 어떤 회로는 결과를 저장한다. 다음 똑딱이 오면 저장된 값이 다시 다음 회로로 넘어간다.
여기서 중요한 점은 클록이 계산을 직접 하는 것은 아니라는 것이다. 클록은 박자를 맞춘다. 실제 계산은 논리 게이트들이 하고, 실제 저장은 기억 회로가 한다. 클록은 이 둘이 서로 엉키지 않도록 순서를 잡아 준다.
1비트를 붙잡는 가장 작은 상자
기억 회로의 가장 작은 목표는 1비트를 저장하는 것이다. 1비트란 0 또는 1 하나다. 작은 상자 하나가 있고, 그 안에 흰 구슬 또는 검은 구슬 하나를 넣어 둔다고 생각해 보자. 흰 구슬을 0, 검은 구슬을 1이라고 약속하면 이 상자는 1비트를 기억한다.
전자 회로에서는 구슬 대신 전기 신호를 붙잡아 둔다. 문제는 전기 신호가 그냥 지나가 버린다는 데 있다. 그래서 회로는 자기 출력의 일부를 다시 자기 입력 쪽으로 돌려보내는 방법을 쓴다. 이것을 되먹임이라고 부를 수 있다. 물레방아가 흐르는 물을 받아 계속 돌듯이, 회로의 출력이 다시 회로 안으로 돌아가 현재 상태를 유지하게 만드는 것이다.
이 원리를 이용한 기본 기억 회로가 래치다. 래치는 0 또는 1을 붙잡아 둘 수 있는 회로다.
가장 쉽게는 문이 달린 상자를 떠올리면 된다.
문이 열려 있을 때: 들어오는 값을 그대로 받아들인다.
문이 닫혀 있을 때: 마지막으로 들어온 값을 계속 간직한다.
래치에는 보통 '값을 넣는 입력'과 '문을 열지 닫을지 정하는 신호'가 있다. 문이 열린 동안 입력이 0이면 상자 안도 0이 되고, 입력이 1이면 상자 안도 1이 된다. 문을 닫으면 입력이 바뀌어도 안의 값은 그대로 남는다.
이렇게 보면 래치는 작은 칠판과 비슷하다. 선생님이 '지금 적어도 돼'라고 할 때는 새 내용을 쓸 수 있다. 하지만 '이제 멈춰'라고 하면 칠판의 내용이 그대로 남아 다음 사람이 읽을 수 있다.
래치와 플립플롭은 무엇이 다를까
래치는 값을 기억하지만, 문이 열려 있는 동안에는 입력 변화가 계속 안으로 들어온다. 이것이 장점이기도 하고 단점이기도 하다.
예를 들어 문을 너무 오래 열어 두면 어떻게 될까? 밖에서 사람이 공을 여러 번 던지면 상자 안의 공도 계속 바뀔 수 있다. 회로에서도 마찬가지다. 래치가 열려 있는 동안 입력 신호가 흔들리면 저장된 값도 함께 흔들릴 수 있다.
그래서 컴퓨터에서는 더 또렷한 저장 장치가 필요하다. 바로 플립플롭이다. 플립플롭도 1비트를 저장하지만, 보통 클록의 특정 순간에만 값을 잡아챈다.
여기서 '특정 순간'이 중요하다. 클록 신호가 0에서 1로 올라가는 순간, 또는 1에서 0으로 내려가는 순간만 바라보는 것이다. 마치 사진기가 셔터를 누른 바로 그 순간의 장면만 찍는 것과 같다. 셔터를 누르기 전후로 사람이 움직여도 사진에는 셔터 순간의 모습이 남는다.
래치가 문이 열려 있는 동안 계속 받아들이는 상자라면, 플립플롭은 찰칵 하고 순간을 찍는 카메라에 가깝다.
입력 D ──값을 준비──▶ [플립플롭] ──▶ 저장된 출력 Q
▲
클록많이 쓰이는 형태 중 하나가 D 플립플롭이다. 여기서 D는 데이터, Q는 저장된 출력이라고 생각하면 된다. 클록의 정해진 순간이 오면 D에 있던 값이 Q에 저장된다. 그다음 클록 순간이 오기 전까지 Q는 그대로 유지된다.
이 작은 부품 하나가 1비트를 기억한다. 8개를 모으면 8비트, 즉 1바이트를 기억할 수 있다. 더 많이 모으면 숫자, 글자, 명령어의 위치 같은 정보를 저장할 수 있다.
박자에 맞춰 한 단계씩 움직이기
이제 덧셈 회로와 플립플롭을 함께 생각해 보자.
덧셈 회로는 두 입력을 받아 결과를 만든다. 하지만 그 결과를 다음 단계에서 쓰려면 어디엔가 저장해야 한다. 그래서 덧셈 회로의 출력 뒤에 플립플롭을 붙인다.
흐름은 이렇다.
플립플롭에 저장된 값이 덧셈 회로로 들어간다.
덧셈 회로가 새 결과를 만든다.
결과는 다음 플립플롭 앞에서 기다린다.
클록이 똑딱하면 플립플롭이 그 결과를 저장한다.
저장된 값은 다음 단계의 입력이 된다.
이 구조가 생기면 회로는 한 번에 모든 일을 뒤섞어 하지 않는다. 한 박자에 한 단계씩 앞으로 나아간다. 공장에서 컨베이어 벨트가 한 칸씩 움직이는 장면을 떠올리면 쉽다. 첫 번째 구역에서는 부품을 자르고, 두 번째 구역에서는 조립하고, 세 번째 구역에서는 검사한다. 벨트가 움직이는 박자가 맞아야 물건이 순서대로 완성된다.
컴퓨터 안에서도 클록은 컨베이어 벨트의 박자와 같다. 플립플롭은 각 단계의 끝에서 물건을 잠시 잡아 두는 상자다. 논리 회로는 그 사이에서 일을 하는 작업대다.
타이밍이 어긋나면 생기는 일
회로도 시간의 영향을 받는다. 전기 신호가 아무리 빠르다고 해도 완전히 즉시 도착하는 것은 아니다. 논리 게이트를 지나고, 선을 따라 이동하고, 여러 회로를 거치면서 아주 짧은 시간이 걸린다. 이것을 지연이라고 생각할 수 있다.
문제는 클록이 너무 빨리 오거나, 신호가 너무 늦게 도착할 때 생긴다.
플립플롭이 값을 저장하려면 클록 순간 바로 앞에 입력 값이 안정되어 있어야 한다. 사진을 찍으려는데 피사체가 계속 흔들리면 사진이 흐릿해지는 것과 같다. 또한 클록 순간 바로 뒤에도 값이 아주 잠깐은 유지되어야 한다. 셔터가 닫히기도 전에 장면이 바뀌면 제대로 찍히지 않을 수 있다.
회로에서는 이런 규칙을 지키지 못하면 이상한 일이 생긴다. 0을 저장해야 할지 1을 저장해야 할지 애매해질 수 있다. 출력이 잠시 흔들리거나, 다음 회로가 잘못된 값을 읽을 수도 있다. 이것은 사람이 말을 주고받을 때도 비슷하다. 상대가 말을 끝내기 전에 대답을 시작하면 내용을 잘못 알아들을 수 있다.
그래서 컴퓨터 설계자는 클록의 속도를 마음대로 높일 수 없다. 한 박자 안에 계산이 끝나고, 신호가 다음 플립플롭 앞에 안정적으로 도착할 시간이 필요하다. 빠른 컴퓨터를 만들려면 단순히 클록을 빠르게 하는 것만으로는 부족하다. 회로의 길을 짧게 만들고, 게이트의 수를 줄이고, 여러 단계를 알맞게 나누어야 한다.
기억이 생기면 과정이 생긴다
조합 회로는 지금 입력에 대한 답을 낸다. 순차 회로는 저장된 상태를 가지고 다음 답을 만든다. 이 차이는 작아 보이지만 컴퓨터의 세계에서는 결정적이다.
기억이 없으면 회로는 매번 처음 보는 문제에만 대답한다. 기억이 있으면 회로는 '아까 무엇을 했는지'를 바탕으로 다음 행동을 고를 수 있다. 덧셈 결과를 저장하고, 명령어의 위치를 기억하고, 반복문의 횟수를 세고, 게임 속 캐릭터의 위치를 유지할 수 있다.
래치와 플립플롭은 매우 작은 기억 장치다. 하지만 이 작은 기억들이 모이면 레지스터가 되고, 레지스터들이 모여 CPU 안의 중요한 저장 공간이 된다. 더 큰 기억 장치로 확장되면 메모리가 된다.
컴퓨터는 전기 신호가 빠르게 흐르는 기계지만, 아무렇게나 흐르는 기계는 아니다. 클록의 박자에 맞추어 계산하고, 플립플롭에 순간을 저장하고, 저장된 값을 다음 단계로 넘긴다. 그래서 컴퓨터는 단순한 계산기를 넘어 과정을 따라가는 기계가 된다.
다음 장에서는 이 질문으로 더 들어가 보자. 1비트를 붙잡는 회로가 있다면, 많은 비트를 어떻게 차곡차곡 저장할 수 있을까? 컴퓨터의 메모리는 어떻게 1을 잊지 않고 붙잡아 둘까?
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.