인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

ywk0205님의 프로필 이미지

작성한 질문수

설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)

[Verilog HDL/FPGA 외전1 - 시계만들기] Chapter 1. 1초 만들기

퀴즈 4 cnt f/f 변수 출력값 관련 질문

해결된 질문

작성

·

81

1

안녕하세요 🙂

[1. 질문 챕터] : fpga 외전 1 시계만들기 Chapter 1 2분 9초 퀴즈 4번 부분

[2. 질문 내용]

cnt flipflop의 변수 출력값이 1억 - 1이라고 하셨는데, 1억이 아닌지 여쭤보고 싶습니다.

 

보여주신 코드 상에서는 cnt f/f 변수의 출력값이 1억 -1임을 시뮬레이션에서 어떻게 확인하는 것인지 잘 모르겠어서, 아래와 이 d_flipflop 모듈을 추가한 회로도를 사용하여 시뮬레이션을 돌려보았습니다. 그 결과 flip flop의 output 값이 1억이 나타났는데 확인해주시면 정말 감사하겠습니다

 

image.png

 

[3. 시도했던 내용, 그렇게 생각하는 이유]

처음 enable이 켜졌을 때 combinational logic에 의해 d_flipflop의 input 값이 1이 되고, rising edge일 때 해당 값이 저장되므로 첫번째 사이클부터 cnt f/f 변수의 출력값이 1로 나타난다고 생각했습니다. 따라서 1초가 지난 이후에도 출력값이 1억이 될 것이라고 생각했습니다.

 

해당 회로도를 기반으로 시뮬레이션을 돌려본 결과 입니다. (편의상 100사이클만 수행하였습니다.) 100 사이클 이후 d_flipflop의 outpu이 100으로 나타나므로 퀴즈 4번의 결과 또한 1억이 나올 것 같은데, 1억 -1이 나타나는 이유가 무엇인지 궁금합니다.

image.png

 

+) posedge에 enable이 켜지는 상황에서는 posedge 시간에 f/f에 stable한 값이 전달되지 않으므로 첫 사이클에서의 output value가 0임을 확인했습니다. 최종적으로 cnt f/f의 출력값은 99였습니다. 그러나 이때에는 최종적인 cnt 변수 값 또한 99로 나타나므로 만약 퀴즈 4의 가정 상황이 posedge에서 enable이 켜지는 상황이라면 Q3과 Q4의 답 모두 1억 -1이 되어야 할 것 같습니다.

 

아래는 사용한 코드입니다. 혹시라도 시뮬레이션에서 잘못된 부분이 있다면 알려주시면 감사하겠습니다.

 

 

// tb_quiz.v
`timescale 1ns/1ps

module tb_quiz();
    reg clk;
    reg reset_n;
    reg enable;
    
    wire [31:0] cnt;
    
    initial begin
        clk     <= 0;
        reset_n <= 1;
        enable  <= 0;
        
        #50
        reset_n <= 0;
        
        #10
        reset_n <= 1;
        
        #50
        enable <= 1;
        
        #1000
        $finish;
    end
    
    always #5 clk = ~clk;
    
    quiz DUT (
    .clk (clk),
    .reset_n (reset_n),
    .enable (enable),
    .o_cnt (cnt)
    );
endmodule
// quiz.v
 `timescale 1ns/1ps

module quiz(input clk,
            input reset_n,
            input enable,
            output [31:0] o_cnt);
    
    wire [31:0] current_cnt;
    reg [31:0] next_cnt;
    
    always @(*) begin
        if (enable) begin
            next_cnt <= current_cnt + 1;
            end else begin
            next_cnt <= current_cnt;
        end
    end
    
    assign o_cnt = current_cnt;
    
    d_flipflop u_d_flipflop(
    .clk (clk),
    .reset_n (reset_n),
    .i_value (next_cnt),
    .o_value (current_cnt)
    );
    
endmodule
`timescale 1ns/1ps

module d_flipflop (input clk,
                   input reset_n,
                   input [31:0] i_value,
                   output [31:0] o_value);
    
    reg [31:0] r_value;
    
    assign o_value = r_value;
    
    always @(posedge clk or negedge reset_n) begin
        if (!reset_n) begin
            r_value <= 0;
            end else begin
            r_value <= i_value;
        end
    end
    
endmodule

답변 1

1

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

안녕하세요. 🙂

기준점에 혼동이 있을 수 있겠지만, 0을 시간에 포함했기 때문에, 1억 -1 이라고 답변드렸습니다.

이를 확인해보기 위해서 matbi watch 1장코드에서, count 부분을 100 -> 10으로 변경하였습니다.

image.png

 

1억 -1 이나, 10 - 1 이나, -1 인지 확인하는 건 동일할 것 같아요.

보시면, 9 다음 0 으로 넘어가죠.

그리고 0 <-> 9 까지의 시간이 100ns 의 주기를 보이고 있고요. (100 ns 부분의 마지막 count 값은 9 (= 10-1) 이라서 Q4 를 딱 1초가 지난 시점의 출력값을 1억 -1 이라고 답변드렸습니다.

image.png

하지만, 질문자님이 생각하시는 부분도 맞다고 생각해요.

논란의 요지가 있는 것 같고요. Counter 를 설계하기 위해서, -1 까지의 값을 보고 reset 을 해줘야, 정확한 1초를 만들 수 있었기 때문에, Q4 질문을 강의에 넣은거에요.

Q3 은 reset 이 없기때문에, 1억 cycle 후에 1억이라는 값이 출력될 것이고,

Q4 는 0포함 1억이 지났을때, "1억 - 1" 상태가 마지막이라서 1억 -1 이라고 답변드린거고요..

counter 의 값 기준으로 생각해주시면 감사하겠습니다.

 

즐공하세요!

 

 

 

ywk0205님의 프로필 이미지

작성한 질문수

질문하기