💻 Computer Science/Computer Structure

[CODE] Chapter 14 피드백과 플립플롭

이오🐥 2023. 9. 22. 13:55

CODE 책을 읽으면서 발표 중인데,

블로그에도 기록하고 싶은 챕터가 생겼다..!

 

CS는 같은 내용이어도 읽을 때마다 이해하는 방향이 달라지는 느낌이다.

어떨 때는 글자 그대로 읽히다가도, 어떨 때는 어? 그럼 이건 뭐지 하다가도..

분명 전에 공부했는데 이건 뭐였지? 하기도 한다ㅋㅋㅋㅋ

 

근데 플립플롭이 나에게 특히나 더 그런 존재.. 읽을 때마다 새로움...

아무튼 그래서 이번엔 CODE 책의 플립플롭 내용을 정리해봤다!


Chapter 14 피드백과 플립플롭

전기가 무언가를 움직이게 할 수 있다는 것은 누구나 알고 있다.

이 현상을 이용한 가장 간단하면서 멋진 전기 버저와 초인종을 예로 들어보자.

일반적으로 릴레이의 입력은 출력과 완전히 분리되어 있지만,

여기서는 릴레이의 출력이 둥그렇게 회로를 돌아서 다시 입력으로 연결된다.

스위치를 닫으면 원형 회로를 완성하는 것이다.

완성된 회로에서는 전자기력이 발생해 휘어질 수 있는 금속 접점을 끌어당긴다.

하지만, 접점의 위치가 바뀌면 회로는 다시 완성되지 않은 상태로 돌아가고,

전자기력이 사라져 휘어질 수 있는 접점이 다시 원래 위치로 돌아간다(flip back).

 

그러면 회로는 다시 완성된 상태로 변하게 된다.

스위치가 닫히고, 금속 접점이 앞뒤로 왔다 갔다 하면서

회로가 열렸다 닫히는 동작을 반복해 소리를 만들어낸다.

이 접점이 소리를 내면 버저, 종을 치면 전기 벨이 된다.

 

인버터는 입력과 반대로 출력한다.

여기서 인버터가 계속 동작하게 하려면 스위치를 달지 않으면 될 것이다.

인버터 역시 어떤 상태에서 다른 상태로 변할 때 약간의 시간이 필요하다.

따라서 입력에 출력 값이 전달되어 같은 값이 되더라도, 또 출력이 바뀌어 입력과 반대되는 값이 된다.

이 회로의 출력은 전압이 공급되는 상태와 공급되지 않는 상태를 빠르게 왔다 갔다 할 것이다.

출력이 0과 1 사이를 빠르게 왔다 갔다 한다는 뜻이다.

 

이런 회로를 오실레이터(oscillator, 진동자)라고 부른다.

오실레이터는 외부의 개입 없이 자체적으로 동작하기 때문에 사람의 조작이 필요하지 않다.

모든 컴퓨터들은 다양한 형태의 오실레이터를 가지고 있어서 다양한 회로들이 동기적으로 동작하도록 만들어준다.

 

오실레이터의 출력이 0과 1을 반복하며 일종의 진동을 발생시킨다.

진동의 횟수를 세면 시간에 관련된 정보를 알 수 있기 때문에, 오실레이터를 클럭(clock)이라고 부른다.

한 사이클 동안 걸리는 시간을 오실레이터의 주기(period)라고 한다.

0.05초의 주기를 가지는 오실레이터라면 주파수는 초당 20사이클이다.

단위로는 헤르츠(hertz)를 사용하고, 위 오실레이터는 20헤르츠 주파수를 가지고 있다고 할 수 있고, 20Hz라 쓴다.

 

 

오실레이터의 속도를 실제로 측정할 수 있는 장치를 만들 수 있게 될텐데,

그 첫 번째 NOR 게이트의 연결을 알아보자.

NOR 게이트의 동작은 두 입력에 모두 전압이 제공되지 않을 때 출력에 전압이 제공되는 형태이다.

오른쪽 회로를 보면, 왼쪽에 있는 NOR 게이트의 출력이 오른쪽 NOR 게이트의 입력으로 들어가고,

오른쪽 NOR 게이트의 출력이 다시 왼쪽 NOR 게이트의 입력으로 들어가는 형태를 피드백(feedback)이라고 한다.

처음에는 왼쪽 NOR 게이트의 출력에서만 전류가 흐른다.

이후 위쪽 스위치를 닫으면 왼쪽 NOR 게이트의 출력이 0이 되고,

오른쪽 NOR 게이트의 출력이 1이 되어 전구에 불이 들어온다.

위쪽 스위치를 열어보자. 왼쪽 NOR 게이트의 상태가 변하지 않게 되어 전구는 계속 켜 있게 된다.

스위치의 상태와 관계없이 왼쪽 NOR 게이트의 출력은 0을 유지하기 때문에

회로에 더 이상 영향을 줄 수 없는 상황이 된다.

아래쪽 스위치를 닫아보자. 오른쪽 NOR 게이트의 두 입력 중 하나가 1이기 때문에 전구에 불이 더 이상 들어오지 않는다.

다시 아래쪽 스위치를 열더라도 전구는 꺼진 상태를 유지한다. 다시 처음 상태로 돌아간 것이다.

이 상태에서는 아래쪽 스위치를 닫거나 여는 것이 전구의 상태에 더 이상 영향을 주지 못한다.

 

요약하자면,

  • 위쪽 스위치를 닫으면 전구가 켜지며, 그 이후에는 스위치가 열리더라도 그 상태(전구가 켜진 상태)를 유지하게 된다.
  • 아래쪽 스위치를 닫으면 전구가 꺼지며, 그 이후에는 스위치가 열리더라도 그 상태(전구가 꺼진 상태)를 유지하게 된다.

두 스위치가 열려 있더라도 어떤 경우에는 전구에 불이 들어오고, 어떤 경우에는 전구에 불이 들어오지 않는다.

위와 같은 경우를 ‘이 회로는 두 스위치가 모두 열려 있을 때 두 가지 안정된 상태(stable state)를 가지고 있다’고 한다.

그리고 이런 회로를 플립 플롭(flip-flop)이라고 한다.

 

플립플롭의 회로는 정보를 유지할 수 있다는 특징이 있다. 정보를 ‘기억할 수 있는 것’이다.

위와 같은 형태의 플립플롭은 직전에 어떤 스위치가 닫혔는지에 대한 정보를 기억하고 있는데,

만일 불이 켜져 있는 상태면 가장 최근에 위쪽의 스위치가 닫힌 적이 있는 것이고,

불이 꺼져 있는 상태면 가장 최근에 아래쪽 스위치가 닫힌 적이 있는 것이라 추측할 수 있다.

 

플립플롭은 중간의 불안정한 상태에 오랫동안 머물러 있지 않아서

회로에 정보 저장 기능(memory)을 추가하여 이전에 어떻게 동작했는지 기록할 수 있다.

 

지금까지 살펴 본 형태의 플립플롭이 가장 간단한 형태로

리셋-셋(Reset-Set) 플립플롭이고, 짧게 R-S 플립플롭이라 부른다.

전구를 연결한 출력 부분은 Q이고, 두 번째 출력은 Q와 반대되는 값으로 Q 바 라고 부른다.

Q 바는 Q 바는 Q와 반대되는 값을 가진다.

Set은 Q를 1로 설정하고, Reset은 Q를 0으로 초기화한다.

S가 1이 되면(위쪽 스위치를 닫으면), Q는 1이 되고, Q 바는 0이 된다.

R이 1이 되면(아래쪽 스위치를 닫으면), Q는 0이 된고 Q 바는 1이 된다.

 

R-S 플립플롭에서는 2개의 입력이 있어 4개의 조합이 가능하다.

S와 R이 모두 0인 경우, Q와 Q 바는 이전 출력 값을 유지한다는 것이다.

아래 둘 다 1인 경우는 허용되지 않는다.

두 입력을 모두 1로 두면 Q와 Q 바 모두 출력이 0이 되며 두 값이 반대라는 개념을 어기게 된다.

 

 

어떤 신호가 어떤 시점에서 0이었는지 혹은 1이었는지 기억할 수 있는 회로가 더 유용할 것이다.

‘어떤 시점’에서의 ‘어떤 신호’의 값을 보관해야하므로, 두 개의 입력을 가져야 한다.

첫 번째 입력 신호를 데이터(Data), 두 번째 입력 신호를 ‘값 보존(Hold that Bit)’라고 부르자.

값 보존이 1이면 데이터 신호 값이 출력에 반영되고, 0이면 마지막 값을 계속 기억하고 있는다.

 

값 보존 신호가 0이 되면 출력 Q는 이전 값을 유지하게 되어 데이터 입력과 관계없이 일정한 값을 유지한다.

이는 R-S 플립플롭의 입력에 AND 게이트 두 개를 추가하여 구현할 수 있다.

AND 게이트는 두 입력이 모두 1인 경우에만 출력이 1로 되므로, Q 출력이 0이고, Q 바 출력은 1이 된다.

값 보존 신호가 0이 되어도 Set 신호는 출력에 아무런 영향을 미치지 못한다. 리셋 신호도 마찬가지이다.

값 보존 신호가 1이 되었을 때만 R-S 플립플롭과 동작이 같아진다.

하지만 우리는 두 개의 입력을 가진 회로를 만들고자 했다.

R-S 플립플롭에서 R과 S가 동시에 1인 경우는 허용되지 않고, 둘 다 0인 경우도 그다지 좋지 않으니

Set이 1이면 Reset을 0으로 만들고, 0이면 Reset을 1로 반전(invert) 시켜서 사용하자.

두 입력이 0인 경우, Q 값도 0인 상태고, 값 보존 신호가 0인 동안에는 데이터 입력이 회로에 영향을 주지 못한다.

값 보존 신호가 1이 되면 Q 출력은 데이터 신호와 동일한 값이 되고, Q 바 출력은 반대로 가진다.

값 보존 신호를 다시 0으로 바꿔보자.

회로는 데이터의 값이 어떤 값이었는지에 관계없이 값 보존 비트가 마지막으로 1이었던 시점을 기억한다.

데이터가 0으로 돌아가도 출력에 영향이 없다.

 

이러한 형태의 회로를 레벨 트리거 D-타입 플립플롭이라 한다.

여기서 D는 데이터이고, 레벨 트리거는 값 보존 입력이 특정 값인 경우에 이 플립플롭이 데이터 입력 값을 저장한다는 의미이다.

 

실제로 이와 유사한 회로를 사용할 때, 입력으로 ‘값 보존’이라는 이름은 잘 사용되지 않는다.

보통 클럭(Clock)이라는 이름이 사용된다. 클럭은 0과 1을 주기적으로 왔다 갔다 하는 신호로,

여기서는 데이터 입력이 언제 저장되어야 하는지 알려주는 신호라고 생각하면 된다.

 

이 회로는 레벨 트리거 D-타입 래치라고도 불리며,

해당 회로가 한 비트의 데이터를 나중에 사용하기 위해 저장(latch)할 수 있다는 의미이다.

이 회로는 1-bit 메모리 라고도 불린다.