8비트 컴퓨터 만들기 Ben Eater Part.5(PC) [0] - Latch, flip-flop
https://www.youtube.com/watch?v=KM0DdEaY5sY
시작하며
5번째 파트는 프로그램 카운터이다.
PC (Program Counter) 파트는 선행 지식이 필요하다고 생각했고 그러한 영상도 있기에 Latch & Flip-flop 파트를 만들어봤다.
Latch는 게이트들을 꼬아서 임의의 값을 저장할 수 있게 만든 비동기형 회로다.
Latch에 clock을 넣어 동기형으로 바꾼 것이, Flip-flop이다.
여러 Latch와 Flip-flop이 있겠지만 여기서는 PC 배경지식에 필요한 S-R latch, JK flip-flop, Master-slave JS flip-flop만 약식으로 다뤄보고자 한다.
SR Latch
NOR 게이트 두 개를 꼬아서 만든 SR 게이트는 set, reset으로 두 개의 입력 값을 받고 Q, not Q로 두 개의 출력 값을 내보낸다. 회로만 봐도 알겠지만, 각각의 입력과 출력이 대칭을 이루고 있다.
게이트가 꼬아져있는게 어렵다면 1, 0을 색칠해가며 하나씩 나아가는게 도움이 된다.
전원이 공급되면 위 또는 아래의 NOR 게이트 중 하나가 몇 나노 초 먼저 1을 내보낸다.
(위 사진에서는 위에 회로가 1을 내보냈다)
그 신호 1이 다른 NOR게이트로 전송되고 그 NOR 게이트는 0을 내보낸다. 이후 흐름은 안정화된다.
이 상태에서 아래쪽 NOR 게이트 입력에 추가로 0 대신 1을 보내도 결과는 달라지지 않는다. 1 NOR 0이나 1 NOR 1은 0이라는 동일한 결과를 가지기 때문.
반면, 위쪽 NOR 게이트에 1 신호가 들어온다면, 위 사진의 흐름으로 출력 신호가 바뀐다.
놀라운 점은 딱 출력 신호가 바뀐 후 다시 안정화된다는 점이다.
Set에 신호를 주면 Q가 HIGH, Reset에 신호를 주면 not Q가 HIGH. 둘 다 신호가 없으면 유지.
둘 다 신호를 주면, 회로가 안정화 되지 않는다. 출력으로는 Q, not Q 모두 0을 내보내긴 하지만 의도랑은 전혀 맞지 않다. 그래서 "정의되지 않음"으로 두고 있다.
이 정의되지 않는 상황을 줄이고자 Enable을 추가할 수 있다. 왼쪽 사진이 그 회로이며, Enable을 AND게이트랑 연결한다.
Enable 부분에 Clock를 둔 것이 S-R Flip Flop이다. 캐퍼시터와 저항은 바로 이전 포스팅에서도 언급한 적이 있는데, Clock이 잠깐 올라가는 지점을 캐치해준다.
JK Flip-flop
S-R latch, flip-flop의 문제는 Set Reset이 둘 다 눌렸을 때 정의하지 못한다는 점이다.
이 점을 JK Flip-flop이 해결했다.
Q와 not Q에 입력으로 이어지는 전선을 추가하여 신호가 들어오든 신호가 들어오지 않든 결과가 똑같은 상황에서는 신호를 줘도 신호가 들어오지 않게 했다.
Q가 High일 때 Set이 High여도 결과가 똑같으니 이 경우에는 Set의 신호를 막아버리는 것.
그리하여, 둘 다 눌릴 경우에는 결과가 바뀌는 쪽의 입력만 살려서 Toggle이라는 올바른 결과를 만들어낸다.
참고로, 위 회로도 잘못됐다. 중간에 도저히 저 회로도를 용납할 수 없어서 댓글을 봤더니, 진짜 잘못되었다고 한다.
오류 찾아보는 건 퀴즈로 남겨두겠다.
J와 K를 동시에 눌렀을 때, Toggle이 되어야 하는데 결과가 똑같은 문제가 발생했다.
그 이유는 Racing이다. Clock이 올라간 후의 그 잠깐의 시간보다 Toggle이 되는 속도가 훨씬 더 빨라서 여러번 toggle이 이루어지는 문제이다. 저항의 크기를 줄여서 Clock이 올라간 후의 시간을 최대한 줄여보았지만, 그럼에도 toggle의 속도가 더 빨랐다.
이런 나노초 단위의 문제는 브레드 보드로는 해결하기가 힘들다.
Master-slave JK flip-flop
Racing 문제를 Master-slave JK flip-flop에서 해결한다.
두 개의 JK Flip flop을 두는데, 하나는 clock이 올라갈 때, 하나는 떨어질 때 동작이 된다. JK가 둘 다 눌렸을 때, toggle이 riging, drop 두 단계에 걸쳐 진행되다 보니 racing 문제가 방지된다.
와 toggle이라니,, 뭔가 더 합리적인 방법을 찾고 싶으면서도 논리게이트만으로 그런걸 만들었다는게 놀랍기만 하다.
사실 이 Mater-slave JK flip-flop의 toggle이 program counter의 핵심이라 이 친구를 소개하고 싶었다.
이걸로 어떻게 pc를 만들지 혼자서 생각하는 시간을 가져도 재밌을거라 생각한다.