一.PWM的制作原理
假如我们有一个锯齿波,然后在锯齿波上设置一个阈值(黑色水平虚线),凡是大于该阈值时输出均为高电平,反之则为低电平,这样我们是不是就得到一个PWM信号呢?如果我们想调整它的占空比,那么调节阈值的高低就可以了。
二. FPGA设计框图
把上面的描述再抽象化一下,就可以画出的模块框图。锯齿波实际上就可以用计数器生成,阈值就是一个数值而已,比较器是用来生成最后输出高低电平用的。
三.代码实现
设置的计数器位宽是8位,也就是每128次后自动重新计数。所以,该计数器的最大频率也就是12MHz/128=93.75KHz。上图可以看出,PWM信号的频率和计数器的频率相同,因此也是93.78KHz。
module pwm (PWM_out, clk, reset);input clk, reset;output reg PWM_out;wire [7:0] counter_out; //计数器的8位宽储存,可以最多数128次时钟的嘀嗒parameter PWM_ontime = 32; //阈值设在32,对应25%的占空比always @ (posedge clk) begin //比较器if (PWM_ontime > counter_out)PWM_out <= 0;elsePWM_out <= 1;endcounter counter_inst( //调用计数器.clk (clk),.counter_out (counter_out),.reset(reset));
endmodulemodule counter(counter_out,clk,reset); //计数器模块代码output [7:0] counter_out; input clk, reset;reg [7:0] counter_out;always @(posedge clk)if (reset) //如果没有按reset,则计数器清零counter_out <= 8'b0;else //如果按下reset,则计数器开始计数counter_out <= counter_out + 1;
endmodule