用VerilogHDL编写的可调占空比的PWM波形设计

既然是PWM,当然需要占空比可调,我选用的是CycloneII系列的FPGA,使用50MHz的时钟源。

开发板如下图:

通过开发板上的K2,K1键控制PWM的大小,具体是如何实现的呢?

系统采用50MHz的晶振作为时钟源,设定PWM的周期为1ms,也就是说计数器需要计数50000次,计数器一旦大于50000,自动清零,并重新进行下一轮的计数。

在这50000次计数中,可以设定n(0<=n<=50000),只要计数器值小于n(n=duty_cycle*sd),则令PWM输出为1,否则输出为0,这就是PWM占空比调节原理。

理想情况下,我们可以设定50000个级数用于调节PWM的占空比,但现实中没必要也不可能设置这么多的级数,所以根据需要,代码设置了五级,这样从0开始,每调一级(duty_cycle的值加1或减1),占空比增加20%,每一级的计数间隔为sd=10000。

代码实现:

 1 always@ (posedge clk or posedge key_ctrl[3]) begin
 2     if(key_ctrl[3]) counter <= 16'd0;          //计数器复位
 3     else 
 4     begin
 5     counter <= counter+1;
 6         if ( counter <= duty_cycle*sd )    //设置PWM为1的时间间隔
 7             PWM_out <= 1;
 8         else
 9             PWM_out <= 0;
10         if (counter >=50000)
11             counter <= 16'd0;
12     end
13 end

下面的问题就是怎么通过K2,K1控制duty_cycle大小的问题了。

在设计中曾试着通过两个always语句对duty_cycle赋值,其中一个是加,一个是减。结果是编译出错,原因是不能在并行块中对同一个变量进行赋值。

错误代码1:

 1 always @(posedge key_ctrl[1])begin 
 2     duty_cycle <= duty_cycle + 1'b1;
 3     if(duty_cycle >=5)
 4         duty_cycle <=5;  //
  • 5
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值