거북이처럼 천천히

Verilog RTL 설계(6월 24일 - 4, 순차 논리 회로, Flip-Flop) 본문

Verilog/Verilog RTL 설계

Verilog RTL 설계(6월 24일 - 4, 순차 논리 회로, Flip-Flop)

유로 청년 2024. 6. 26. 21:37

1. Latch의 한계

  • Latch는 Level trigger 에서 동작하는 1bit 데이터를 기억하는 기억소자이다.
  • S-R Latch에서 "입력값으로 S = 1, R = 1이 들어오면 회로의 출력이 발진할 수 있다."는 문제점을 가졌지만, D Latch에서  입력값으로 S = 1, R = 1이 들어오는 것을 제한함으로 해당 문제점을 해결 할 수 있었다.
  • 하지만, S-R Latch, D Latch에는 중요한 문제점이자, Latch의 한계를 갖는다.
    "활성화 신호 지속 시간이 Latch 동작 시간보다 길면 다중 상태 변화가 발생하여 최종 상태가 예측 불가능하다."
  • 활성화 신호 지속 시간은 "Latch가 동작하는 레벨에 있는 시간"을 의미한다.

 

 

 

2. Q) 왜 활성화 신호 지속 시간이 Latch의 동작 시간보다 길면 문제가 생기는가?

  • "할성화 신호 지속 시간이 Latch의 동작 시간보다 길다"는 의미는 
    Latch가 동작하는 레벨에 있으면 Latch는 이에 따라 입력값을 받고, 동작을 하게 되는데, Latch가 모든 동작을 끝낸 뒤, 다시 Latch가 동작하는 레벨에 있는지 여부를 확인하는데, 아직도 Latch가 동작하는 레벨에 있어 한 번 더 수행하는 괒정을 의미한다.
  • 즉, Latch가 동작하는 레벨에 있는 시간이 길어서 Latch가 해당 시간동안 2번 이상의 동작을 수행하는 상황을 의미한다.
  • 만약, 활성화 신호 지속 시간이 Latch의 동작 시간보다 짧다면 Latch는 입력값을 1번만 읽고, 이에 따라 1번만 동작하여 설계자는 해당 입력에 대한 출력값을 예측할 수 있다.
  • 하지만, 활성화 신호 지속 시간이 Latch의 동작 시간보다 길다면 Latch는 2번이상 입력값을 읽고, 이에 따른 동작을 2번 이상 수행하게 된다.  이렇게 된다면 설계자의 의도와 다르게 출력값을 발생할 수 있으며, 더 나아가 설계자 는 출력 값을 예측할 수 없는 상황까지 오게 된다.

 

 

 

3. Latch의 한계점을 보완하기 위한 대책 (Flip - Flop)

  • Latch의 문제의 원인인 "활성화 신호 지속 시간이 Latch의 동작 시간보다 길다."을 해결하기 위해서 활성화 신호 지속 시간을 Latch의 동작 시간보다 짧게 만듬으로서 해당 문제점 ("활성화 신호 지속 시간동안 여러번 Latch가 동작한다.")를 해결 할 수 있다.
  • Flip-Flop은 "edge sensitive" 1bit 데이터를 저장하는 기억 소자이다.

 

 

4. Flip-Flop

  • Flip-Flop은 edge sensitive인 1bit 데이터를 저장하는 기억소자이다.
  • 활성화 시간이 굉장히 짧기 때문에 소자의 동작 시간보다 짧다. 따라서 Latch의 문제점인 "긴 활성화 신호 지속 시간 동안 여러 번의 동작을 수행한다."를 해결할 수 있다.

 

 

4. D Flip-Flop

  • D Latch의 장점인 "S-R Latch의 문제점인 입력값으로 S = 1, R = 1을 넣게 되면 논리 회로의 출력값이 발진할 수 있는 가능성을 입력값으로 S = 1, R = 1이 들어오지 못하도록 제한함으로서 해결"을 유지하면서 edge trigger 방식을 사용함으로서 안정성과 예측 가능한 결과값을 제공한다.
  • D Flip-Flop은 다음과 같은 블록도와 진리표를 갖는다.

(위) Positive edge sensitive D Flip-Flop, (아래) Negative edge sensitive D Flip-Flop
D Flip-Flop의 Timing diagram

 

 

 

 

 

 

4.1. Reset, enable 단자를 구현하지 않은 Positive edge sensitive D Flip-Flop

  • Reset, enable 단자를 구현하지 않았기 때문에 reset 값은 항상 0, enable 값은 항상 1이다.

<Source code>

// Behavioral modeling of D Flip Flop. (Positive trigger)
module General_Positive_edge_D_Flip_Flop(
    input d,
    input clk, 
    output reg q);  

    // always 문의 감지 변수는 edge trigger 변수이다. 
    // posedge, negedge 키워드는 edge trigger 변수임을 나타낸다.
    always @(posedge clk) begin
        q = d;
    end
    
endmodule

 

<Simulation>

Positive edge sensitive D Flip-Flop

 

<Analysis>

  • 소스 코드를 해석하면 다음과 같다.
    - Behaviroal modeling으로 회로 설계 하였다.
    - always @(posedge clk) : 감지 변수인 clk 값이 Positive edge 가 발생하면 always 문을 실행
  • 시뮬레이션을 해석하면 다음과 같다.
    - clk 신호가 Positive edge일때, 입력값인 d값을 읽어서 출력 q로 내보낸다.

 

<RTL analysis>

  • Verilog code를 기반으로 블록도를 생성하면 위와 같이 표현할 수 있다.

<Synthesis>

 

  • basys3 보드를 기반으로 회로도를 생성하면 위와 같이 최적화되어 생성된다.
  • Q) 각각의 buffer는 어떤 역활을 수행하는가?
    - CE의 buffer는 노이즈 제거 역활을 수행
    - 입력 D의 buffer는 전압 보상 역활을 수행
    - 출력 q의 buffer는 역전류 방지 역활을 수행

 

 

 

 

 

 

4.2. Reset, enable 단자를 구현하지 않은 Negative edge sensitive D Flip-Flop

 

<Source code>

// Behavioral modeling of D Flip Flop (Negative edge)
module General_Negative_edge_D_Flip_Flop(
    input d,
    input clk, 
    output reg q);
    
    always @(negedge clk) begin
        q = d;
    end
    
endmodule

 

<Simulation>

Negative edge sensitive D Flip-Flop

<Analysis>

  • 소스 코드를 해석하면 다음과 같다.
    - Behaviroal modeling으로 회로 설계 하였다.
    - always @(negedge clk) : 감지 변수인 clk 값이 Negative edge 가 발생하면 always 문을 실행
  • 시뮬레이션을 해석하면 다음과 같다.
    - clk 신호가 Negative edge일때, 입력값인 d값을 읽어서 출력 q로 내보낸다.

<RTL analysis>

 

<Synthesis>

 

 

 

 

4.3. Reset, enable 단자가 구현된 Positive edge sensitive D Flip-Flop

 

<Source code>

// Behavioral modeling of positive edge sensitive D Flip-Flop
module Control_Positive_Edge_D_Flip_Flop(
    input d,
    input clk, reset, enable,
    output reg q);
    
    // Edge sensitive variable : clk, reset
    // reset이 우선 시 한 설계
    always @(posedge clk or posedge reset) begin 
        if(reset) q = 0;
        else if(enable) q = d;
    end
    
endmodule

 

<Simulation>

Positive edge sensitive D Flip-Flop
reset 값이 1인 경우 edge trigger와 상관없이 항상 출력값을 0으로 reset한다.
enable 값이 0이면 더 이상 edge trigger를 하지 않고, 이전 출력 값을 유지한다.

<Analysis>

  • 소스 코드를 분석하면 다음과 같다.
    - 이전에 구현한 D Flip-Flop은 설계자가 원하는 대로 컨트롤 할 수 없었지만, 이번에 구현한 D Flip-Flop은 enable, reset 입력값을 구현함으로서 설계자가 원하는 대로 컨트롤 할 수 있다.
    - always 문의 감지 변수는 clk과 reset이다.
      즉, clk값이나 reset값이 positive edge를 발생시키면 always문이 실행된다.
  • reset 값이 1이면 positive edge 때의 입력값 d에 상관 없이 항상 0으로 만든다.
  • enable 값이 1이면 더 이상 positive edge 때 입력값을 읽지 않고, 이전 출력값을 그대로 출력 및 유지한다.

<RTL analysis>

 

  • 이전에 enable, reset의 입력 값을 구현하지 않았을 경우에는 입력 단자가 clk, d 만 존재했지만, 이번 D Flip Flop은 enable, reset의 입력 값을 구현했기 때문에 4개의 단자로 구성된다.

 

 

 

 

 

4.4. Reset, enable 단자가 구현된 Negative edge sensitive D Flip-Flop

 

<Source code>

// Behavioral modeling of D Flip Flop (Negative edge sensitive)
module Control_Negative_Edge_D_Flip_Flop(
    input d, 
    input clk, reset, enable,
    output reg q );
    
    always @(negedge clk or posedge reset) begin
        if(reset) q = 0;
        else if(enable) q = d;
     end
    
endmodule

 

<Simulation>

Negative edge sensitive D Flip-Flop

 

<Analysis>

  • 소스 코드를 분석하면 다음과 같다.
    - clk 값은 negative edge, reset 값은 positive edge 일 때, 감지한다.
    - reset 값이 1이면 negative edge 때의 입력값 d에 상관 없이 항상 0으로 만든다.
    - enable 값이 1이면 더 이상 negative edge 때 입력값을 읽지 않고, 이전 출력값을 그대로 출력 및 유지한다.

 

<RTL analysis>

 

<Synthesis>

 

  • FPGA내에서는 이미 Reset, enable 단자가 구현되어 있기 때문에 추가적으로 구현 할 필요 없이 사용할 수 있다.