스톱워치는 총 4개의 모듈로 구성됩니다.
stopwatch.v
– 최상위 통합 모듈stopwatch_cu.v
– 제어 유닛 (Control Unit)stopwatch_dp.v
– 데이터 경로 (Data Path)fnd_controller.v
– FND 출력 제어Basys3 보드에 4자리 7세그먼트 FND를 이용해 초 : 밀리초(sec : msec) 값을 표시하는 fnd_controller 모듈은 이전 실습에 사용했던 코드를 가져와서 사용하겠습니다.
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가지로 정의되어 있습니다.
STOP
: 정지 상태RUN
: 실행 상태 (카운트 진행)CLEAR
: 초기화 상태 (1클럭 동안만 유지됨)현재 상태가 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
)를 결정합니다.