SR과 JK 플립플롭 비교: 순차 논리의 기초
JK 플립플롭은 J=K=1을 토글로 다시 정의하여 SR 래치의 금지 상태를 해결합니다. 두 소자를 비교하고 excitation table을 유도하여 카운터를 만들어 봅니다.
요약: SR 래치는 가장 단순한 메모리 소자지만 두 입력이 모두 1일 때 금지 상태가 됩니다. JK 플립플롭은 내부 피드백(, )과 race-around 진동을 막는 master-slave 클록을 사용하여 J=K=1을 토글로 다시 정의하고 이 문제를 해결합니다.
가산기와 멀티플렉서 같은 조합 회로는 현재 입력만으로 출력을 만듭니다. 순차 논리는 메모리를 추가합니다. 플립플롭은 클록 사이클을 지나도 상태를 유지합니다. 이 가이드에서는 순차 논리의 두 기본 부품인 SR 래치와 JK 플립플롭을 비교하고, JK 설계가 SR의 결정적인 결함을 어떻게 없애는지 보여 줍니다.
조합 논리와 순차 논리
가산기와 멀티플렉서 같은 조합 회로는 전파 지연이 지난 뒤 현재 입력 값으로 결정되는 출력을 냅니다. 실제 입력은 항상 유효한 레벨로 구동해야 합니다. “입력이 없음”은 특별한 연산이 아니며 떠 있는 입력은 전기적으로 정의되지 않습니다.
순차 회로는 결정적인 속성인 상태를 더합니다. 출력은 현재 입력뿐 아니라 입력 이력에도 의존하므로 메모리를 가집니다. 플립플롭은 Q=0 또는 Q=1 상태에 있을 수 있고 명시적으로 바꾸라는 지시가 올 때까지 유지합니다. 이 속성이 계산을 가능하게 합니다. 상태가 없으면 레지스터, 카운터, 프로그램 카운터, CPU도 없습니다.
SR 래치: 메모리가 시작되는 곳
SR 래치(Set-Reset Latch)는 교차 결합된 NOR 게이트 또는 NAND 게이트 두 개로 만드는 가장 단순한 메모리 소자입니다. S(Set), R(Reset) 두 입력과 서로 보수인 Q, 두 출력이 있습니다.

SR 래치 진리표
| S | R | Q(다음) | 동작 |
|---|---|---|---|
| 0 | 0 | Q(변화 없음) | 유지(메모리) |
| 0 | 1 | 0 | Reset(Clear) |
| 1 | 0 | 1 | Set(1 저장) |
| 1 | 1 | ? | INVALID(금지) |
SR 래치 특성식
동작은 다음 식으로 정식화할 수 있습니다.
제약 은 SR 래치의 근본적인 약점입니다. 식은 S와 R이 동시에 ‘1’이 아닐 때만 유효합니다. 이 제약을 위반하면 금지 상태가 되어 두 출력이 모두 ‘0’으로 내려가고, 입력을 놓았을 때 최종 상태는 비결정적인 경쟁으로 정해집니다.

금지 상태가 위험한 이유
S=R=1이면 두 NOR 게이트가 모두 ‘0’을 출력하도록 강제되어 Q = = 0이라는 논리적 모순이 생깁니다. 두 입력이 동시에 ‘0’으로 돌아오면 두 게이트 모두 ‘1’을 출력하려고 경쟁합니다. 승자는 전파 지연, 온도, 제조 공정 오차의 나노초 수준 차이에 달려 있습니다. 결과는 예측할 수 없고, 최악에는 출력이 유효한 ‘0’도 ‘1’도 아닌 중간 전압인 준안정 상태에 빠질 수 있습니다.
JK 플립플롭: 완전한 해법
JK 플립플롭은 SR 래치의 금지 상태를 정면으로 해결합니다. 조건을 미정으로 남기지 않고 각 클록 에지에서 출력이 반전되는 토글로 다시 정의합니다. 이 한 가지 혁신이 결함 있는 메모리 소자를 디지털 설계에서 가장 다재다능한 플립플롭으로 바꿉니다.

JK 플립플롭 진리표
| J | K | Q(다음) | 동작 |
|---|---|---|---|
| 0 | 0 | Q(변화 없음) | 유지 |
| 0 | 1 | 0 | Reset |
| 1 | 0 | 1 | Set |
| 1 | 1 | (반전) | 토글 |
JK 플립플롭 특성식
현재 상태에서 피드백은 set과 reset 요청을 서로 배타적으로 만듭니다. 가 J 항을 게이트하고 가 K 항을 게이트하므로 SR의 금지 입력 조합이 사라집니다. 그러나 피드백만으로는 레벨 민감형 JK 설계의 race-around를 막지 못합니다. master–slave 또는 edge-triggered 타이밍이 장치를 한 sampling event당 외부에서 보이는 전이 하나로 제한합니다.

Master-Slave 아키텍처
초기 JK 설계는 레벨 트리거 방식이어서 race-around condition이 생겼습니다. 클록 펄스가 충분히 오래 High이면 토글된 출력이 피드백되어 같은 펄스 안에서 다시 토글되고, 제어할 수 없는 진동이 일어났습니다.
해법은 SR 래치 두 개를 직렬로 사용하는 master-slave 아키텍처입니다.
- Master 래치: 클록이 HIGH인 동안 입력을 캡처합니다. 출력은 slave와 격리됩니다.
- Slave 래치: 클록이 LOW로 전이될 때 master 출력을 캡처합니다. 이때 외부 Q 출력이 실제로 바뀝니다.
master와 slave가 동시에 투명해지는 일이 없으므로 출력은 클록 사이클당 한 번만 바뀔 수 있습니다. 현대 구현은 edge-triggering으로 같은 효과를 더 효율적으로 얻지만, master-slave 개념을 이해하면 JK 플립플롭에 클록이 필요한 이유와 race-around 문제를 피하는 원리를 알 수 있습니다.
Race-Around Condition 자세히 보기
race-around condition은 클로킹 전략의 중요성을 잘 보여 주므로 자세히 살펴볼 가치가 있습니다.
J=K=1인 단순한 레벨 트리거 JK 래치의 토글 순서는 다음과 같습니다.
- 클록이 HIGH가 되면 출력이 0에서 1로 토글됩니다.
- 새 출력 Q=1이 입력 게이트로 피드백됩니다.
- 클록은 아직 HIGH입니다. 게이트 논리가 새 상태를 보고 다시 토글하여 Q가 1에서 0으로 바뀝니다.
- 클록이 HIGH인 동안 이 주기가 반복됩니다.
출력은 게이트의 전파 지연 주파수로 진동하여 사실상 링 발진기가 됩니다. 클록이 내려갈 때의 최종 상태는 정확한 펄스 폭과 게이트 지연의 관계에 달려 있어 비결정적입니다.
digisim.io에서 사용하는 edge-triggered JK 플립플롭은 이 문제를 완전히 없앱니다. 플립플롭은 클록 전이 순간에만 J와 K를 샘플링합니다. 출력이 바뀌어 피드백될 때는 이미 샘플링 창이 닫혀 있습니다.
Excitation Table: 플립플롭으로 설계하기
카운터나 상태 머신 같은 순차 회로를 설계할 때는 원하는 상태 전이에서 거꾸로 필요한 입력을 구합니다. 이때 excitation table이 필수입니다.
SR 래치 Excitation Table
| (현재) | (목표) | S | R |
|---|---|---|---|
| 0 | 0 | 0 | X |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 |
| 1 | 1 | X | 0 |
(X = 무관 조건)
JK 플립플롭 Excitation Table
| (현재) | (목표) | J | K |
|---|---|---|---|
| 0 | 0 | 0 | X |
| 0 | 1 | 1 | X |
| 1 | 0 | X | 1 |
| 1 | 1 | X | 0 |
JK excitation table에는 무관 조건이 많습니다. 각 전이에 무관 조건 하나가 있습니다. SR 표는 무관 조건이 더 적고 제약도 계속 지켜야 합니다. 추가 무관 조건 덕분에 플립플롭을 구동하는 조합 논리를 설계할 때 불 식을 훨씬 더 많이 단순화할 수 있습니다. 실제 설계에서 게이트 수를 줄일 때 분명한 장점입니다.
종합 비교
| 특징 | SR 래치 | JK 플립플롭 |
|---|---|---|
| 입력 | S(Set), R(Reset) | J, K, Clock |
| S=R=1 / J=K=1 | Invalid(경쟁 상태) | 토글(명확히 정의됨) |
| 트리거 방식 | 레벨 민감형(비동기) | 에지 트리거(동기) |
| 클록 필요? | 아니요(기본 SR 래치) | 예 |
| 특성식 | ||
| 금지 상태 | 있음(S=R=1) | 제거됨 |
| Excitation table의 무관 조건 | 더 적음 | 더 많음(최적화에 유리) |
| Race-around 위험 | 해당 없음(클록 없음) | edge-triggering으로 제거 |
| 구현 크기 | 핵심 래치에 교차 결합 게이트 두 개 | 구현에 따라 다름. master–slave와 edge-triggered 형태는 추가 저장 및 게이팅 필요 |
| 주요 용도 | 제어 상태 유지, 스위치 디바운싱 | 카운터와 교육용 상태 머신 설계 |
| 다른 플립플롭 형식을 만들 수 있나? | 제한적 | 가능(범용) |
Edge Triggering: 클록의 역할
현대 플립플롭은 edge-triggered 방식으로 클록 전이의 정확한 순간에만 상태를 바꿉니다. 언제든 입력에 반응하는 레벨 민감형 SR 래치와 근본적으로 다릅니다.

edge triggering은 세 가지 중요한 보장을 제공합니다.
- 정의된 샘플링 이벤트: setup과 hold 제약이 충족되면 지정된 에지에서 입력을 캡처합니다.
- 시간 필터링: 샘플링 창과 겹치지 않는 데이터 글리치는 캡처되지 않습니다. 클록 글리치와 에지 근처의 데이터 변화는 여전히 위험합니다.
- 조합 가능성: 여러 플립플롭이 클록을 공유하고 각자의 clock-to-Q 지연 뒤에 갱신되어 다중 비트 상태를 조정할 수 있습니다.
SR과 JK 사이 변환
JK 플립플롭은 “범용”으로 여겨지므로 다른 플립플롭 형식을 흉내 낼 수 있습니다. 변환 방식을 이해하면 두 부품을 더 깊이 알 수 있습니다.
SR에서 JK로 변환: Q와 를 피드백하는 AND 게이트를 추가합니다.
피드백은 J=K=1일 때 현재 상태에 따라 S와 R 중 하나만 활성화되도록 합니다. 그 결과 금지된 SR 상태를 구조적으로 막으면서 토글 동작을 만듭니다.
JK에서 D로 변환: D를 J에, 를 K에 연결합니다.
JK에서 T로 변환: J와 K를 묶어 하나의 T 입력으로 사용합니다.
카운터 만들기: JK 플립플롭의 대표 응용
J=K=1이면 JK 플립플롭은 모든 클록 에지에서 토글되므로 이진 카운터의 자연스러운 구성 요소입니다. JK 플립플롭 네 개를 Q 출력이 다음 단계의 클록을 구동하도록 연결하면 0000부터 1111까지 진행하는 4비트 리플 카운터가 됩니다.
리플 카운터(비동기)
리플 카운터에서는 각 플립플롭의 Q 출력이 다음 플립플롭의 클록 입력을 구동합니다. 각 단계가 다음 단계를 트리거하면서 count가 체인을 따라 “물결칩니다.”
- FF0은 모든 시스템 클록 에지에서 토글됩니다(주파수 = ).
- FF1은 모든 FF0 전이에서 토글됩니다(주파수 = ).
- FF2는 모든 FF1 전이에서 토글됩니다(주파수 = ).
- FF3은 모든 FF2 전이에서 토글됩니다(주파수 = ).
출력 Q3 Q2 Q1 Q0는 클록 사이클마다 1씩 증가하는 4비트 이진수를 나타냅니다. 각 단계가 전파 지연을 더하므로 상위 비트가 하위 비트보다 늦게 안정된다는 대가가 있습니다. 각 클록 에지 직후 아주 짧은 동안 카운터 출력이 잘못된 과도 값을 보일 수 있습니다. 고속 응용에서는 이 리플 지연이 문제가 되므로 모든 플립플롭이 같은 클록을 공유하는 동기 카운터가 선호됩니다.
동기 카운터
동기 카운터에서는 모든 플립플롭이 시스템 클록을 공유합니다. 각 플립플롭의 J와 K 입력은 현재 상태에서 유도한 조합 논리가 구동합니다. 3비트 동기 up-counter는 다음과 같습니다.
- FF0: J0=K0=1(항상 토글)
- FF1: J1=K1=Q0(Q0=1일 때만 토글)
- FF2: J2=K2=Q0 Q1(Q0와 Q1이 모두 1일 때만 토글)
모든 단계가 같은 클록 에지를 샘플링하므로 단계별로 클록이 통과하는 리플 의존성이 사라집니다. 그래도 출력에는 clock-to-Q 지연이 있고 조합 enable 논리에도 지연이 있으며, 서로 다른 비트가 물리적으로 정확히 같은 순간에 바뀔 필요는 없습니다.



설계 예제: Excitation Table 사용하기
excitation table의 실용적 가치를 보이기 위해 JK 플립플롭으로 0, 1, 2, 3, 0, 1, … 순서로 세는 단순한 2비트 카운터를 설계해 봅시다.
1단계: 상태표. 각 조합에 대한 현재 상태와 목표 다음 상태를 나열합니다.
| 현재 Q1 | 현재 Q0 | 다음 Q1 | 다음 Q0 |
|---|---|---|---|
| 0 | 0 | 0 | 1 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 1 |
| 1 | 1 | 0 | 0 |
2단계: excitation table 적용. 각 플립플롭에 필요한 J와 K 입력을 구합니다.
FF0(Q0)의 전이는 0->1, 1->0, 0->1, 1->0입니다. JK excitation table에서 모든 경우 J0=1, K0=1입니다. 따라서 J0=K0=1이고 FF0은 항상 토글됩니다.
FF1(Q1)의 전이는 0->0, 0->1, 1->1, 1->0입니다. excitation table을 적용하면 J1=0/K1=X, J1=1/K1=X, J1=X/K1=0, J1=X/K1=1입니다. 카르노 맵으로 J1=Q0, K1=Q0를 얻습니다.
결과: 2비트 동기 카운터에는 J0=K0=1과 J1=K1=Q0가 필요합니다. 플립플롭과 Q0에서 FF1의 J, K 입력으로 가는 전선 하나 외에는 추가 게이트가 필요하지 않습니다. 무관 조건이 많아 최소화가 쉬웠으며, SR 대신 JK를 선택한 직접적인 이점입니다.
응용 요약
| 응용 | 부품 | 이유 |
|---|---|---|
| 스위치 디바운싱 | SR 래치 | 단순하고 클록이 필요 없으며 첫 접촉이 상태를 설정함 |
| SRAM 개념 | 교차 결합 쌍안정 피드백 | 고밀도 SRAM은 보통 패키지형 SR 래치가 아니라 교차 결합 인버터와 access transistor를 사용함 |
| 이진 카운터 | JK 플립플롭 | 토글 모드가 자연스럽게 count함 |
| 주파수 분주기 | JK 또는 T 플립플롭 | 각 단계가 클록을 2로 나눔 |
| 상태 머신(FSM) | JK 플립플롭 | 무관 조건이 논리를 단순화함 |
| CPU 레지스터 | D 플립플롭 | 가장 단순한 데이터 캡처, 금지 상태 없음 |
| 시프트 레지스터 | D 플립플롭 | 단계 사이에서 직렬 데이터 이동 |
직접 해 보기
digisim.io에서 다음 회로를 실험하세요.
- SR 래치: NOR 게이트 두 개로 만들고 네 입력 조합을 모두 시험합니다. 금지 상태를 주의 깊게 관찰하세요.
- JK 토글 모드: J=K=1로 클록에 연결하고 오실로스코프로 각 에지에서 Q가 토글되는 모습을 봅니다.
- 3비트 리플 카운터: 토글 모드의 JK 플립플롭 세 개를 연결합니다. Q 출력을 오실로스코프에 연결하여 이진 count 패턴을 관찰합니다.
- SR-to-JK 변환: SR 래치, AND 게이트 두 개, 클록으로 JK 플립플롭을 만듭니다. J=K=1이 금지 상태 대신 깔끔한 토글을 만드는지 확인합니다.
- Excitation table 연습: JK 플립플롭으로 mod-6 카운터를 설계합니다. excitation table로 각 플립플롭의 J, K 입력 논리를 유도하세요.
이 원시 소자들로 완전한 FSM을 만들려면 카운터와 상태 머신을 이어서 읽고, 레지스터에서 흔히 쓰는 동기 저장 소자는 D 플립플롭 문서에서 확인하세요.



