50 lines
1.0 KiB
Systemverilog
50 lines
1.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
|
|
|
|
endmodule
|