이전 글에서 래치를 이용해 정보를 기억하는 회로를 만들었다. 하지만 D 래치는 활성화 신호가 켜져 있는 동안 입력 변화를 그대로 따라가기 때문에, 여러 래치가 연결된 시스템에서는 문제가 생긴다.
컴퓨터는 복잡한 계산을 한 번에 처리하지 않는다. 대신 여러 단계로 나누어 각 단계의 결과를 래치에 저장한 뒤, 다음 단계로 전달한다. 예를 들어 덧셈 결과를 래치에 저장하고, 그 값을 다음 래치가 받아 또 다른 연산에 사용하는 식이다.
하지만 D 래치는 활성화(E) 신호가 켜져 있는 동안 D 입력의 변화를 그대로 따라간다. 이 상태에서 래치 여러 개를 A → B → C 순서로 연결하면 어떻게 될까? A의 출력이 바뀌는 순간 B가 즉시 그 값을 받고, C도 곧바로 따라 바뀐다. 각 단계가 자기 값을 독립적으로 유지하지 못하는 것이다.
아래 회로에서 세 개의 D 래치가 직렬로 연결되어 있다. E=1인 상태에서 D를 토글해보자. 세 래치의 Q가 동시에 바뀌는 것을 볼 수 있다.
데이터가 한꺼번에 통과해버려서 각 단계가 독립적으로 값을 유지할 수 없다.
따라서 우리는 모든 회로가 같은 타이밍에 동작하도록 동기화할 필요가 있다. 바로 이 동기화를 책임지는 것이 클럭(Clock) 이다.
클럭은 컴퓨터 내부에서 일정한 주기로 반복되는 정기적인 신호이다. 모든 회로에 “지금 동작해”라는 박자를 동시에 알려주는 역할을 한다.
같은 파이프라인에 클럭을 추가하면 어떻게 될까?
다음 순서대로 조작해보자:
컴퓨터 사양에서 “3.2GHz” 같은 숫자를 본 적이 있을 것이다. 이것은 클럭의 주파수를 의미하며, 1초에 32억 번의 박자를 보내는 속도를 뜻한다. 이 클럭 주파수가 높을수록 회로는 더 자주 동작할 수 있어, 더 많은 계산을 빠르게 처리할 수 있다.
그렇다면 클럭에 맞춰 동작하는 메모리는 어떻게 구현할 수 있을까? D 플립플롭(D Flip-Flop) 을 살펴보자.
D 플립플롭은 D 래치처럼 데이터를 입력받아 저장하지만, 클럭의 특정 순간(엣지) 에서만 데이터를 받아들인다. 상승 엣지 혹은 하강 엣지 중 하나를 선택할 수 있다.
엣지의 그 순간에만 데이터를 받아들이므로, 입력이 아무리 요동쳐도 결과가 예측 가능하고 안정적이다.
상승 엣지 D 플립플롭은 두 개의 D 래치를 사용해 아래와 같이 구현할 수 있다.
다음 순서대로 조작해보자:
D 플립플롭 하나는 단 하나의 비트(0 또는 1)만 저장할 수 있다. 하지만 컴퓨터는 8비트, 16비트, 32비트, 64비트와 같은 여러 비트가 모인 Word(컴퓨터가 한 번에 처리하는 데이터 묶음) 단위로 숫자를 표현하고 처리한다.
이러한 여러 비트의 정보를 한 번에 저장하기 위해, 여러 개의 D 플립플롭을 병렬로 연결한 것이 바로 레지스터(Register) 이다. 예를 들어, 8비트 레지스터는 8개의 D 플립플롭으로 구성되어 8개의 비트를 동시에 저장할 수 있다. 모든 플립플롭이 같은 클럭 신호를 공유하므로, 8비트 데이터가 동시에 저장되고 출력된다.
레지스터는 CPU 내부에 위치하며, 연산 장치가 계산할 값이나 제어 장치가 다음 명령어를 가져올 주소 등, CPU가 당장 처리해야 할 핵심적인 정보들을 매우 빠르게 임시 저장하는 역할을 한다. CPU와 같은 칩 내부에 위치하기 때문에 접근 속도가 매우 빠르지만, 그만큼 비싸고 공간을 많이 차지한다.
우리는 이제 덧셈을 수행할 수 있는 회로뿐만 아니라, 그 계산 결과를 ‘기억’할 수 있는 능력을 컴퓨터에게 부여하는 방법을 알게 되었다.
이제 계산과 기억이라는 두 가지 능력을 갖추었다. 그런데 이것만으로 컴퓨터라고 부를 수 있을까? 다음 글에서는 컴퓨터란 무엇인지 정의하고, 지금까지 만든 회로들이 어떻게 하나의 컴퓨터로 조립되는지 살펴보자.