// Half-Step 방식 Stepper 구동
module stepper_cntr (
    input clk, reset_p,       
    input start_stepper,            // 구동 신호, high일때 구동
    input stepper_dir,              // 회전 방향 1 시계 방향, 0 반시계 방향
    output reg [3:0] stepper,       // Motor Driver 출력 신호, IN1 ~ 4
    output [15:0] led
    );

    reg [23:0] cnt_sysclk = 0;      // System Clock Counter
    reg [2:0] step_index = 0;       // 배열 Index 나타냄  0에서 7까지 반복하며 모터를 회전
    reg [3:0] half_step [7:0];      //8개의 하프 스텝 시퀀스를 배열로 정의

    initial begin
        half_step[0] = 4'b1000;
        half_step[1] = 4'b1100;
        half_step[2] = 4'b0100;
        half_step[3] = 4'b0110;
        half_step[4] = 4'b0010;
        half_step[5] = 4'b0011;
        half_step[6] = 4'b0001;
        half_step[7] = 4'b1001;
    end

    assign led[0] = start_stepper;
    assign led[1] = stepper_dir;
    assign led[5:2] = stepper;
    always @(posedge clk or posedge reset_p) begin
        if (reset_p)begin
            cnt_sysclk <= 0;
            step_index <= 0;
            stepper <= 4'b0000;
        end else begin
            if (start_stepper) begin
                if (cnt_sysclk >= 200_000) begin        // 2ms마다 Step 변경
                    cnt_sysclk <= 0;
                    stepper <= half_step[step_index];
                    if (stepper_dir) begin // 시계 방향
                        if (step_index >= 7) step_index <= 0;
                        else step_index <= step_index + 1;
                    end
                    else begin // 반시계 방향
                        if (step_index <= 0) step_index <= 7;
                        else step_index <= step_index - 1;
                    end
                end
                else begin
                    cnt_sysclk <= cnt_sysclk + 1;
                end
            end
            else begin // 정지 동작 
                cnt_sysclk <= 0;
                step_index <= 0;
                stepper <= 4'b0000;
            end
        end
    end
endmodule