// 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