Skip to content

Instantly share code, notes, and snippets.

@mcgodfrey
Last active March 6, 2016 04:49
Show Gist options
  • Save mcgodfrey/10efe8f8644f3a7c190e to your computer and use it in GitHub Desktop.
Save mcgodfrey/10efe8f8644f3a7c190e to your computer and use it in GitHub Desktop.
Example servo control module in Verilog. Sweeps 4 servo motors back and forth at different speeds.
/*
Servo motor control demo module
Four servos swing back and forth with different speeds.
*/
module mojo_top(
input clk, // 50MHz clock input
//remaining default inputs/outputs omitted
output [3:0] servo_out //PWM output lines for each servo
);
//Usual setup code omitted (setting SPI lines, reset, etc.
localparam NUM_SERVOS = 4;
//pos is a 32 bit array (8 bits per servo)
wire [(NUM_SERVOS*8)-1:0] pos;
genvar i;
//Generate a serparate up/down counter for each servo
//Each one moves at a different speed (different CTR_LEN)
generate
for (i = 0; i < NUM_SERVOS; i=i+1) begin: counter_gen_loop
counter #(.CTR_LEN(26+i)) pos_counter (
.clk(clk),
.rst(rst),
.value(pos[(i+1)*8-1:i*8])
);
end
endgenerate
//loop to generate the servo controllers, 1 per servo.
//each has its position wired to the corresponding up/down counter above.
generate
for (i = 0; i < NUM_SERVOS; i=i+1) begin: servo_gen_loop
servo_controller servo_sweep (
.clk(clk),
.rst(rst),
.position(pos[(i+1)*8-1:i*8]),
.servo(servo_out[i])
);
end
endgenerate
endmodule
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment