JK 입력식으로 동기 카운터 만들기
목표 상태에서 여기표·카르노 맵·JK 입력식을 도출하고 같은 클록의 동시 갱신을 검증합니다.
플립플롭의 입력표는 주어진 J·K로 무엇이 일어나는지 알려 줍니다. 회로를 설계할 때는 반대로 원하는 다음 상태를 만들려면 어떤 입력을 넣어야 하는지를 물어야 합니다. 카르노 맵의 무관 조건도 이 입력 선택에서 쓰입니다.
목표 상태와 여기표
두 비트 Q1·Q0가 같은 상승 에지에 갱신하는 동기 카운터를 만듭니다. reset이 활성인 에지에는 00을 저장하고, 그 외에는 00→01→10→11→00으로 갑니다. 두 비트의 네 상태를 모두 사용하므로 이 설계에는 사용하지 않는 상태가 없습니다.
여기표(excitation table)는 현재 Q와 목표 Q′에서 필요한 입력을 역으로 찾은 표입니다. X는 입력 0·1 중 어느 것을 골라도 해당 전이가 같다는 뜻입니다. 상태를 몰라도 된다는 뜻이나 실제 게이트에 제3의 전압 X를 연결한다는 뜻이 아닙니다.
| 현재 Q | 목표 Q′ | J | K | 이유 |
|---|---|---|---|---|
| 0 | 0 | 0 | X | 00의 유지와 01의 reset 모두 0 |
| 0 | 1 | 1 | X | 10의 set과 11의 toggle 모두 1 |
| 1 | 0 | X | 1 | 01의 reset과 11의 toggle 모두 0 |
| 1 | 1 | X | 0 | 00의 유지와 10의 set 모두 1 |
reset이 0인 정상 동작의 네 전이에 표를 각각 적용합니다.
| Q1 Q0 | Q1′ Q0′ | J1 | K1 | J0 | K0 |
|---|---|---|---|---|---|
| 00 | 01 | 0 | X | 1 | X |
| 01 | 10 | 1 | X | X | 1 |
| 10 | 11 | X | 0 | 1 | X |
| 11 | 00 | X | 1 | X | 1 |
무관 조건을 이용해 입력식 줄이기
각 입력을 Q1 행·Q0 열의 2×2 K-map에 놓습니다. 두 값의 0·1 순서는 한 비트 차이라 이웃 조건을 만족합니다. 괄호 안 두 값은 그 행의 Q0=0·1 순서입니다.
| 입력 맵 | Q1=0 행 | Q1=1 행 | 선택한 묶음과 식 |
|---|---|---|---|
| J0 | (1, X) | (1, X) | X를 1로 골라 네 칸 묶음 → 1 |
| K0 | (X, 1) | (X, 1) | X를 1로 골라 네 칸 묶음 → 1 |
| J1 | (0, 1) | (X, X) | Q0=1 열의 X를 1로 골라 세로 두 칸 → Q0 |
| K1 | (X, X) | (0, 1) | Q0=1 열의 X를 1로 골라 세로 두 칸 → Q0 |
J1·K1의 Q0=0 열에 남은 X는 0으로 골라 식을 완성합니다. 따라서 J0=K0=1, J1=K1=Q0입니다. Q0는 매번 toggle하고 Q1은 에지 직전 Q0=1일 때만 toggle합니다. 모든 상태를 실제로 쓰지만 JK 입력에 X가 있을 수 있습니다. 현재 상태 하나에서 J 또는 K가 결과에 영향을 주지 않는 소자의 규칙 때문입니다.
이전 Q0가 상위 비트의 반전을 고릅니다
이전 Q0=0이므로 상위 비트는 유지한다. 두 비트가 토글해 0으로 돌아간다. 각 단계의 값과 전환 이유를 비교합니다.
컴퓨터구조 · 논리 연결
이전 Q0가 상위 비트의 반전을 고릅니다
J0·K0에는 논리 1, J1·K1에는 에지 직전 Q0를 연결합니다. 두 JK 소자는 같은 상승 에지에서 갱신합니다.
정상 동작의 입력 연결 개요입니다. Q0는 상위 소자의 클록이 아니라 J1·K1에 연결됩니다. reset 동안 J=0·K=1을 선택하는 추가 논리, 전원·setup/hold·배선 지연은 본문에서 따로 구분합니다.
이 예의 조건
- 본문과 전체 도표의 예를 따라 00→01부터 11→00까지 진행합니다.
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 00→01 이전 Q0=0이므로 상위 비트는 유지한다. |
|
|
| 01→10 이전 Q0=1이므로 두 비트가 토글한다. |
|
|
| 10→11 이전 Q0=0이므로 Q1은 유지한다. |
|
|
| 11→00 두 비트가 토글해 0으로 돌아간다. |
|
|
이전 Q0가 상위 비트의 반전을 고릅니다
이전 Q0=0이므로 상위 비트는 유지한다. 두 비트가 토글해 0으로 돌아간다. 각 단계의 값과 전환 이유를 비교합니다.
컴퓨터구조 · 논리 연결
이전 Q0가 상위 비트의 반전을 고릅니다
J0·K0에는 논리 1, J1·K1에는 에지 직전 Q0를 연결합니다. 두 JK 소자는 같은 상승 에지에서 갱신합니다.
정상 동작의 입력 연결 개요입니다. Q0는 상위 소자의 클록이 아니라 J1·K1에 연결됩니다. reset 동안 J=0·K=1을 선택하는 추가 논리, 전원·setup/hold·배선 지연은 본문에서 따로 구분합니다.
이 예의 조건
- 본문과 전체 도표의 예를 따라 00→01부터 11→00까지 진행합니다.
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 00→01 이전 Q0=0이므로 상위 비트는 유지한다. |
|
|
| 01→10 이전 Q0=1이므로 두 비트가 토글한다. |
|
|
| 10→11 이전 Q0=0이므로 Q1은 유지한다. |
|
|
| 11→00 두 비트가 토글해 0으로 돌아간다. |
|
|
그림은 두 JK 소자의 입력 연결과 공통 클록을 나타냅니다. Q0를 상위 비트 소자의 클록으로 쓰지 않고 J1·K1에 연결합니다. Q0를 클록으로 쓰는 리플 카운터와 이 동기 카운터를 구분하세요. reset 회로·전원·실제 게이트 지연은 그림에서 생략하고 아래 모델 경계로 설명합니다.
한 에지의 두 결과를 이전 값으로 계산하기
현재 01에서 Q0는 1이므로 Q0′=0, Q1′=1입니다. 두 결과를 계산한 뒤 함께 저장해 10이 됩니다. Q0를 먼저 0으로 저장하고 그 새 값으로 J1·K1을 계산하면 Q1을 유지하여 잘못된 00을 얻습니다. 코드에서는 old_q0를 먼저 보관합니다.
def jk(q, j, k):
return int((j and not q) or (not k and q))
def counter_step(state, reset=False):
if state not in range(4):
raise ValueError("2비트 상태만 사용합니다")
if reset:
return 0
old_q1, old_q0 = divmod(state, 2)
next_q0 = jk(old_q0, 1, 1)
next_q1 = jk(old_q1, old_q0, old_q0)
return 2 * next_q1 + next_q0
expected = {0: 1, 1: 2, 2: 3, 3: 0}
for current, answer in expected.items():
assert counter_step(current) == answer
assert counter_step(current, reset=True) == 0
state = 0
trace = []
for _ in range(8):
state = counter_step(state)
trace.append(state)
assert trace == [1, 2, 3, 0, 1, 2, 3, 0]
print(trace)jk_counter.py로 저장해 실행하면 위 상태열을 출력합니다. 독립적인 목표 상태 표의 네 값을 모두 검사했지만 setup·hold·글리치·clock skew를 시뮬레이션한 것은 아닙니다.
리셋과 실제 소자의 경계
현재 함수는 reset이 있는 에지에 결과 00을 만드는 동기 reset 동작을 정의합니다. J·K 정상 동작 식만으로 reset 배선까지 완성된 것은 아닙니다. 이를 입력에 넣으려면 reset 동안 각 비트 J=0·K=1을 선택하는 추가 입력 논리가 필요합니다. 비동기 clear 핀을 사용하는 실제 부품은 에지 외에도 상태가 바뀌므로 같은 시간표로 읽을 수 없습니다.
onsemi SN74LS76A 데이터시트의 물리 2쪽은 하강 에지 동작과 직접 set/clear 조건을 제공합니다. 이 절의 상승 에지·동기 reset 교육 모델을 해당 제품의 실제 배선·타이밍으로 간주하지 않습니다. 실제 동기 회로에서는 에지 직전 입력 안정, 출력·조합논리 지연, 설정/유지 시간을 확인해야 합니다. MIT 순차논리 강의는 이 시간 조건을 설명합니다.
독립 문제: 상위 비트의 입력을 고정하면
J0=K0=1은 그대로 두고 J1=K1=1로 잘못 연결했습니다. 초기 00에서 네 에지 뒤 상태열을 쓰고 정상 카운터의 어느 전이와 달라지는지 설명하세요. 정상 입력식에서 현재 11에 reset=1인 에지의 결과도 구하세요.
힌트
J=K=1이면 현재 값과 무관하게 해당 비트가 한 번 반전합니다. 두 비트가 모두 반전하는지 봅니다.
풀이
잘못된 상태열은 11→00→11→00입니다. 첫 00→11부터 목표 00→01과 다릅니다. 정상 회로에서 11·reset=1이면 동기 reset의 우선 규칙으로 00이며, 에지 전에 즉시 00이 된다고 설명하면 안 됩니다. 3·4비트 카운터와 ring counter는 별도 확장입니다. 다음 CPU 데이터 경로는 상태 저장과 입력 선택을 명령 실행에 연결합니다.