이 포스팅은 숙명여자대학교 김윤진 교수님의 컴퓨터 구조론 특강을 바탕으로 작성되었습니다. 교수님께서 주신 인사이트를 제 언어로 정리한 포스팅입니다. 일부 강의 자료의 원본을 구글링 하다가 찾아서 그냥 올립니다 ^^
이 포스팅에서 설명하고자 하는 것
먼저, Storage는 왜 필요한가?
위 그림의 Combinational Circuit과 Sequential Circuit는 디지털 논리 회로에서 배웠다.
Combinational Circuit는 input만 알면 output을 확신할 수 있는 반면, Sequential Circuit는 input을 알아도 output을 확신할 수 없다. 이 회로는 과거의 input 값들을 저장하고 있다가 output을 결정할 때 사용한다. 따라서 값을 저장할 수 있는 storage가 반드시 필요하다.
값을 저장하는데 사용하는 예제
호출 버튼 예제를 사용했다. Call 버튼을 누르면 불이 켜지고, 버튼에서 손을 떼도 여전히 불이 켜져 있다. Cancel 버튼을 누르면 불이 꺼지는 기능을 가진다.
(사실 이 전에 단순한 로직들을 연결해보는 시도들이 있는데.. 내용을 자세하게 서술할 필요는 없다고 생각했다. 강의 내용을 다시 보니 단순함을 기반으로 하는 복잡성을 다시 발견할 수 있었다.)
SR Latch의 진리표를 보면 이렇게 된다.
이제 호출 버튼의 저장 기능을 SR Latch를 사용하면 구현할 수 있다.
하지만 SR Latch를 사용했을 때 피할 수 없는 문제가 있다. S와 R이 동시에 1이 되면 Q 값이 010101 바뀌는 것을 무한 반복한다. 이 문제를 Oscillation이라고 한다. 호출 버튼 예제에서는 Call과 Cancel 버튼을 동시에 누르는 경우이다. 무한 반복을 멈출 수 없게 되므로 전원을 차단할 때 까지 버튼은 계속 불이 깜빡깜빡 거릴 것이다. 시스템 설계는 언제나 사용자의 오용도 처리할 수 있어야 하고, 이 시스템이 단순히 호출 버튼이 아니라 미사일 발사 버튼이라면 오우.. 끔찍한 문제가 발생할 것이다. 이 문제는 필히 해결해야 한다.
S와 R이 동시에 1이 되지 않도록 inverter와 and 게이트를 붙였다.
그러나 impulse diagram을 보면 알겠지만 하드웨어의 물리적 delay로 인해 S와 R이 동시에 1이 되는 순간이 발생한다. 찰나의 순간이겠지만.. 버튼의 회로 설계 오류로 미사일이 발사된다면?
그래서 이 문제를 해결하기 위해 도입된 것이 Clock이다. 앞에서 로직 게이트를 붙였을 때는 물리적 한계 때문에 문제를 제대로 해결하지 못했다. 하지만 Clock은 또 다른 input이며, 0과 1을 일정 주기로 반복하며 값을 바꾼다. Clock이 1일 때만 input에 의미 있는 값이 실린다.
버튼 예제에 적용해보면 Clock은 SR이 둘다 1인 경우가 아닐 때까지 기다린다. 그러다 Clock이 1인 동안 S1과 R1에 값을 실어 보낸다.
Clock은 input 값이 안정화되는 것을 보고 움직이는 것이 아니다. Clock은 일정 주기로 0과 1을 반복하고, Clock이 1인 동안 input 값들이 타이밍을 맞춰서 들어간다.
이때 input값들이 컴포넌트를 통과하는 것도 물리적 회로를 통해서기 때문에 앞에서 살펴봤던 delay가 발생한다. Flip-flop의 input을 바꿀 때, clock edge에 너무 임박해서 바꾸면 delay로 인한 오류가 발생할 수 있다. Setup Time Violation과 Hold Time Violation이 있다.
Clock을 도입하여 SR Latch의 Oscillation 문제를 해결했음에도 SR Latch는 한계를 가진다. 1bit를 저장하는 예시는 매우 단순하기 때문에 SR Latch를 사용해도 큰 문제는 없다. 하지만 스토리지 간에 데이터 이동이나 교환이 일어나는 상황을 생각해보자. 단순히 1bit가 이동하는 경우는 없다. 더 많은 비트들을 커버할 수 있는 스토리지가 필요한데, SR Latch는 복잡한 스토리지 시스템에 사용되지 못한다.
SR Latch는 저장 기능에서 매우 훌륭한 기능을 가진 컴포넌트이다. 영원히 값을 저장할 수 있기 때문이다. 하지만 SR Latch에 너무 많은 권한을 부여했기 때문에 설계자가 제어하기 어렵다. 따라서 권한을 뺏어 설계자에게 제어권을 넘기려고 한다.
앞에서 말한 SR Latch의 두 가지 한계점을 보완해 만든 스토리지를 알아본다. 한계점을 어떻게 보완했는지 하나씩 살펴보자.
Additional Logic이 하는 일
그리하여 1bit를 저장할 때 설계자가 제어하기 편하도록 만든 스토리지 컴포넌트인 D Flip Flop이 완성되었다! D FLip Flop을 다시 한번 정리해보자.
내용이 상당히 많았는데, 서론에서 이 포스팅은 Flip-flop의 동작 원리를 Latch와 Clock을 도입하여 설명하기 위함이라고 했다. 지금부터 요약해서 답해보겠습니다. (요약이긴 했는데 흐름성을 강조하고 싶어서 매우 구구절절임)
SR Latch는 input인 Set이 1이 되면 그 값을 Q로 보내고, 내부적으로는 이 값을 영구적으로 유지합니다. 하지만 SR Latch는 사용자의 오용(동시에 버튼 누름)으로 인해 Oscilation 문제가 발생할 수 있는데, 이 문제를 해결하려면 S와 R이 동시에 1이 되지 않도록 막아야 합니다. 조합 로직을 붙여도 하드웨어의 delay 시간이라는 근본적인 문제 때문에 로직을 추가적으로 붙이는 방식으로는 해결할 수 없죠. 그래서 Clock이라고 하는 제 3의 input을 반강제로 도입합니다. Clock이 허락하는 경우에만 S1과 R1에 의미 있는 값이 실립니다. SR Latch의 내부 input은 Clock의 주기에 맞춰서 움직입니다. Clock이 수많은 컴포넌트 내부의 input에 다 맞춰서 움직여줄 수 없기 때문입니다. 이렇게 SR Latch가 만들어졌습니다. 1 비트를 저장하는데 더할나위 없는 컴포넌트입니다. 그럼에도 SR Latch는 여러개의 비트를 저장하는데 문제가 있습니다.
우선 input이 2개라는 점입니다. 비트 개수만큼의 SR Latch를 사용할 때 저장하고자 하는 비트가 수백개, 수천개로 늘어나면 집적도에서 문제가 발생합니다. 또 클락이 1인 시간에 의존적이게 됩니다. 1인 시간이 길면 더 많은 래치를 통과하죠. 이런 방식으로는 우리가 의도하는 속도로 데이터를 저장하기 어렵습니다. 그래서 SR Latch의 권한을 빼앗아 만든 것이 Flip Flop입니다. input을 SR 2개에서 D 1개로 줄였고, Rising edge of clock을 도입하여 클락이 1이 되는 순간에만 값이 저장되도록 합니다. 결국 Flip-flop은 input을 1개로 줄여 복잡한 비트를 저장하는 컴포넌트에서 집적도의 이점을 가져갔고, Riding edge of clock을 도입하여 데이터를 저장하는 속도를 설계자가 제한할 수 있는 통제권을 부여합니다.
이 포스팅에서는 1bit storage component의 변화와, clock을 알아보았다. Clock은 컴퓨터 시스템 성능 평가에서 워낙 중요한 요소이므로 알아두어야 하는 필수적 요소이고, 1bit storage component의 변화에서 SR Latch -> D Flip flop으로 가는 흐름에서 설계자의 통제를 위해 뛰어난 성능의 컴포넌트의 권한을 뺏고 기능을 제거하여 단순화했다. 나중에 Register File까지 살펴보면 알겠지만 이렇게 단순한 컴포넌트들을 붙여서 복잡한 단계의 컴포넌트로 도약하는 순간이 온다. 이러한 접근 방식은 HW뿐만 아니라 SW를 설계할 때도 적용되므로 앞으로 공부할 때 이런 접근들이 또 있는지 주의해보자.