always_ff @(posedge clk or posedge reset)
if (reset) state_reg <= ZERO;
else state_reg <= state_next;
always_comb begin
state_next = state_reg;
db = 1'b0;
case (state_reg)
ZERO: if (sw) state_next = WAIT1_1;
WAIT1_1: if (~sw) state_next = ZERO;
else if(m_tick) state_next = WAIT1_2;
WAIT1_2: if (~sw) state_next = ZERO;
else if(m_tick) state_next = WAIT1_3;
WAIT1_3: if (~sw) state_next = ZERO;
else if(m_tick) state_next = ONE;
ONE: begin db = 1'b1; if (~sw) state_next = WAIT0_1; end
WAIT0_1: begin db = 1'b1; if (sw) state_next = ONE;
else if(m_tick) state_next = WAIT0_2; end
WAIT0_2: begin db = 1'b1; if (sw) state_next = ONE;
else if(m_tick) state_next = WAIT0_3; end
WAIT0_3: begin db = 1'b1; if (sw) state_next = ONE;
else if(m_tick) state_next = ZERO; end
default: state_next = ZERO;
endcase
end