거북이처럼 천천히

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

Verilog/Verilog RTL 설계

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

유로 청년 2024. 6. 29. 11:49

1. Counter

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

 

 

2. Q) Counter와 Timer는 구체적인 차이는 무엇인가?

  • Counter와 Timer는 대부분 함께 사용하지만, 입력 신호의 특성과 용도의 차이를 갖는다.
  • Timer : 입력 신호의 주기가 일정하여 일정한 주기를 갖는 신호를 카운트할 때, 사용
  • Counter : 입력 신호의 주기가 일정하지 않아서 입력 신호의 레벨 변화를 감지하여 카운트 할 때, 사용
  • 즉, Timer는 시간 기반의 동작, 카운터는 이벤트 기반 동작에 사용한다.

 

 

 

3. 그러면 일정한 주기의 신호를 카운트한다고 한다면, Timer만 사용하는가? 아니면 Timer가 감지한 뒤, Counter에게 Interrupt를 발생시켜 Counter가 카운트하게 되나?

  • Timer는 내부적으로 Counter를 포함하고 있기 때문에 이 경우에는 일정한 주기를 가지고 카운트하는 작업은 Timer, 하나만으로도 충분하다.
  • 하지만, AVR 처럼 Timer와 Counter를 함께 사용하는 경우가 있다.
  • 이 경우에는 Timer가 일정한 주기를 갖는 클럭을 발생시키고, Counter는 이 클럭 주기를 입력으로 받아서 카운트를 하게 된다.

 

 

 

4. 카운터는 클럭과의 동기 방식에 따라  비동기식 / 동기식 카운터로 분류된다.

 

동기식 카운터)

  • 동기식 카운터는 카운터를 구성하는 모든 Flip Flop과 공통된 클럭이 연결된 카운터를 의미한다.
  • 따라서 클럭의 변화가 발생하면 모든 Flip Flop은 빠르고, 동시에 그에 따른 상태 변화가 발생한다.
  • 따라서 빠른 반응 시간을 가지며, 고속 카운터 설계에 적합하다.
  • 그러나, 모든 Flip Flop에 연결해야 하는 만큼 회로가 상대적으로 복잡하다.

 

 

비동기식 카운터)

  • 비동기식 카운터는 첫 번째 Flip Flop만 클럭에 연결된 카운터를 의미한다.
  • 따라서 클럭의 변화가 발생하면 첫 번째 Flip Flop 부터 순차적으로 상태 변화가 발생한다.
  • 따라서 상대적으로 느릭 동작 시간을 가지며, 고속 카운터 설계에 적합하지 않다.
  • 그러나, 첫 번째 Flip Flop에만 메인 클럭을 연결하기 때문에 상대적으로 회로가 덜 복잡하다.

 

 

 

 

 

5. 비동기식 카운터

  • 비동기식 카운터는 위에서 말했듯이 첫 번째 Flip Flop만 클럭과 연결되어 있는 카운터를 말한다.
  • 따라서 나머지 Flip Flop들은 이전 Flip Flop의 출력값과 CP (Clock Pulse)를 연결하여 사용한다.
  • 이처럼 Flip Flop의 출력 전이가 다른 Flip Flop을 Trigger시키는 원인으로 작용하는 카운터를 "Ripple 카운터" 라 한다.

 

 

 

 

6. 비동기식 4bit Up - Counter , 이론 ( T Flip Flop를 사용 )

    • T Flip Flop을 이용하여 비동식 4bit up-counter를 구성하면 다음과 같다.

T Flip Flop으로 구현된 Counter

 

    • 이번에는 단계를 나누어서 비동기식 4bit Up - Counter를 설계해보도록 하겠다.
    • 1단계) 아래와 같이 카운트 값들을 나열 한 뒤, 이진수로 표현하기

카운트 값들을 일렬로 나열한 뒤, 각각의 값들은 이진수로 표현

 

  • 2단계) 주기를 갖는 CP 을 상단에 표시한 뒤, QA, QB, QC, QD 를 표시한다.
               (QA : 첫 번째 Flip Flip의 출력값, Q)

 

 

  • 3단계) 출력 값의 레벨 값을 보고, 이를 직선으로 표시한다.

  • 위 펄스파형들을 보면 알 수 있듯이 Qa에서는 입력 클록 주파수 (CP)의 1/2, Qb에서는 CP의 1/4, Qc에서는 CP의 1/8, Qd에서는 CP의 1/16 주파수를 갖는 파형을 생성됨을 확인할 수 있다.
  • 위 생성된 펄스파형을 통해 Qa는 CP 클럭을 clk 값으로 받고, Qb는 Qa 값을 clk 값으로 받고, Qc는 Qb 값을 clk 값으로 받고, Qd는 Qc 값을 clk값으로 받으면 각각의 펄스에서 Negative edge가 발생하면 1씩 카운트함을 확인할 수 있다.
  • 이를 이용하여 전단의 Flip Flop의 출력, Q를 현재의 Flip Flop의 clk으로 연결하면 전단의 Flip Flip의 수행이 끝나면 다음 Flip Flop은 clk 단자를 통해 전단의 수행이 끝났음을 확인하고, 수행한다.
  • 이러한 형태의 Counter를 "Ripple Counter"라 한다.

 

 

 

 

 

7. 비동기식 4bit Up - Counter , 구현 ( T Flip Flop를 사용 )

<Source code>

// Behavioral modeling of T Flip-Flop
module T_Flip_Flop (
    input t,
    input clk, reset,
    output reg q);
    
    always @(negedge clk or posedge reset) begin
        if(reset) q = 0;
        else begin
            if(t) q = ~q;
            else q = q;
        end
    end
endmodule

// 4bit Up Counter by using T Flip Flop
module Up_Counter_4bit_T_Flip_Flop(
    input clk, reset,
    output [3:0] q_count);
    
    T_Flip_Flop Flip_Flop0 (.t(1), .clk(clk), .reset(reset), .q(q_count[0]));
    T_Flip_Flop Flip_Flop1 (.t(1), .clk(q_count[0]), .reset(reset), .q(q_count[1]));
    T_Flip_Flop Flip_Flop2 (.t(1), .clk(q_count[1]), .reset(reset), .q(q_count[2]));
    T_Flip_Flop Flip_Flop3 (.t(1), .clk(q_count[2]), .reset(reset), .q(q_count[3]));
    
endmodule

 

<Simulation>

T Flip-Flop으로 구현한 Up-Counter

<Analysis>

  • 소스 코드를 분석하면 다음과 같다.
    - T Flip Flop을 통해 Up-counter를 구현
    - T_Flip_Flop 모듈을 통해 Flip_Flop 0 ~ 3 인스턴스를 생성
    - Arguement를 보게 되면 이전 단의 Flip Flop의 출력 값, Q를 다음 Flip Flop의 CP 값으로 주었음을 확인 가능
  • 시뮬레이션을 분석하면 다음과 같다.
    - 10ns 동안 reset 값에 1을 줘서 q_count 값을 0으로 초기화하였다.
       (이유 : 0으로 초기화해야만 Counter는 0부터 시작해서 +1 씩 카운트를 할 수 있다.)
    - 4bit counter이기 때문에 0 ~ 15까지 카운트를 하며, 이를 넘어서면 Overflow가 발생하여 다시 0부터 카운트를 한다.
    - Negative edge sensitive T Flip-Flop으로 구현 했기 때문에 Negative edge 때, 카운트함을 확인할 수 있다.

<RTL Analysis>

Verilog 소스 코드를 통한 구현

 

 

  • 위 RTL Analysis 를 통해 2가지 정보를 얻을 수 있다.
    - clk 신호는 첫 번째 Flip Flop에만 동기화되어 있다. ( 비동기식 Counter )
    - 전단의 Flip Flop의 출력값, Q이 다음 Flip Flop의 clk 값으로 작용한다. ( Ripple Counter )

 

 

 

 

 

 

 

8. 비동기식 4bit Down - Counter , 이론 ( T Flip Flop를 사용 )

이번에는 비동기식 4bit down counter를 T Flip Flop을 통해 구현해 보겠다.

  • 1단계) 아래와 같이 카운트 값들을 나열 한 뒤, 이진수로 표현하기
    다운 카운트 값을 일렬로 나열 한 뒤, 이진스로 표현


  • 2, 3단계) 주기를 갖는 CP 을 상단에 표시한 뒤, QA, QB, QC, QD 를 표시한다. (QA : 첫 번째 Flip Flip의 출력값, Q)
                   출력 값의 레벨 값을 보고, 이를 직선으로 표시한다.

  • 위 Timing diagram을 통해 Qa는 CP 신호의 Positive edge에서 출력 값이 Toggle이 됨을 확인할 수 있으며, 
    Qb도 Qa의 출력 신호가 0 → 1 로 변화할 때, (= Positive edge 일 때) Qb도 Toggle이 됨을 확인할 수 있다.
  • 나머지 Qc, Qd도 이전 Flip Flop의 출력 값이 Toggle 되었을 때, 동작함을 확인할 수 있다.
  • 이를 통해 첫 번째 Flip Flop의 CP(Clock Pulse)에만 clk을 연결하고, 나머지 Flip Flop은 이전의 Flip Flop의 출력을 CP에 연결함으로서 비동기식 카운터를 설계하는 것이다.
  • 이러한 형태의 연결을 비동기식 카운터 중 하나인 Ripple Counter라고 할 수 있다. 

 

 

 

9. 비동기식 4bit Down - Counter , 구현 ( T Flip Flop를 사용 )

 

<Source code>

// Behavioral modeling of T Flip Flop
module T_Flip_Flop (
    input t,
    input clk, reset,
    output reg q );
    
    always @(posedge clk or posedge reset) begin
        if(reset) q = 0;
        else begin
            if(t) q = ~q;
            else q = q;
        end
    end   
endmodule


// Structural modeling of 4bit down counter
module Down_Counter_4bit_Flip_Flop(
    input clk, reset,
    output [3:0] count);
    
    T_Flip_Flop Flip_Flop0 (.t(1), .clk(clk), .reset(reset), .q(count[0]));
    T_Flip_Flop Flip_Flop1 (.t(1), .clk((count[0])), .reset(reset), .q(count[1]));
    T_Flip_Flop Flip_Flop2 (.t(1), .clk((count[1])), .reset(reset), .q(count[2]));
    T_Flip_Flop Flip_Flop3 (.t(1), .clk((count[2])), .reset(reset), .q(count[3]));
    
endmodule

 

<Simulation>

T Flip Flop으로 구현한 4bit down counter (ripple counter)

 

<Analysis>

  • 소스 코드를 분석하면 다음과 같다.
    - T Flip Flop 소스 코드에서 always의 감지 변수는 clk 과 reset 변수이며, clk 변수는 posedge 키워드로 정의했기 때문에 해당 T Flip Flop은 Positive edge sensitive T Flip Flop이다.
    - Down counter 소스 코드에서 첫 번째 T Flip Flip만 제외하고, 나머지 Flip Flop 들은 이전 Flip Flop의 출력을 본인의 CP에 연결한 형태이다. 즉, Ripple Counter 형태를 갖는다.
  • 시뮬레이션을 분석하면 다음과 같다.
    - 초기에 reset 값을 1을 줘서 Counter 값을 0으로 초기화한다.
    - 15를 시작으로 -1 씩 down count한다.

 

<RTL Analysis>