본문 바로가기

RTL Design/Verilog RTL 설계

Verilog RTL 설계(7월 12일 - 6, 링 카운터)

1. Ring Counter

  • Ring 형태로 순환되는 Counter
  • 출력 값 중에서 하나의 비트 값만 1이고, 나머지 비트는 0을 갖게되며, 순차적으로 Shift되며 출력된다.
  • Ring 형태로 순환되는 구조를 갖기 때문에 마지막 비트에서 다시 첫 번째 비트로 돌아 온다.
  • n 개의 플립플롭을 갖는다면 n개의 서로 다른 상태를 갖는다.
  • 주로 순차적인 흐름 및 제어 필요한 시스템에서 사용된다.
  • Verilog는 병렬적 처리를 하기 때문에 순차적인 처리를 설계하고 싶을 경우, 링 카운터를 사용한다.

State diagram of Ring Counter

 

 

 

 

 

 

2. Behavioral modeling of Ring Counter (Positive edge trigger)

< Source >

// Behavioral Modeling of Ring Counter
module Behavioral_Modeling_Of_Ring_Counter_Positive(
    input clk, enable, reset_p,
    output reg [3:0] count );
    
    always @(posedge clk or posedge reset_p) begin
        if(reset_p) count = 4'b0001;
        else if(enable) begin
            case(count) 
                4'b0001 : count = 4'b0010;
                4'b0010 : count = 4'b0100;
                4'b0100 : count = 4'b1000;
                4'b1000 : count = 4'b0001;
                default : count = count;
            endcase
        end
    end
    
endmodule

 

< Simulation >

 

 

 

 

 

 

3. Behavioral modeling of Ring Counter by using shift operator (Negative edge trigger)

  • Behavioral modeling of Ring Counter를 통해 알 수 있듯이 count 값이 왼쪽으로 1bit 씩 Shift 됨을 확인할 수 있다.
  • 모든 입력 경우의 수에 대해서 출력을 정의할 필요 없이 Shift operator를 사용하여 구현할 수 있음을 생각할 수 있다.

 

< Source >

// Behavioral modeling of Ring Counter by using Shift operator
module Behavioral_Modeling_of_Ring_Counter_By_using_Shift_Operator(
    input clk, enable, reset_n,
    output reg [3:0] count );
    
    always @(posedge clk or negedge reset_n) begin
        if(!reset_n) count = 4'b0001;
        else if(enable) begin 
            if(count == 4'b1000) count = 4'b0001;
            else count = count << 1;
        end
        else count = count;
    end
    
endmodule

 

 

< Simulation >

 

< RTL Analysis >

 

 

 

 

 

4. Behavioral Modeling of Ring Counter by using concatenation operator.

  • Shift 연산자도 PDT (Propagation delay time)이 적기 때문에 충분히 좋은 코드이지만, 다음과 같이 결합 연산자로 Shift 연산자를 대신하면 Shift operator의 논리 회로가 필요없다.
  • 즉, 결합 연산자를 통해 Shift 연산자를 대체할 수 있다.
  • ★★★★★★
    Q) 왜 Shift 연산자를 사용하지 않고, 왜 결합 연산자를 사용하는가?

    A) RTL analysis 를 보게 되면 Shift 연산자를 수행하기 위한 회로가 생성되지 않았음을 확인할 수 있고, 이는 추가적으로 Shift 연산자를 위한 논리 회로를 생성하지 않음으로서 자원 절약을 할 수 있어 보다 효율적이라 볼 수 있다.

< Source >

// Behavioral modeling of ring counter by using concatenation operator.
module Behavioral_Modeling_of_Ring_Counter_By_using_concatenation_operator(
    input clk, enable, reset_p, 
    output reg [3:0] count );
    
    always @(posedge clk or posedge reset_p) begin
        if(reset_p) count = 4'b0001;
        else if(enable) begin
            if(count == 4'b1000) count = 4'b0001;
            else count = {count[2:0], 1'b0};
        end
        else count = count;
    end
    
endmodule
  • count = {count[2:0], 1'b0};  :  Shift 되어도 남아 있는 bit 자리수와 zero padding을 위한 0 값을 결합 연산자를 통해 결합함으로서 Shift 연산자와 유사한 기능을 수행할 수 있다.

 

< Simulation >

 

< RTL Analysis >

 

  • Shift 연산자를 사용하지 않았기 때문에 Shift 연산자를 수행할 논리회로가 필요하지 않다.
  • 따라서 결합 연산자로 이를 대체함으로서 자원의 절약을 할 수 있는 것이다.

 

< Synthesis >

 

 

 

 

 

 

5. 왜 RTL analysis에서 아래 그림와 같이 GND에 연결하며, 이는 무엇을 의미하는가? 

 

  • count = {count[2:0], 1'b0} 코드를 보게 되면 결합 연산자를 이용하여 Shift 연산자를 대체하기 위해서 LSB에 Zero padding을 위해 1'b0 과 결합하였다.
  • GND와 연결된 것도 Zero padding을 위해 접지와 연결된 것이다.
  • 아래 그림을 보고, 생각하면 이해가 하기 상대적으로 쉬울 것이다.