스톱워치는 총 4개의 모듈로 구성됩니다.

Basys3 보드에 4자리 7세그먼트 FND를 이용해 초 : 밀리초(sec : msec) 값을 표시하는 fnd_controller 모듈은 이전 실습에 사용했던 코드를 가져와서 사용하겠습니다.

🔖 FND Controller

ℹ️ Verilog Code(Stopwatch_CU)

stopwatch_cu모듈은 디지털 스톱워치에서 **상태를 전이시키는 FSM (Finite State Machine)**을 담당합니다. 사용자의 버튼 입력 (btnL, btnR)에 따라 상태를 제어하고, 이에 따라 clear, run_stop 제어 신호를 출력합니다.

모듈은 clk, rst, i_clear, i_runstop 총 네 개의 입력과, o_clear, o_runstop 두 개의 출력을 가집니다. i_clear는 초기화 버튼 (btnL), i_runstop은 실행/정지 토글 버튼 (btnR)입니다. 출력 o_clear는 초기화 상태일 때만 1이 출력되며, o_runstop은 실행(RUN) 상태일 때만 1이 출력됩니다.

module stopwatch_cu (
    input  clk,
    input  rst,
    input  i_clear,    // btnL
    input  i_runstop,  // btnR
    output o_clear,
    output o_runstop
);

상태는 3가지로 정의되어 있습니다.

현재 상태가 CLEAR일 경우 o_clear를 1로 출력하고, 현재 상태가 RUN일 경우 o_runstop을 1로 출력합니다.

    parameter STOP = 0, RUN = 1, CLEAR = 2;

    reg [1:0] c_state, n_state;

    assign o_clear   = (c_state == CLEAR) ? 1 : 0;
    assign o_runstop = (c_state == RUN) ? 1 : 0;

c_state는 현재 상태를 저장하는 레지스터입니다. 클럭 상승 엣지마다 동작하며, rst 신호가 활성화되면 상태를 무조건 STOP으로 초기화합니다. 그렇지 않으면 n_state 값을 현재 상태로 갱신합니다.

    // 상태 레지스터
    always @(posedge clk or posedge rst) begin
        if (rst) begin
            c_state <= 0;
        end else begin
            c_state <= n_state;
        end
    end

아래 always 블록은 FSM의 핵심 동작을 결정하는 조합논리회로입니다. 현재 상태(c_state)에 따라 다음 상태(n_state)를 결정합니다.