This Verilog project presents a Verilog code for PWM generator with Variable Duty Cycle. Last time, I presented a VHDL code for a PWM generator.
The Verilog PWM (Pulse Width Modulation) generator creates a 10MHz PWM signal with variable duty cycle. Two buttons which are debounced are used to control the duty cycle of the PWM signal. The first push button is to increase the duty cycle by 10%, and the other button is to decrease the duty cycle by 10%.
Verilog code for PWM generator with variable duty cycle:
// fpga4student.com: FPGA Projects, Verilog projects, VHDL projects // Verilog project: Verilog code for PWM Generator with variable Duty Cycle // Two debounced buttons are used to control the duty cycle (step size: 10%) module PWM_Generator_Verilog ( clk, // 100MHz clock input increase_duty, // input to increase 10% duty cycle decrease_duty, // input to decrease 10% duty cycle PWM_OUT // 10MHz PWM output signal ); input clk; input increase_duty; input decrease_duty; output PWM_OUT; wire slow_clk_enable; // slow clock enable signal for debouncing FFs reg[27:0] counter_debounce=0;// counter for creating slow clock enable signals wire tmp1,tmp2,duty_inc;// temporary flip-flop signals for debouncing the increasing button wire tmp3,tmp4,duty_dec;// temporary flip-flop signals for debouncing the decreasing button reg[3:0] counter_PWM=0;// counter for creating 10Mhz PWM signal reg[3:0] DUTY_CYCLE=5; // initial duty cycle is 50% // Debouncing 2 buttons for inc/dec duty cycle // Firstly generate slow clock enable for debouncing flip-flop (4Hz) always @(posedge clk) begin counter_debounce <= counter_debounce + 1; //if(counter_debounce>=25000000) then // for running on FPGA -- comment when running simulation if(counter_debounce>=1) // for running simulation -- comment when running on FPGA counter_debounce <= 0; end // assign slow_clk_enable = counter_debounce == 25000000 ?1:0; // for running on FPGA -- comment when running simulation assign slow_clk_enable = counter_debounce == 1 ?1:0; // for running simulation -- comment when running on FPGA // debouncing FFs for increasing button DFF_PWM PWM_DFF1(clk,slow_clk_enable,increase_duty,tmp1); DFF_PWM PWM_DFF2(clk,slow_clk_enable,tmp1, tmp2); assign duty_inc = tmp1 & (~ tmp2) & slow_clk_enable; // debouncing FFs for decreasing button DFF_PWM PWM_DFF3(clk,slow_clk_enable,decrease_duty, tmp3); DFF_PWM PWM_DFF4(clk,slow_clk_enable,tmp3, tmp4); assign duty_dec = tmp3 & (~ tmp4) & slow_clk_enable; // vary the duty cycle using the debounced buttons above always @(posedge clk) begin if(duty_inc==1 && DUTY_CYCLE <= 9) DUTY_CYCLE <= DUTY_CYCLE + 1;// increase duty cycle by 10% else if(duty_dec==1 && DUTY_CYCLE>=1) DUTY_CYCLE <= DUTY_CYCLE - 1;//decrease duty cycle by 10% end // Create 10MHz PWM signal with variable duty cycle controlled by 2 buttons always @(posedge clk) begin counter_PWM <= counter_PWM + 1; if(counter_PWM>=9) counter_PWM <= 0; end assign PWM_OUT = counter_PWM < DUTY_CYCLE ? 1:0; endmodule // Debouncing DFFs for push buttons on FPGA module DFF_PWM(clk,en,D,Q); input clk,en,D; output reg Q; always @(posedge clk) begin if(en==1) // slow clock enable signal Q <= D; end endmodule
Verilog Testbench code for PWM generator:
`timescale 1ns / 1ps // fpga4student.com: FPGA Projects, Verilog projects, VHDL projects // Verilog project: Verilog testbench code for PWM Generator with variable duty cycle module tb_PWM_Generator_Verilog; // Inputs reg clk; reg increase_duty; reg decrease_duty; // Outputs wire PWM_OUT; // Instantiate the PWM Generator with variable duty cycle in Verilog PWM_Generator_Verilog PWM_Generator_Unit( .clk(clk), .increase_duty(increase_duty), .decrease_duty(decrease_duty), .PWM_OUT(PWM_OUT) ); // Create 100Mhz clock initial begin clk = 0; forever #5 clk = ~clk; end initial begin increase_duty = 0; decrease_duty = 0; #100; increase_duty = 1; #100;// increase duty cycle by 10% increase_duty = 0; #100; increase_duty = 1; #100;// increase duty cycle by 10% increase_duty = 0; #100; increase_duty = 1; #100;// increase duty cycle by 10% increase_duty = 0; #100; decrease_duty = 1; #100;//decrease duty cycle by 10% decrease_duty = 0; #100; decrease_duty = 1; #100;//decrease duty cycle by 10% decrease_duty = 0; #100; decrease_duty = 1; #100;//decrease duty cycle by 10% decrease_duty = 0; end endmodule
Simulation Waveform for PWM generator in VHDL:
Recommended Verilog projects:
2. Verilog code for FIFO memory
3. Verilog code for 16-bit single-cycle MIPS processor
4. Programmable Digital Delay Timer in Verilog HDL
5. Verilog code for basic logic components in digital circuits
6. Verilog code for 32-bit Unsigned Divider
7. Verilog code for Fixed-Point Matrix Multiplication
8. Plate License Recognition in Verilog HDL
9. Verilog code for Carry-Look-Ahead Multiplier
10. Verilog code for a Microcontroller
11. Verilog code for 4x4 Multiplier
12. Verilog code for Car Parking System
13. Image processing on FPGA using Verilog HDL
14. How to load a text file into FPGA using Verilog HDL
15. Verilog code for Traffic Light Controller
16. Verilog code for Alarm Clock on FPGA
17. Verilog code for comparator design
18. Verilog code for D Flip Flop
19. Verilog code for Full Adder
20. Verilog code for counter with testbench
21. Verilog code for 16-bit RISC Processor
22. Verilog code for button debouncing on FPGA
23. How to write Verilog Testbench for bidirectional/ inout ports
3. Verilog code for 16-bit single-cycle MIPS processor
4. Programmable Digital Delay Timer in Verilog HDL
5. Verilog code for basic logic components in digital circuits
6. Verilog code for 32-bit Unsigned Divider
7. Verilog code for Fixed-Point Matrix Multiplication
8. Plate License Recognition in Verilog HDL
9. Verilog code for Carry-Look-Ahead Multiplier
10. Verilog code for a Microcontroller
11. Verilog code for 4x4 Multiplier
12. Verilog code for Car Parking System
13. Image processing on FPGA using Verilog HDL
14. How to load a text file into FPGA using Verilog HDL
15. Verilog code for Traffic Light Controller
16. Verilog code for Alarm Clock on FPGA
17. Verilog code for comparator design
18. Verilog code for D Flip Flop
19. Verilog code for Full Adder
20. Verilog code for counter with testbench
21. Verilog code for 16-bit RISC Processor
22. Verilog code for button debouncing on FPGA
23. How to write Verilog Testbench for bidirectional/ inout ports
24. Tic Tac Toe Game in Verilog and LogiSim
25. 32-bit 5-stage Pipelined MIPS Processor in Verilog (Part-1)
26. 32-bit 5-stage Pipelined MIPS Processor in Verilog (Part-2)
27. 32-bit 5-stage Pipelined MIPS Processor in Verilog (Part-3)
30. N-bit Adder Design in Verilog25. 32-bit 5-stage Pipelined MIPS Processor in Verilog (Part-1)
26. 32-bit 5-stage Pipelined MIPS Processor in Verilog (Part-2)
27. 32-bit 5-stage Pipelined MIPS Processor in Verilog (Part-3)
31. Verilog vs VHDL: Explain by Examples
32. Verilog code for Clock divider on FPGA
33. How to generate a clock enable signal in Verilog
34. Verilog code for PWM Generator
35. Verilog coding vs Software Programming
36. Verilog code for Moore FSM Sequence Detector
37. Verilog code for 7-segment display controller on Basys 3 FPGA
-how do I change it so that it works 50MHz
ReplyDelete-Como hago que funione si mi clk es de 50MHz
It still works, but the PWM signal to be created has a frequency of 5MHz instead of 10MHz.
DeleteHi! I have an assignment for uni where I have to create a specific PWM signal. I tried replicating your code to get an idea of how the basics work. However, on my waveform the duty cycle stays on 5 for the whole run and therefore the PWM_out stays even. I then tried copying your code EXACTLY but still ended up with the same problem. I would attach a photo but can't seem to. Any idea on what might be wrong? I'm using ModelSim 6.5b if that makes a difference? Any advice would be great.
ReplyDeleteI guess you did not zoom fit to see the total waveform. Thus, it was only a fraction of the waveform at the beginning with the duty cycle of 5. You need to ZOOM FIT to see the whole waveform.
Deletehola buenas tardes..este proyecto es posible implementarlo en la placa basys 3??
ReplyDeletecan i make 20us pulse once a second,Using the pwm?
ReplyDelete