基于FPGA的数字电路(PWM脉宽调制)

一.PWM的制作原理

        假如我们有一个锯齿波,然后在锯齿波上设置一个阈值(黑色水平虚线),凡是大于该阈值时输出均为高电平,反之则为低电平,这样我们是不是就得到一个PWM信号呢?如果我们想调整它的占空比,那么调节阈值的高低就可以了。

基于FPGA的数字电路(PWM脉宽调制)_第1张图片

二. FPGA设计框图

        把上面的描述再抽象化一下,就可以画出的模块框图。锯齿波实际上就可以用计数器生成,阈值就是一个数值而已,比较器是用来生成最后输出高低电平用的。

基于FPGA的数字电路(PWM脉宽调制)_第2张图片

三.代码实现

        设置的计数器位宽是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;
       else
         PWM_out <= 1;
  end
  
  counter counter_inst(      //调用计数器
        .clk (clk),
        .counter_out (counter_out),
        .reset(reset)
  );
endmodule

module 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

你可能感兴趣的:(fpga开发,单片机,网络,信息与通信,面试)