배우기 › 주제 12
타이밍도, 글리치, 정적 해저드
읽는 시간 8분 · bitGateLab 팀
종이 위에서 게이트는 즉시 응답하지만, 현실에서는 게이트마다 몇 나노초가 걸립니다. 이 차이는 진리표에서는 거의 문제가 되지 않지만 타이밍도에서는 문제가 됩니다. 지연이 서로 다른 두 경로가 글리치라고 부르는 거짓 펄스를 만들어, 엉뚱한 때에 카운터를 진행시키거나 래치를 트리거할 수 있습니다. 여기서는 타이밍도를 읽고, 지연을 계산하고, 카르노 맵으로 정적 해저드를 찾아 제거하는 방법을 배웁니다.
타이밍도 읽는 법
타이밍도는 각 신호를 공통의 가로 시간축 위에서 올라가거나(1) 내려가는(0) 선으로 그립니다. 임의의 순간에 가상의 세로선을 그으면 모든 신호의 값을 알 수 있습니다. 입력의 에지가 원인이고, 입력 에지와 그로 인해 출력에 생기는 변화 사이의 거리가 지연입니다. 클럭이 있는 회로에서는 각 활성 에지 직전의 값을 읽습니다. 플립플롭이 샘플링하는 때가 바로 그때이기 때문입니다.
전파 지연과 임계 경로
전파 지연은 입력의 변화와 그에 따른 출력의 변화 사이의 시간으로, 각 전이의 50 % 지점 사이에서 측정합니다. 두 가지 값을 구별합니다.
- tPLH: 출력이 Low에서 High로 바뀔 때의 지연.
- tPHL: 출력이 High에서 Low로 바뀔 때의 지연.
5 V로 동작하는 74HC 계열에서 간단한 게이트의 지연은 10 ns 정도이며, 용량성 부하가 커지거나 전원 전압이 낮아지면 늘어납니다.
회로의 지연은 어느 입력에서든 출력까지 가는 가장 느린 경로, 곧 임계 경로의 지연입니다. 각 경로에 있는 게이트의 지연을 더한 뒤 가장 큰 값을 취해 구합니다.
예제: F = A·B + A·C이고 tNOT = 5 ns, tAND = 10 ns, tOR = 10 ns입니다.
- B 또는 C의 경로: AND + OR = 20 ns.
- 위쪽 AND를 지나는 A의 경로: AND + OR = 20 ns.
- 인버터를 지나는 A의 경로: NOT + AND + OR = 25 ns.
임계 경로는 A에서 인버터를 지나는 경로로, 25 ns입니다. 어떤 입력 변화도 F가 안정되기까지 이보다 오래 걸리지 않습니다.
글리치와 정적 해저드
정적 1 해저드는 입력이 바뀌는 동안 출력이 1을 유지해야 하는데 잠깐 0으로 떨어질 수 있는 경우입니다. 정적 0 해저드는 그 반대로, 출력이 0을 유지해야 하는데 잠깐 1로 튀는 경우입니다. 둘 다 어떤 변수와 그 보수가 지연이 서로 다른 경로로 출력에 도달할 때 나타납니다.
앞 예제의 회로에서 B = C = 1이라고 합시다. 논리적으로는 항상 F = A + A = 1입니다. 그러나 A가 1에서 0으로 내려갈 때, A·B 항은 A·C 항이 켜지기 전에 먼저 꺼집니다. A가 먼저 인버터를 거쳐야 하기 때문입니다.
글리치의 진행 과정(B = C = 1, A가 t = 0에서 내려감):
- t = 5 ns: 인버터가 A를 올립니다.
- t = 10 ns: A·B의 AND가 출력을 내립니다(t = 0에서 일어난 A의 변화에 응답).
- t = 15 ns: A·C의 AND가 출력을 올립니다(t = 5에서 일어난 A의 변화에 응답).
- 10 ns와 15 ns 사이에는 OR의 두 입력이 모두 0입니다. OR는 10 ns 뒤에 응답하므로 F는 t = 20부터 t = 25 ns까지 0입니다.
글리치의 폭은 두 경로의 지연 차이, 곧 인버터의 지연인 5 ns입니다. A가 올라갈 때는 A·B가 t = 10에 켜지고 A·C가 t = 15에 꺼집니다. 그 사이에 둘 다 1이므로 글리치가 없습니다.
이 밖에 동적 해저드도 있습니다. 출력이 한 번만 바뀌어야 하는데 세 번 이상 바뀌는 경우입니다(예: 1 → 0 → 1 → 0). 같은 변수에 대해 지연이 서로 다른 경로가 셋 이상 있는 다단 논리에서 나타납니다.
카르노 맵으로 해저드 찾고 제거하기
곱의 합의 카르노 맵에서 정적 1 해저드는 1이 들어 있는 두 칸이 인접해 있으면서 서로 다른 묶음에 덮여 있고, 둘을 함께 덮는 묶음이 없을 때 나타납니다. 한 칸에서 다른 칸으로 넘어간다는 것은 변수 하나만 바뀐다는 뜻이며, 그 변화 동안 회로는 한 항에서 다른 항으로 "건너뜁니다".
해결책은 합의항, 즉 두 칸을 함께 덮는 추가 묶음을 더하는 것입니다. 논리적으로는 중복이지만(진리표가 바뀌지 않음) 전이 동안 출력을 1로 유지해 줍니다.
예제: F = A·B + A·C.
- A·B는 ABC = 110과 111 칸을 덮습니다. A·C는 001과 011을 덮습니다.
- 011과 111 칸은 인접해 있고(A만 바뀜) 서로 다른 묶음에 있습니다. 이것이 앞에서 본 B = C = 1일 때의 해저드입니다.
- 두 칸을 함께 덮는 묶음은 B·C로, A·B와 A·C의 합의항입니다. 한 항에는 그대로, 다른 항에는 부정되어 나타나는 변수를 빼고 남은 것을 곱해 구합니다.
- 해저드 없는 회로: F = A·B + A·C + B·C. B = C = 1이면 B·C 항이 내내 1이므로 OR는 더 이상 내려갈 수 없습니다.
합의 곱에서는 쌍대적으로 생각하면 됩니다. 서로 다른 묶음에 있는 인접한 0을 찾고, 합 형태의 합의항을 추가해 정적 0 해저드를 제거합니다. 예를 들어 F = (A + B)·(A + C)는 B = C = 0일 때 해저드가 있으며, 인수 (B + C)를 추가해 바로잡습니다.
흔한 실수
- 진리표가 올바른 회로는 오동작할 수 없다고 생각하는 것: 진리표는 전이 중의 동작에 대해 아무것도 알려 주지 않습니다.
- 클럭이나 리셋을 구동하는 회로에서 간소화하면서 합의항을 "불필요하다"는 이유로 빼는 것.
- 가장 느린 경로의 지연만 더하지 않고 회로에 있는 모든 게이트의 지연을 더하는 것.
- 두 입력이 동시에 바뀔 때도 합의항이 글리치를 없애 준다고 믿는 것: 변수 하나의 변화만 막아 줍니다.
시뮬레이터에서 해 보기
타이밍도에서 펄스가 생기는 모습과, 합의항을 추가하면 그것이 사라지는 모습을 볼 수 있습니다.
- 인버터 하나, AND 두 개, OR 하나를 놓고 F = A·B + A·C를 만듭니다.
- B = 1, C = 1로 고정하고, A를 직접 바꿀 수 있는 입력이나 느린 클럭 신호에 연결합니다.
- 타이밍도를 열고 A를 1에서 0으로 여러 번 바꿉니다. 전이 순간의 F를 관찰하고 짧은 펄스나 글리치 알림이 나타나는지 봅니다.
- B·C를 만드는 세 번째 AND를 추가해 OR에 연결합니다.
- A를 다시 바꿔 보고 F가 1로 유지되는 것을 관찰합니다.
연습문제
- F = A·C + B·C의 정적 해저드를 찾고 해저드 없는 식을 쓰세요.
정답
A·C는 100과 110을, B·C는 011과 111을 덮습니다. 110과 111 칸은 인접해 있고(C가 바뀜) 서로 다른 묶음에 있으며, 이때 A = B = 1입니다. 합의항: A·B. F = A·C + B·C + A·B.
- 연습문제 1의 회로에서 tNOT = 4 ns, tAND = 8 ns, tOR = 8 ns이고 A = B = 1일 때, C의 어느 전이에서 글리치가 나타나며 언제 나타나고 얼마나 지속됩니까?
정답
C가 t = 0에서 내려갈 때입니다. B·C는 t = 8에 내려가고, C는 t = 4에 올라가며, A·C는 t = 12에 올라갑니다. 8 ns와 12 ns 사이에 OR의 두 입력이 모두 0이므로 F는 t = 16부터 t = 20 ns까지 0입니다: 4 ns. C가 올라갈 때는 글리치가 없습니다.
- F = A·C + B·C의 임계 경로는 무엇입니까? 연습문제 2의 지연을 사용하세요.
정답
C에서 인버터를 지나는 경로: 4 + 8 + 8 = 20 ns.
- F = (A + B)·(A + C)에서 B = C = 0일 때 출력은 어떤 값이어야 하며, 어떤 글리치가 나타날 수 있습니까?
정답
B = C = 0이면 F = A·A = 0입니다. A가 바뀔 때 잠깐 1로 튀는 펄스가 나타날 수 있습니다(정적 0 해저드). 인수 (B + C)를 추가하면 제거됩니다.