LineFollower-DSB/entities/motorcontrol.sv

82 lines
2.0 KiB
Systemverilog

module motorcontrol
(input logic clk,
input logic reset,
input logic direction,
input logic [20:0] count_in,
output logic pwm);
// typedef enum logic [1:0] { motor_off, motor_cw, motor_ccw } motor_controller_state;
// motor_controller_state state,next_state;
//
// always_ff @(posedge clk)
// if (reset)
// state <= motor_off;
// else
// state <= next_state;
//
// always_comb //state logic
// begin
// if(direction ==? 0)
// next_state = motor_ccw;
// else
// next_state = motor_cw;
// end
//
// always_comb //PWM logic
// begin
// case(state)
// motor_off:
// pwm=0;
// motor_ccw:
// begin
// if(count_in <= 100000)
// pwm=1;
// else
// pwm=0;
// end
// motor_cw:
// begin
// if(count_in <= 200000 )
// pwm=1;
// else
// pwm=0;
// end
// endcase
//
// end
typedef enum logic { pwm_off, pwm_on } motor_controller_state;
motor_controller_state state,next_state;
always_ff @(posedge clk) begin
if(reset)
state<=pwm_off;
else
state<= next_state;
end
always_comb begin
case(state)
pwm_off:
begin
pwm=0;
if(count_in ==? 0) begin
next_state=pwm_on;
end
end
pwm_on:
begin
pwm=1;
if((direction ==? 0) && (count_in >= 100000)) begin //CCW
next_state=pwm_off;
end
else if((direction ==? 1) && (count_in >= 200000)) begin
next_state=pwm_off;
end
else
next_state=pwm_on;
end
endcase
end
endmodule