用于PWM发生器的Verilog代码

这个 Verilog项目 提供了具有可变占空比的PWM发生器的Verilog代码。 上次,我介绍了用于PWM发生器的VHDL代码。

Verilog 脉宽调制 (脉冲宽度调制)发生器产生具有可变占空比的10MHz 脉宽调制 信号。两个防抖按钮用于控制PWM信号的占空比。第一个按钮是将占空比提高10%,另一个按钮是将占空比降低10%。 

用于PWM发生器的Verilog代码

的Verilog代码 脉宽调制 发生器 占空比可变:

// hzgifts.cn: FPGA项目, Verilog项目s, VHDL projects 
// Verilog项目: 用于PWM发生器的Verilog代码 with variable Duty Cycle
// Two debounced buttons are used to control the duty cycle (step size: 10%)
module 脉宽调制 _Generator_Verilog
 (
 clk, // 100MHz clock input 
 increase_duty, // input to increase 10% duty cycle 
 decrease_duty, // input to decrease 10% duty cycle 
 脉宽调制 _OUT // 10MHz 脉宽调制  output signal 
    );
 input clk;
 input increase_duty;
 input decrease_duty;
 output 脉宽调制 _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 脉宽调制  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 脉宽调制 _DFF1(clk,slow_clk_enable,increase_duty,tmp1);
 DFF_PWM 脉宽调制 _DFF2(clk,slow_clk_enable,tmp1, tmp2); 
 assign duty_inc =  tmp1 & (~ tmp2) & slow_clk_enable;
 // debouncing FFs for decreasing button
 DFF_PWM 脉宽调制 _DFF3(clk,slow_clk_enable,decrease_duty, tmp3);
 DFF_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 脉宽调制  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 脉宽调制 _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 

用于PWM发生器的Verilog Testbench代码:

`timescale 1ns / 1ps
// hzgifts.cn: FPGA项目, Verilog项目s, VHDL projects 
// Verilog项目: Verilog testbench code for 脉宽调制  Generator with variable duty cycle 
module tb_PWM_Generator_Verilog;
 // Inputs
 reg clk;
 reg increase_duty;
 reg decrease_duty;
 // Outputs
 wire 脉宽调制 _OUT;
 // Instantiate the 脉宽调制  Generator with variable duty cycle in Verilog
 脉宽调制 _Generator_Verilog 脉宽调制 _Generator_Unit(
  .clk(clk), 
  .increase_duty(increase_duty), 
  .decrease_duty(decrease_duty), 
  .脉宽调制 _OUT(脉宽调制 _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

VHDL中PWM发生器的仿真波形:

用于PWM发生器的Verilog代码
推荐的 Verilog projects:
2. FIFO存储器的Verilog代码
3. 用于16位单周期MIPS处理器的Verilog代码
4. Verilog HDL中的可编程数字延迟计时器
5. 用于数字电路中基本逻辑组件的Verilog代码
6. 用于32位无符号除法器的Verilog代码
7. 用于定点矩阵乘法的Verilog代码
8. Verilog HDL中的车牌许可证识别
9. 提前进位乘法器的Verilog代码
10。 微处理器的Verilog代码
11。 4x4乘法器的Verilog代码
12 停车场系统的Verilog代码
13 使用Verilog HDL在FPGA上进行图像处理
14。 如何使用Verilog HDL将文本文件加载到FPGA中
15 交通信号灯控制器的Verilog代码
16。 FPGA上的闹钟的Verilog代码
17。 比较器设计的Verilog代码
18岁 D触发器的Verilog代码
19 Full Adder的Verilog代码
20 带testbench的计数器的Verilog代码
21 16位RISC处理器的Verilog代码
22 用于在FPGA上反跳按钮的Verilog代码
23。 如何为双向/输入端口编写Verilog Testbench
30岁  Verilog中的N位加法器设计
31。 Verilog和VHDL:通过示例解释
32。 FPGA上时钟分频器的Verilog代码
33。 如何在Verilog中生成时钟使能信号
34。 用于PWM发生器的Verilog代码
35岁 Verilog编码与软件编程
36。 Moore FSM序列检测器的Verilog代码
37。 Basys 3 FPGA上的7段显示控制器的Verilog代码
FPGA Verilog VHDL课程

6条评论:

  1. -如何更改它以使其工作在50MHz
    -Como hago que funione si clk es de 50MHz

    回复删除
    回覆
    1. 它仍然有效,但是要创建的PWM信号的频率为5MHz,而不是10MHz。

      删除
  2. 嗨!我为uni分配了一个作业,其中我必须创建一个特定的PWM信号。我尝试复制您的代码以了解基本原理。但是,在我的波形上,占空比在整个运行期间都保持为5,因此PWM_out保持均匀。然后,我尝试完全复制您的代码,但仍然遇到相同的问题。我会附上照片,但可以'似乎。有什么问题的想法吗?一世'm使用ModelSim 6.5b是否有所作为?任何建议都很好。

    回复删除
    回覆
    1. 我想您没有缩放适合才能看到总波形。因此,从占空比5开始,它只是波形的一小部分。您需要缩放FIT才能看到整个波形。

      删除
  3. hola buenas tardes..este proyecto es posible Implementarlo en la placa basys 3 ??

    回复删除
  4. 我可以使用pwm每秒发出20us脉冲一次吗?

    回复删除

热门FPGA项目