본문 바로가기

RTL Design/Verilog RTL 설계

Verilog RTL 설계(7월 12일 - 2, 동기식 카운터 - 1)

1. 비동기식 카운터

  • 비동기식 카운터는 첫 번째 플립플롭만 클럭 펄스 (Clock Pulse)와 동기화되어 있는 카운터를 의미한다.
  • 비동기식 카운터 중 하나인 리플 카운터 (Ripple Counter)을 이용하여 비동기식 업, 다운 카운터를 설계했다.
    https://jbhdeve.tistory.com/201
 

Verilog RTL 설계(6월 25일 - 3, Counter)

1. Counter들어오는 펄스 신호를 세는 장치이전까지 카운트 했던 값에다가 +1을 하며, 카운트해야 하기 때문에 기억 소자가 필요하다.따라서 이전까지 카운트 했던 값을 임시 저장하기 위해 기억

jbhdeve.tistory.com

 

  • 하지만, 비동기식 카운터는 첫 번째 플립플롭만 클럭 펄스와 동기화 되어 있기 때문에 클럭 변화에 대해서 카운트 값이 변화하지만, 출력값은 첫 번째 플립플롭부터 순차적으로 변화하게 된다.

 

 

 

 

2. 비동기식 카운터 (리플 카운터)의 한계

  • 비동기식 카운터는 첫 번째 플립플롭만 클럭 펄스와 동기화 되어 있기 때문에 클럭 변화에 대해서 카운트 값의 변화는 첫 번째 플립플롭부터 순차적으로 변화한다.
  • 이로 인해  카운터의 각 단계(각 플립플롭)마다 지연(Delay)이 누적된다.

 

 

2.1) 왜 비동기식 카운터 (리플 카운터)는 고속 카운터에 부적합한가?

  • 순차적 지연
    - 플립플롭을 순차적으로 거치면서 출력 값이 변화한다.
    - 이로 인해 각 단계에서 지연 시간이 누적 되어 PDT를 발생시킨다.
  • 리플 효과 (★★★★★★)
    - 예를 들어 카운트 값이 0001 → 0010 값으로 업 카운트 될 때, 카운트 값이 바로 변화하는 것 같지만, 
      실제는 바로 변화하지 않는다.
    - 굉장히 짧은 시간이지만, 0001 → 0000 → 0010 으로 변화하게 된다.
    -여기서 0000은 "카운터의 출력이 불안정한 상태를 거친다"는 것을 의미한다.
      즉, 순간적으로 카운터는 잘못된 출력 값을 발생시키게 되고, 이로 인해 고속 시스템에서 문제를 
      발생할 가능성이 있다. (글리치, Glitch 발생)
    - 카운터의 비트 수가 많아질수록 이런 중간 상태들이 더 많이 발생한다.
  • 카운터 속도 제한
    - PDT로 인해 카운터의 최대 동작 속도가 제한된다.

 

 

 

 

 

 

3. 동기식 카운터

  • 동기식 카운터는 카운터를 구성하는 모든 플립플롭들이 동일한 클럭 펄스와 동기화된 상태인 카운터를 의미한다.
  • 따라서 동기식 카운터는 다음과 같은 구조를 갖는다.

T Flip Flop으로 설계한 MOD-16 동기식 업 카운터

  • 위 그림에서도 알 수 있듯이 모든 T Flip Flop들은 동일한 클럭 펄스인 CP와 동기화 되어 있음을 확인할 수 있다.
  • 동기식 카운터는 모든 T Flip Flop들이 동일한 CP와 동기화 되어 있기 때문에 클럭 펄스의 변화에 대해서 모든 플립플롭들이 반응하여 동작할 수 있다. 
  • 또한 순차적으로 동작하지 않고, 병렬적으로 동작하기 때문에 누적된 PDT가 발생하지 않으며, 이로 인해 Ripple 효과가 발생하지 않아 순간적으로 잘못된 출력값이 출력되는 글리치가 발생할 가능성이 적어진다.
  • 이러한 이유로 고속 카운터는 비동기식 카운터보다는 동기식 카운터로 설계하는 것이 더 적합하다. 

 

 

 

 

4. 동기식 업 카운터 (T Flip Flop을 기반으로 동기식 업 카운터)

  • MOD 16 Up Counter의 Timing diagram은 다음과 같다.

Timing diagram of MOD 16 Up counter

 

  • 비동기식 MOD 16 Up Counter인 경우에는 이전 플립플롭의 출력 값을 현재의 플립플롭의 CP 값으로 받기 때문에 이전 플립플롭의 출력 값이 Negative edge일 때, 출력 값이 변화한다는 것을 확인하고, 이를 중점을 설계하였다.
  • 그러나, 동기식 MOD 16 Up Counter는 카운터를 구성하는 모든 플립플롭들이 동일한 클럭 펄스(CP)와 동기화 되어 있기 때문에 순차적으로 변화하는 것이 아닌 동시 출력 값이 반응함을 기억해야 한다.

 


★★★★★★

  • Q) 그럼, 어떻게 동기식 MOD 16 Up Counter를 설계해야 하는가?
  • A) 동기식 카운터이기 때문에 각각의 플립플롭의 출력 변화 클럭 시기 보다는 "각각의 플립플롭들의 출력 값이 관계"를 중점으로 보자.  위 Timing diagram을 보고, 각각의 플립플롭의 출력 값들이 언제 변화하는지를 각각의 플립플롭들의 출력값과 연관지어 생각해 볼 수 있다.
  • 현재 Flip Flop이 Toggle 되는 Timing은 현재 Flip Flop의 이전 모든 Flip Flop들이 1인 경우인 시점임을 확인할 수 있다. 아래 그림을 보면 이해하기 쉬울 것이다.

이전 모든 Flip Flop들이 1 일 때, 현재의 Flip Flop의 출력 값이 Toggle된다.

 

  • Case 1. QA
    - Negative edge 에서 출력 값, QA이 Toggle 된다.
  • Case 2. QB
    - 이전 Flip Flop의 출력 값인 QA가 1일 때, Toggle 된다.
  • Case 3. QC
    - 이전 Flip Flop의 출력 값인 QA, QB가 1일 때, Toggle 된다.
  • Case 4. QD
    - 이전 Flip Flop의 출력 값인 QA, QB, QC가 1일 때, Toggle 된다.

 

  • 따라서 이전 Flip Flop들의 출력 값이 모두 1인지 여부를 확인하기 위해서 AND Gate를 사용한다.
  • 즉, AND Gate의 출력 값이 1이면 모든 이전 Flip Flop들의 출력 값이 1이라는 것을 의미한다.

 

 

 

 

 

 

5. Vivado 를 통한 동기식 카운터 설계 (D Flip Flop을 기반으로 동기식 업 카운터)

  • 위에서 동기식 MOD-16 Up Counter의 구조에 대해서 설명할 때는 T Flip Flop으로 설계된 Counter를 기반으로 설명했지만, FPGA는 D Flip Flop와 LUT으로 구성되어 있기 때문에 Vivado를 통해 설계할 때는 D Flip Flop을 기반으로 비동기식 카운터를 설계하겠다.

 

  • Q) 어떻게 D Flip Flop 을 가지고 동기식 업 카운터를 만들 수 있는가?
  • A) 아래 그림을 가지고 설명을 이해하면 이해하기 쉽다.

D Flip Flop으로 구현한 동기식 MOD-16 Up Counter

 

  • D Flip Flop은 Positive edge 및 Negative edge에서 입력값, D를 그대로 출력, Q로 전달한다.
  • D Flip Flop의 출력 값, Q를 가지고 와 adder를 거치게 되면 1 이 증가한 값으로 출력된다.
  • adder를  Vcc와 연결한 이유는 "Vcc를 연결함으로서 자동적으로 + 1을 수행 할 수 있기" 때문이다.
  • 위 D Flip Flop으로 구현한 Counter인 경우 CP가 Positive edge에서 동작하냐? Negative edge에서 동작하냐?는 중요하지 않는다. 단순히 edge trigger에서 adder을 거친 출력값을 출력한다.

  • 다시 정리하면 비동기식 카운터인 경우, CP가  Positive edge냐? Negative edge냐에 따라 다르게 동작했지만, 동기식 카운터는 CP가 어느 시점에 동작하는 지 여부는 중요하지 않는다.

 

 

 

 

 

6. The MOD-16 Up counter implemented with D Flip-Flops (Positive edge trigger)

< Source >

// Synchronous MOD 16 Up counter implemented with D Flip Flop
module Synchronous_MOD_16_Up_Counter_Implemented_with_D_Flip_Flop_Positive(
    input clk, reset_p, enable,
    output reg [3:0] count );
    
    always @(posedge clk or posedge reset_p) begin
        if(reset_p) count = 0;
        else if(enable)  count = count + 1;
        else count = count; 
    end
    
endmodule
  • 16진 업 카운터이기 때문에 0 ~ 15까지 업 카운터하며, 2진수로 15 (1111) 까지 표현하기 위해서는 4bit 데이터가 필요하기 때문에 count 값을 4bit 크기로 설정했다.
  • positive edge에서 동작하는 up counter를 만들기 위해 posedge clk 키워드 사용했다.
  • reset_p :  positive edge에서 동작하는 reset 변수임을 표현하기 위해서 끝에 _p 키워드를 사용했다.
                    만약 negative edge에서 동작하는 reset을 만든다면 reset_n 이라고 작성하는 것이
                    직관적이고, 이해하기 편안하다. 

 

 

< Simulation >

  • 0 부터 15까지 순차적으로 Up counting 됨을 확인할 수 있으며, 16이 되면 overflow로 인해 다시 0으로 돌아온다.
  • clk (Clock pulse)가 Positive edge일 때, up count가 발생한다.

 

< RTL analysis >

 

  • MOD-16 Up Counter이기 때문에 0 ~ 15까지 up counting이 가능하며, 2진수로 1111 (15) 까지 표현하기 위해서는 4bit 데이터를 출력할 수 있도록 4bit 크기를 갖도록 count 변수 크기 설정했다.
  • RTL analysis는 실제 하드웨어 상에서 효율적으로 동작하기 위한 최적화 작업 보다는 코드의 논리 구조에 따라 쉽고, 직관적으로 회로를 구현하기 위해서 위와 같이 회로를 구성했다.
  • 즉, 출력 Q 값을 adder에 넣은 뒤, 1씩 증가된 결과 값을 다시 D Flip Flop의 입력값, D로 넣는다.

 

< Synthesis >

 

 

 

 

 

7. The MOD-16 Up counter implemented with D Flip-Flops (Negativeedge trigger)

< Source >

// Synchronous MOD 16 Up Counter implemeneted with D Flip Flop (Negative)
module Synchronous_MOD_16_Up_Counter_Implemented_with_D_Flip_Flop_Negative(
    input clk, enable, reset_n,
    output reg [3:0] count );
    
    always @(negedge clk or negedge reset_n) begin
        if(!reset_n) count = 0;
        else if(enable) count = count + 1;
        else count = count;
    end
    
endmodule
  • clk (Clock Pulse)이 Negative edge에서 Up counting 동작을 수행하며, Negative edge에서도 초기화가 된다.

 

< Simulation >

  • reset 단자는 negative edge에서 동작함을 확인
  • clk, 클럭 펄스가 Negative edge에서 up counting이 일어남을 확인할 수 있다.

 

< RTL analysis >

 

 

< Synthesis >