### 앞부분 skip
Clock skew
이상적으로는 clock은 각 컴포넌트들에게 동일한 시점에 도착해야하지만, 실제로는 CLK 상의 게이트나 물리적인 문제로 동시에 CLK 신호가 인식되지 않을 때 clock skew가 발생한다고 부른다.
아래의 사진이 그 예시이다. 원래의 $CLK$가 하나의 f/f에는 잘 들어갔지만, 다른 f/f에는 $t_{sk}$만큼의 시간차와 함께 클락이 들어간 모습이다.
이 회로가 잘 작동하기 위해서는 $t_{sk}+t_{hold} < t_{ffpd}(\text{min})+ t_{comb}(\text{min}) $를 만족해야 한다.
의미를 해석하자면 $t_{sk}+t_{hold}$는 $D$가 안정적으로 수집되는데 필요한 시간이고 $ t_{ffpd}(\text{min})+ t_{comb}(\text{min}) $는 새롭게 출발한 $Q$ 값이 combinational circuit을 통해 $D$에 들어가버리는데 걸리는 시간이다. 당연하게도, $D$가 수집되기 전에 새로운 값이 들어오면 안되기 때문에 저 부등식이 생긴 것이다.
여기서 $t_h$ 만 사용된 것도 당연한 것인데, $t_{su}$은 clock skew와 상관없이 만족될 것이기에 생각할 필요가 없다.
주로 $ t_{sk} < t_{ffpd}(\text{min})+ t_{comb}(\text{min}) - t_{hold} $ 로 $t_{sk}$를 계산한다.
연습: 스톱워치
문제 조건
입력
- $\text{CLK} = 16 \text{Hz}$
- $\text{RESET}$: Ansync reset signal
- $\text{X}$: Push button
- Initially, start timer
- Second, store the first value
- Third, store the second value
- $\text{SEL}$: Select output
출력
- 2 7seg display
구조 설계
일단 문제가 복잡하니 구조를 잘 설계해야 한다. 무작정 상태로만 생각하면, 99개의 상태를 만들어야 하니 천천히 Data part, Control part를 구성하며 진행하자.
Data Part
2개의 7seg를 이용해서 수를 표현할 것이기 때문에 2개의 4bit 카운터(LS163)가 필요할 것이다. 그런데 1초에 하나씩 증가시키고 싶으니 $ 16 \text{Hz}$를 1초로 낮추는 또다른 카운터가 필요할 것 같다. 한편, 카운터의 값을 저장하려면 2 쌍의 register가 필요할 것이고 첫번째 시간과 두번째 시간을 각각 기록할 것이므로 총 4개의 4bit register가 필요하다.
Control Part
컨트롤로는 Data part의 컴포넌트들에 적절한 신호만 주면 될 듯하다.
위에 내용을 각 컴포넌트들을 나열해본 것이다. 여기에 적당한 신호들을 연결하여 회로를 완성하여야한다.
Data Part의 완성은 verilog로 대체한다.
(16번 세면 다음 카운터로, 10번 세면 또 그 다음 카운커로 넘기는 것만 구현하면 된다.)
##추가
Control Part는 State Diagram으로 시작한다.
위처럼 State Diagram을 그릴 수 있다.
Note: Moore type과 mealy type output을 동시에 사용했다.
이제 9 step approach를 적용한다.
State minimization? 이미 충분한 것 같다.
State assignment? 아래처럼 하자. table도 같이 그렸다
state | Q1 | Q0 | EnCnt | S1 | S0 | A1 | Q0 |
Stand By | $0$ | $0$ | $0$ | $0$ | $0$ | $0$ | $X$ |
Waiting 1 | $0$ | $1$ | $1$ | $X$ | $X$ | $X$ | $1$ |
Waiting 2 | $1$ | $1$ | $1$ | $X$ | $X$ | $ \overline {X}$ | $ \overline {X}$ |
- | $1$ | $0$ | - | - | - | - | - |
이제 Kmap을 그리고 각각 최소화하면 된다. 근데 이 과정에서 꽤나 흥미로운 팁?이 있어서 같이 소개한다.
아래와 같은 K map에서 $D_0 = \overline{Q1} Q_0 + $ 여기까지 적으면 $1$항은 무조건 수집되므로 해당 항을 don't care 취급해서 $ \overline {Q_0Q_1}X$이 아니라 $ \overline {Q_1}X$처럼 추가할 수 있다. 정리하면 $D_0 = \overline{Q1} Q_0 + \overline {Q_1}X + Q_1 \overline {X } 가 되겠다.
Q1 \ Q0 | 0 | 1 |
0 | $X$ | $1$ |
1 | - | $ \overline {X}$ |
이렇게 Control Part가 완성되면 Data Part와 연결해서 마무리하면 된다.
연습: 4bit - sequential adder
Binary serial adder은 위와 같이 주어진다.
### 중간 생략
Synchronizing signals
예를 들어 START라는 input이 asynchronous 하다고 가정해보자. 회로의 구조에 따라 다르겠지만, 회로가 오동작할 가능성도 생기고, 별로 좋지는 않다. 특히 이로 인해서 f/f의 값 저장에 문제가 생긴다거나 output이 달라지는 경우, 회로를 수정할 필요가 있다. 그래서 input을 강제로 synchronous하게 만드는 방법이 있는데 아래 그림처럼 input을 먼저 손보는 것이다.
그런데 만약 synchronizer에 setuptime을 맞추지 못하고 START가 들어오면 synchronizer 가 metastable state로 가버리면 문제 발생! → synchronizer을 위한 synchronizer를 붙이자. 충분히 많이 붙이면 확률적으로 stable함이 보장된다.
Output Glitch
State transition이 00에서 11로 바뀐다고 해보자.
그럼 이러한 문제를 상상할 수 있다. Q1 Q0에 변하는 신호가 만약 async input으로 들어간다면 glitch가 잡혀 잘못된 결과를 낼 것이다. → Stabilizer Register을 출력값에 넣자. Synchronizing signals이랑 비슷한 느낌.
모든 LBB(Latch-Based Block)와 f/f은 동일한 CLK로 만들자.
- 사용되는 LBB와 플립플롭은 제조사로부터 보장된 critical race-free 한 것들임.
- LBB와 플립플롭을 연결하는 조합 논리 회로에서 발생하는 글리치는 안정된 상태에서만 샘플링된다는 특징 때문에 시스템 동작에 영향을 주지 않음.
시스템의 신뢰성을 보장하기 해야할 것들:
- clock skew를 최소화하고 그 크기를 정확히 파악할 것
- 플립플롭의 setup time과 hold time에 여유 마진이 있도록 보장할 것
- 비동기 입력을 식별하고 이를 클럭에 맞춰 동기화할 것
- 출력 글리치가 문제를 일으키지 않도록 출력 안정화 회로를 사용해 필터링할 것
'컴퓨터 > 논리설계' 카테고리의 다른 글
[논리설계] 10강 - CPLD와 FPGA (0) | 2025.06.08 |
---|---|
6강-순차회로 (0) | 2025.05.29 |
1강 - 논리설계의 배경지식과 회로 (0) | 2025.05.29 |