既然是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; //