디지털 논리 -순차회로 설계-

1. 문제 개요

- 교재 연습문제 5.19 3개의 플립플롭 A, B, C, 한 개의 입력 x와 한 개의 출력 y를 가진 순차회로를 설계한다. 이 회로의 상태도는 교재에 있으며 무정의 조건, 즉 사용되지 않는 상태를 이용해 설계한다. 사용되지 않는 상태가 미치는 영향을 알아보기 위한 설계를 통해 얻어진 이 회로를 분석한다. 단, 사용하는 플립플롭은 JK FF를 사용한다.

- Verilog 를 이용하여 교재 HDL 예제 6.4 Ripple Counter를 직접 코딩해보고 그 결과를 살펴본다.


2. 문제 분석(알고리즘 및 해결방안)

  연습문제의 내용은 JK Flip-Flop을 이용하여 조건에 맞는 회로를 설계하는 내용이

     다. 회로의 설계는 (1) 주어진 조건(기술된 내용 등)으로부터 상태도를 유도하고,

     (2) 상태 축소, (3) 상태 할당, (4) 상태표를 작성하고, (5) Flip-Flop을 선택 후,

     (6) Flip-Flop 의 입출력식을 유도, (7) 논리도를 작성하는 단계로 진행된다. 이

     문제의 경우 JK Flip-Flop으로 정해졌으며 D Flip-Flop 에 비해 입출력식 유도 과

     정이 하나 추가된다는 점 이외엔 큰 문제는 없다.

  예제의 내용 그대로 코딩 하되, 본문의 코딩 내용에 컴파일 오류가 발생한다. 이를

     수정하고 내용을 확인한다.


3. 결과(소스 및 스크린샷)

<<1번 과제, 연습문제 5.19>>

  상태도가 교재에 있고, 상태 축소와 상태 할당은 대상이 없으므로 생략한다.

  상태표

현재 상태

입력

차기 상태

출력

JK Flip-Flop

A

B

C

X

A+

B+

C+

Y

Ja

Ka

Jb

Kb

Jc

Kc

0

0

0

0

0

1

1

0

0

x

1

x

1

x

0

0

0

1

1

0

0

1

1

x

0

x

0

x

0

0

1

0

0

0

1

0

0

x

0

x

x

0

0

0

1

1

1

0

0

1

1

x

0

x

x

1

0

1

0

0

0

1

0

0

0

x

x

0

0

x

0

1

0

1

0

0

0

1

0

x

x

1

0

x

0

1

1

0

0

0

1

0

0

x

x

1

x

0

0

1

1

1

0

1

0

1

0

x

x

0

x

1

1

0

0

0

0

1

0

0

x

1

1

x

0

x

1

0

0

1

0

1

1

0

x

1

1

x

1

x

1

0

1

0

 

 

 

 

 

 

 

 

 

 

1

0

1

1

 

 

 

 

 

 

 

 

 

 

1

1

0

0

 

 

 

 

 

 

 

 

 

 

1

1

0

1

 

 

 

 

 

 

 

 

 

 

1

1

1

0

 

 

 

 

 

 

 

 

 

 

1

1

1

1

 

 

 

 

 

 

 

 

 

 


③ FF 식, 출력식 유도

AB/CX

Ja = B'X

0

1

1

0

0

0

0

0

x

x

x

x

x

x

x

x

           

Ka = 1

x

x

x

x

x

x

x

x

x

x

x

x

1

1

x

x


Jb = A + C'X'

1

0

0

0

x

x

x

x

x

x

x

x

1

1

x

x

           

Kb = C'X + CX'

x

x

x

x

0

1

0

1

x

x

x

x

x

x

x

x


Jc = AX + A'B'X'

1

0

x

x

0

0

x

x

x

x

x

x

0

1

x

x

           

Kc = X

x

x

1

0

x

x

1

0

x

x

x

x

x

x

x

x


A+ = A'B'X

0

1

1

0

0

0

0

0

x

x

x

x

0

0

x

x

           

B+ = A + C'X' + BCX

1

0

0

0

1

0

1

0

x

x

x

x

1

1

x

x


C+ = AX + CX' + A'B'X'

1

0

0

1

0

0

0

1

x

x

x

x

0

1

x

x

           

Y = A'X

0

1

1

0

0

1

1

0

x

x

x

x

0

0

x

x

  이 회로는 Ka = 1 로, A+ = 0 의 결과를 항상 갖게 되는 보정의 효과를 갖는다.


<<2번 과제, Verilog Ripple Counter>>

  책의 내용대로 코딩 후(테스트 벤치부는 삭제) 컴파일을 실행하면 에러가 발생한다.

  이는 코딩 부의 쉼표가 아닌 or 로 바꾸어 주면 해결된다.
 always @ (negedge CLK, posedge Reset) -> 
 always @ (negedge CLK or posedge Reset)

  또한 설정 하나를 바꾸어주어야 하는데 클럭폭의 영향으로 Grid 설정을 10.0ns로 변경해야 한다.

  웨이브폼 생성 후 시뮬레이터를 실행시킨다. (클럭값을 count 에 별도로 지정해주어야 한다.)

  좀 더 상세히 분석해보자.

     count 는 20ns 의 주기로 반복되는 클럭으로, 주기의 반복에 따라 A0 가 그 펄스

     에 반응함을 볼 수 있다. 이 구조는 리플 카운터의 각 플립플롭의 출력이 다음 상

     위 FF의 Clk에 연결되어 보수화 FF 로 인해 반응하는 구조와 동일하다. 순서는

     0000 -> 0001 -> 0010 -> 0011 -> ..... -> 1110 -> 1111 -> 0000 -> ....

     순이다. (부-에지)

     이하 내용은 코딩이다.

`timescale 1ns / 100 ps

module Ripple_Counter_4bit (A3,A2,A1,A0, Count, Reset);

output A3,A2,A1,A0;

input Count,Reset;

//Instantiate complementing flip-flop

Comp_D_flip_flop F0 (A0, Count, Reset);

Comp_D_flip_flop F1 (A1, A0, Reset);

Comp_D_flip_flop F2 (A2, A1, Reset);

Comp_D_flip_flop F3 (A3, A2, Reset);

endmodule

//Complementing flip-flop with delay

//Input to D flip-flop = Q'

module Comp_D_flip_flop (Q, CLK, Reset);

output Q;

input CLK, Reset;

reg Q;

always @(negedge CLK or posedge Reset)

if (Reset) Q <= 1'b0; else Q <= #2 ~Q;

endmodule