본문 바로가기

래치·플립플롭·클록

입력이 허용된 동안 출력이 입력을 따라가는 래치와 클록의 상승 에지에서만 값을 받아들이는 플립플롭을 시간 순서로 비교하고, SR 래치와 JK·T·D 플립플롭의 다음 상태 규칙을 정리합니다. 설정 시간과 유지 시간, 회로의 지연으로 클록 주기를 계산합니다.

경고 버튼을 잠깐 눌렀다 떼어도 경고등은 계속 켜져 있어야 합니다. 그러려면 회로가 "버튼이 눌린 적이 있다"는 사실을 기억해야 하는데, 앞 장의 조합 회로는 지금의 입력만 보므로 이 일을 할 수 없습니다. 지금의 입력과 함께 이전에 저장해 둔 상태를 쓰는 회로를 순차 논리 회로(sequential logic circuit)라고 합니다. 이 글에서는 한 비트를 기억하는 기본 소자인 래치와 플립플롭, 그리고 언제 값을 받아들일지를 정하는 클록을 다룹니다.

래치와 플립플롭은 받아들이는 시점이 다르다

래치(latch)는 값을 받아들이도록 허용된 동안에는 입력의 변화가 그대로 출력에 전해지는 소자입니다. D 래치는 허용 신호 E가 1인 동안 출력 Q가 입력 D를 따라가고, E가 0이 되면 마지막 값을 붙잡아 둡니다. E가 1인 동안 입력이 출력으로 그대로 비쳐 보인다는 뜻에서 투명(transparent)하다고도 합니다.

D 플립플롭(D flip-flop)은 클록 신호가 0에서 1로 바뀌는 순간, 곧 상승 에지(rising edge)에서만 D를 받아들여 Q를 바꿉니다. 에지와 에지 사이에는 D가 아무리 바뀌어도 Q는 그대로입니다. 이렇게 신호가 바뀌는 순간에만 동작하는 방식을 에지 트리거(edge-triggered)라고 합니다. 두 소자 모두 한 비트를 기억하지만, 입력을 받아들이는 시간의 조건이 다릅니다. 같은 신호를 넣었을 때 두 소자의 출력이 어떻게 다른지 시간 순서대로 비교해 보겠습니다.

def jk_next(q, j, k):
    return (j & (1 - q)) | ((1 - k) & q)


samples = [(0, 1), (1, 1), (1, 0), (0, 0), (1, 0), (1, 1), (0, 1)]
latch_q = ff_q = prev_clk = 0
print("CLK D 래치 플립플롭")
for clk, d in samples:
    if clk:
        latch_q = d
    if prev_clk == 0 and clk == 1:
        ff_q = d
    prev_clk = clk
    print(f"{clk:>3} {d} {latch_q:>4} {ff_q:>8}")

q, states = 0, []
for j, k in ((1, 0), (1, 1), (0, 0), (0, 1)):
    q = jk_next(q, j, k)
    states.append(q)
print(states)
CLK D 래치 플립플롭
  0 1    0        0
  1 1    1        1
  1 0    0        1
  0 0    0        1
  1 0    0        0
  1 1    1        0
  0 1    1        0
[1, 0, 0, 0]

samples는 시간 순서대로 측정한 클록과 D의 값이고, 클록을 래치의 허용 신호로도 씁니다. 래치는 클록이 1인 동안 D를 그대로 따라가므로 셋째 줄에서 D가 0이 되자 곧바로 0이 되고, 여섯째 줄에서 D가 1이 되자 곧바로 1이 됩니다. 플립플롭은 클록이 0에서 1로 바뀐 둘째 줄과 다섯째 줄에서만 그 순간의 D를 받아들이고, 나머지 줄에서는 값을 유지합니다. 마지막 줄은 뒤에서 설명할 JK 플립플롭의 계산입니다.

SR 래치와 입력의 극성

SR 래치(SR latch)는 1로 만드는 set 입력 S와 0으로 만드는 reset 입력 R을 가진 가장 기본적인 기억 회로입니다. NOR 게이트 두 개를 서로의 출력이 다른 쪽 입력으로 돌아가게 엮어 만들며, 입력이 1일 때 그 기능이 동작합니다. 이때 S와 R의 조합에 따른 동작은 다음과 같습니다.

SR다음 Q동작
00이전 Q유지
010reset
101set
11쓰지 않음금지된 조합

S와 R을 동시에 1로 넣으면 Q와 그 반대 출력이 둘 다 0이 되어, 두 출력이 언제나 서로 반대라는 관계가 깨집니다. 게다가 두 입력을 동시에 0으로 되돌리면 어느 쪽으로 안정될지 정해지지 않으므로, 이 조합은 쓰지 않습니다. NAND 게이트로 만든 SR 래치는 입력이 0일 때 기능이 동작하므로, 같은 표가 반대로 됩니다. 두 입력이 모두 1이면 유지, 모두 0이면 금지된 조합입니다. 그래서 SR 래치를 쓸 때는 어떤 게이트로 만들었는지와 입력이 1에서 동작하는지 0에서 동작하는지를 먼저 확인해야 합니다.

JK, T, D 플립플롭의 다음 상태

플립플롭은 에지에서 받아들이는 입력의 뜻에 따라 몇 가지로 나뉩니다. 아래에서 QQ는 에지 직전의 값, Q+Q^+는 그 에지 직후의 값이고, 세 소자 모두 상승 에지에서 바뀐다고 하겠습니다. 실제 부품이 어느 에지에서 동작하는지는 데이터시트로 확인해야 합니다.

JKJK의 Q+Q^+동작
00QQ유지
010reset
101set
11Q‾\overline{Q}반전(toggle)

JK 플립플롭(JK flip-flop)은 SR 래치의 금지된 조합 11에 "반전"이라는 뜻을 준 것입니다. 이 반전은 에지마다 한 번씩만 일어나며, 11을 넣어 두는 동안 계속 흔들리는 것이 아닙니다. 코드의 마지막 부분은 처음 Q = 0에서 네 에지의 입력이 10, 11, 00, 01일 때의 상태를 계산한 것이고, 차례로 set, 반전, 유지, reset이 적용되어 1, 0, 0, 0이 됩니다. 다음 상태를 하나의 식으로 쓰면 Q+=JQ‾+K‾QQ^+=J\overline{Q}+\overline{K}Q이며, 이것을 JK 플립플롭의 특성 방정식(characteristic equation)이라고 합니다.

T 플립플롭(T flip-flop)은 T = 0이면 유지하고 T = 1이면 반전하므로 Q+=T⊕QQ^+=T\oplus Q입니다. JK 플립플롭의 J와 K를 하나로 묶어 T에 이으면 00과 11만 쓰게 되어 T 플립플롭이 됩니다. D 플립플롭은 Q+=DQ^+=D라서 가장 단순하고, 다른 플립플롭의 동작도 D 플립플롭으로 만들 수 있습니다. 원하는 다음 상태를 조합 회로로 계산해 D에 넣으면 되는데, T 플립플롭이라면 D=T⊕QD=T\oplus Q를, JK 플립플롭이라면 D=JQ‾+K‾QD=J\overline{Q}+\overline{K}Q를 넣습니다. 조합 회로가 다음 값을 계산하고 플립플롭이 에지에서 그 값을 저장한다는 이 구조가 모든 동기 회로의 기본 모양입니다.

클록 주기를 정하는 지연

플립플롭이 값을 제대로 받아들이려면 에지 전후의 짧은 시간 동안 입력이 바뀌지 않아야 합니다. 에지 전에 입력이 안정되어 있어야 하는 시간을 설정 시간(setup time), 에지 뒤에도 입력이 유지되어야 하는 시간을 유지 시간(hold time)이라고 합니다. 이 조건을 어기면 출력이 0도 1도 아닌 상태에 한동안 머무는 준안정 상태(metastability)가 생길 수 있습니다. 버튼처럼 클록과 상관없이 바뀌는 외부 입력은 플립플롭을 두 단 거치게 하는 동기화 회로로 이 위험을 줄입니다.

레지스터에서 나온 값이 조합 회로를 지나 다음 레지스터에 도착하려면, 클록 주기 안에 세 가지 지연이 모두 끝나야 합니다. 앞 레지스터가 에지 뒤 출력을 내기까지의 지연, 조합 회로의 가장 긴 지연, 뒤 레지스터의 설정 시간입니다. 예를 들어 각각 1 ns, 6 ns, 1 ns라면 클록 주기는 적어도 8 ns여야 하고, 최대 클록 주파수는 1/(8 ns) = 125 MHz입니다. 유지 시간은 반대로 값이 너무 빨리 도착하면 생기는 문제라서, 클록 주기를 늘려도 해결되지 않고 경로의 최소 지연으로 따로 확인해야 합니다.

정리

  • 순차 논리 회로는 지금의 입력과 저장된 상태를 함께 쓰며, 래치와 플립플롭이 한 비트씩 상태를 기억합니다.
  • 래치는 허용 신호가 켜진 동안 입력을 그대로 따라가고, 에지 트리거 플립플롭은 클록의 에지에서만 입력을 받아들입니다.
  • NOR형 SR 래치는 11을, NAND형 SR 래치는 00을 금지된 조합으로 두며, 입력의 극성을 먼저 확인해야 합니다.
  • JK 플립플롭은 Q+=JQ‾+K‾QQ^+=J\overline{Q}+\overline{K}Q, T 플립플롭은 Q+=T⊕QQ^+=T\oplus Q, D 플립플롭은 Q+=DQ^+=D이고, 조합 회로로 다음 값을 계산해 D 플립플롭에 넣으면 다른 플립플롭의 동작을 만들 수 있습니다.
  • 클록 주기는 출력 지연, 조합 회로의 가장 긴 지연, 설정 시간의 합보다 길어야 하고, 유지 시간은 최소 지연으로 따로 확인합니다.

연습 문제

1. 저장하는 순간 찾기

상승 에지 D 플립플롭의 처음 Q는 0입니다. 첫 에지 직전 D = 1이고, 첫 에지 뒤에 D가 0으로 바뀝니다. 둘째 에지 직전에도 D = 0이고, 둘째와 셋째 에지 사이에 D가 1로 바뀌어 셋째 에지까지 유지됩니다. 각 에지 직후의 Q와, 첫 에지 뒤 D가 0으로 바뀐 순간의 Q를 구하세요.

해설 보기

에지 직후의 Q는 각 에지 직전의 D이므로 차례로 1, 0, 1입니다. 첫 에지 뒤 D만 0으로 바뀐 순간에는 에지가 없으므로 Q는 아직 1입니다. 같은 신호를 허용 신호가 켜진 D 래치에 넣었다면 그 순간 Q가 곧바로 0으로 바뀌었을 것입니다. 입력이 바뀐 순간과 값을 저장하는 순간을 시간 순서대로 따로 적으면 헷갈리지 않습니다.

2. 유지와 반전

상승 에지 JK 플립플롭의 처음 Q는 1이고, 네 에지 직전의 입력은 차례로 00, 10, 11, 01입니다. 각 에지 직후의 Q를 구하세요. 또 처음 Q = 1인 T 플립플롭에 세 에지의 T가 1, 0, 1일 때, 같은 상태를 D 플립플롭으로 만들려면 각 에지의 D에 무엇을 넣어야 하나요?

해설 보기

JK는 유지, set, 반전, reset이 차례로 적용되어 Q가 1, 1, 0, 0이 됩니다. 셋째 에지의 반전은 바로 앞의 값 1을 뒤집은 것입니다. T 플립플롭은 반전, 유지, 반전으로 Q가 0, 0, 1이 되고, D 플립플롭은 다음 값을 그대로 받아들이므로 D에도 0, 0, 1을 넣으면 됩니다. 이 값은 D=T⊕QD=T\oplus Q로 계산한 것과 같고, 둘째 에지의 T = 0은 0으로 만들라는 뜻이 아니라 직전 값 0을 유지하라는 뜻입니다.

3. 최대 클록 주파수

레지스터의 출력 지연이 0.5 ns, 두 레지스터 사이 조합 회로의 가장 긴 지연이 3 ns, 설정 시간이 0.5 ns입니다. 최대 클록 주파수는 얼마인가요? 조합 회로를 고쳐 가장 긴 지연을 2 ns로 줄이면 어떻게 되나요?

해설 보기

클록 주기는 적어도 0.5 + 3 + 0.5 = 4 ns여야 하므로 최대 주파수는 1/(4 ns) = 250 MHz입니다. 가장 긴 지연을 2 ns로 줄이면 주기가 3 ns로 줄어 약 333 MHz까지 올릴 수 있습니다. 여기서 중요한 것은 가장 짧은 경로가 아니라 가장 긴 경로가 주기를 정한다는 점입니다. 회로의 다른 경로들이 아무리 빨라도, 가장 느린 경로 하나가 전체 클록을 묶어 둡니다.

시간에 따라 바뀌는 회로를 추적할 때는 입력이 바뀐 사건과 클록 에지를 한 줄씩 시간 순서로 적어 보세요. 다음 글 레지스터·카운터·상태기계에서는 플립플롭 여러 개를 묶어 여러 비트의 값과 상태를 기억하는 회로를 다룹니다.