밀리머신
밀리머신은 출력이 현재 상태와 입력에 모두 관련되는 경우입니다.
현재 상태가 무엇이고, 그때의 특정 입력이 무엇이냐에 따라 출력이 화살표에 표시됩니다.
직렬 덧셈기 회로
직렬 덧셈기는 두개의 n비트 2진수 $X$, $Y$를 더하는 회로입니다.
병렬 덧셈기와의 차이점은 입력이 순차적으로 들어오고,
그에 따른 출력도 순차적으로 나간다는 점입니다.
상태는 덧셈의 결과로 생성되는 1비트의 캐리 값으로 잡으면,
필요한 FF의 개수는 1개임을 알 수 있습니다.
또한 덧셈을 할 수 있는 Full Adder와 함께 구성해보겠습니다.
우선 진리표 먼저 구성해보겠습니다.
상태를 다음과 같이 구성하고, 상태도를 그려보겠습니다.
$S_0 : C_{i+1} = 0$
$S_1 : C_{i+1} = 1$
이에 따른 다음 상태($C_{i+1}$)와 입력에 따른 덧셈 결과($S_i$)를 카노맵으로 그려보겠습니다.
다음 상태($C_{i+1}$) | ||
$XY$ | $C_i = 0$ | $C_i = 0$ |
00 | 0 | 0 |
01 | 0 | 1 |
11 | 1 | 1 |
10 | 0 | 1 |
덧셈 결과($S_i$) | ||
$XY$ | $C_i = 0$ | $C_i = 0$ |
00 | 0 | 1 |
01 | 1 | 0 |
11 | 0 | 1 |
10 | 1 | 0 |
이에 따라 얻은 논리식은 다음과 같습니다.
$C_{i+1} = YC_i + XC_i + XY = (X+Y)C_i + XY$
$S_i = X'Y'C_i + XYC_i + X'YC_i' + XY'C_i = (X \oplus Y)'C_i + (X \oplus Y)C_i' = X \oplus Y \oplus C_i$
이는 Full Adder와 같고, FF의 출력은 $C_i$를 FF에 들어가는 입력을 $C_i$로 해야합니다.
이에 적당한 FF은 D-FF입니다.
따라서 구성된 직렬 덧셈기 회로는 다음과 같습니다.
$X = 10011_2$, $Y=00110_2$ 일때의 타이밍도를 보면 다음과 같습니다.
밀리타입 회로의 출력 오류 현상
밀리머신은 무어머신과 다르게 클럭입력의 에지에서만 출력이 변하는 것이 아니라
입력또한 출력에 관여하기 때문에 오류가 있을 가능성이 있습니다.
예시를 보여드리겠습니다.
위와 같이 출력($Z$)에 상태($A, B$)와 입력($X$)이 모두 관여하는 밀리 회로가 있습니다.
사용한 FF은 JK-FF이기 때문에 특성식 $Q^{+} = JQ' + K'Q$ 를 사용하여 $A^{+}$ 와 $B^{+}$를 구해보겠습니다.
$A^{+} = XBA' + X'A$
$B^{+} = XB' + (AX)'B$
이제 현재상태($AB$)와 다음 상태($A^{+}B^{+}$) 그리고 현재 출력($Z$)에 대한 상태 테이블을 구성할 수 있습니다.
$AB$ | $A^{+}B^{+}$ | $Z$ | ||
$X=0$ | $X=1$ | $X=0$ | $X=1$ | |
00 | 00 | 01 | 0 | 1 |
01 | 01 | 11 | 1 | 0 |
11 | 11 | 00 | 0 | 1 |
10 | 10 | 01 | 0 | 1 |
FF이 2개이므로 상태는 총 $2^2 = 4$개 입니다. 따라서 상태를 다음과 같이 정의하겠습니다.
$S_0 = 00$
$S_1 = 01$
$S_2 = 11$
$S_3 = 10$
이에 따라 상태 테이블을 재구성하면 다음과 같습니다.
현재상태 | 다음상태 | 현재출력 | ||
$X=0$ | $X=1$ | $X=0$ | $X=1$ | |
$S_0$ | $S_0$ | $S_1$ | 0 | 1 |
$S_1$ | $S_1$ | $S_2$ | 1 | 0 |
$S_2$ | $S_2$ | $S_0$ | 0 | 1 |
$S_3$ | $S_3$ | $S_1$ | 0 | 1 |
위의 상태 테이블에 맞춰 작성한 상태도는 다음과 같습니다.(화살표의 라벨은 입력/출력, $\frac{X}{Z}$ 입니다.)
이제 타이밍도를 보면서 어떤 문제가 있는지 확인해보겠습니다.
빨간 동그라미가 쳐진 곳을 보면, 클럭입력의 하강에지가 아닌 부분에서
출력 $Z$의 변화가 있음을 알 수 있습니다.
하나하나 분석해보겠습니다.
1. 첫번째 클럭입력 전
클럭입력이 들어오기전 $S_0 : (A=0, B=0)$인 상태에서 입력으로 $X=1$ 이 들어오고 있습니다.
따라서 출력 $Z=1$이지만, 아직 클럭입력이 없어 $A, B$의 상태는 바뀌지 않고 있습니다.
2. 첫번째 클럭입력의 하강에지
예정대로 $(S_0, X=1) \rightarrow S_1$ 으로 상태변화 후,
$(S_1, X=1) \rightarrow Z=0$으로 출력도 변경되었습니다.
3. 첫번째 클럭입력 후, $X$입력 변화
첫번째 클럭입력 이후 $X$의 값이 0으로 바뀌면서, 출력 Z는 1로 바뀌게 됩니다.
$(S_1, X=0) \rightarrow Z=1$ 이기 때문입니다.
이때는 상태변화가 이루어지지 않기 때문에 $Z$값만 변화되어,
타이밍도에서 갑자기 출력이 0으로 바뀌었다가 다시 1로 바뀌는 현상이 생기게 됩니다.
이런 현상을 Glitch 라고 합니다.
4. 세번째 클럭입력의 하강에지
예정대로 $(S_1, X=1) \rightarrow S_2$ 으로 상태변화 후,
$(S_1, X=1) \rightarrow Z=1$ 로 출력도 변경되었습니다.
5. 세번째 클럭입력 후, $X$입력 변화
세번째 클럭입력 이후 $X$의 값이 0으로 바뀌면서, 출력 Z는 0로 바뀌게 됩니다.
$(S_2, X=0) \rightarrow Z=0$ 이기 때문입니다.
이때도 마찬가지로 상태변화가 이루어지지 않기 때문에 $Z$값만 변화되어,
타이밍도에서 갑자기 출력이 1로 바뀌었다가 다시 0으로 바뀌는 현상이 생기게 됩니다.
이런 현상을 Spike 라고 합니다.
'CS > 논리회로' 카테고리의 다른 글
[논리회로] 무어머신과 순차 패리티 체커 회로 (0) | 2022.06.11 |
---|---|
[논리회로] 카운터 (0) | 2022.06.11 |
[논리회로] 레지스터 (0) | 2022.06.10 |
[논리회로] 플립플롭 (0) | 2022.06.10 |
[논리회로] 래치와 투과성 문제 (0) | 2022.06.10 |