/****************************************************************************************************************** * File: pwm.v * Authors : Areabot * Date : 28/10/2005 * This program is released under the GNU Public License. * * Ce module est un générateur PWM. * - periode[11:0] donne la période du PWM. Elle est prise en compte à chaque début de cycle. * - val[7:0] donne le rapport cycle du PWM (durée de la partie haute). * *******************************************************************************************************************/ module pwm(clk, reset_n, periode, val, out); input clk; input reset_n; input [11:0] periode; input [7:0] val; output out; reg out; reg [11:0] time_count; reg [11:0] periode_r; reg [7:0] pwm_counter; // Génération de la base de temps pour le compteur PWM. // on passe pwm_counter_ena à 1 pendant 1 cycle dès que "periode" // cycles d'horloge se sont écoulés. always @(posedge clk or negedge reset_n) if(~reset_n) begin time_count <= 0; pwm_counter <= 0; out <= 0; periode_r <= 0; end else begin time_count <= time_count + 1; // Si on est à la fin de la période de base if(time_count==periode_r) begin // On remet le compteur de temps à zéro time_count <= 0; // On incrémente le compteur de PWM pwm_counter <= pwm_counter + 1; // Si on est sur le point de boucler // on recharge une nouvelle période if(pwm_counter==8'b11111111) periode_r <= periode; // Enfin on met à jour la sortie out <= (pwm_counter < val); end end endmodule