PWM发生器(VHDL)

逻辑主页

代码下载

版本2.0: pwm.vhd (5.1 KB)
占空比切换始终从脉冲中心开始,避免脉冲波形异常

版本1.0: pwm_v1_0.vhd (4.5 KB)
Initial Public Release
首次公开发布

特性

  • PWM发生器组件的VHDL源代码
  • 可配置的占空比分辨率
  • 可配置的输出数量/相位
  • 可配置的PWM频率
  • 基于脉冲中心的调制
  • PWM反相输出

简介

本文详述了用于CPLD和FPGA的脉宽调制(PWM)发生器组件,采用VHDL编写。该组件根据用户逻辑设置的占空比输出PWM信号。每个脉冲的中心点与PWM频率同步,脉冲宽度围绕中心点变化。若设置为多相位模式,组件会为每个相位生成均匀间隔的PWM信号。例如,当设置为三相时,会生成三个彼此相差120°的PWM输出。本组件使用Quartus II 12.1版本设计,并通过ModelSim-Altera 10.1b测试。资源需求取决于具体实现方案。图1展示了PWM发生器在系统中的典型集成示例。

1. 实现示例

工作原理

系统时钟除以PWM频率等于一个PWM周期内的系统时钟脉冲数。计数器为每个相位定义此PWM周期。每个PWM相位对应一个计数器,其值根据相位偏移。每个计数器在每个系统时钟上升沿递增,并在达到周期末尾时清零。

占空比决定了PWM信号上升沿和下降沿在周期内出现的位置。图2展示了确定这些位置的基本原理。信号下降沿出现在½占空比处,上升沿则出现在周期结束前½占空比处。当计数器到达这些位置时,PWM信号会相应切换。由于半占空比永远不会超过半周期,下降沿始终先于上升沿出现。

2. 与PWM周期同相的脉冲波形

可配置参数

PWM发生器通过ENTITY中设置的四个GENERIC参数进行配置。表1列出了这些参数。只要用户将sys_clk参数设置为提供的时钟频率,PWM发生器就不需要特定输入时钟。参数pwm_freq对应PWM频率。bits_resolution­决定脉冲宽度的分辨率。例如,值为8时可提供8位分辨率。因此脉冲宽度分辨率为2⁸即256,此时最小脉冲宽度调整量为周期(即1/pwm_freq)除以256。参数phases设置输出数量及其相互关系。PWM输出数量等于phases值,这些输出彼此间相位差为360°/phases

1. 通用参数

由于PWM周期以系统时钟数定义为sys_clk/pwm_freq,该比率也会影响占空比分辨率。若占空比分辨率超过PWM周期内的系统时钟数,则无法实现该分辨率。同理,若周期不是分辨率的整数倍,实际占空比会受到单比特舍入误差的影响。

端口描述

表2描述了PWM发生器的端口。


2. 端口描述

占空比控制

用户逻辑可通过在duty端口锁存新的占空比值来控制占空比。当ena端口设为’1’时,PWM发生器会在每个系统时钟沿锁存该端口的值。图3展示了ModelSim仿真中改变占空比的过程。请注意,在改变占空比时,原始脉宽与新脉宽之间会有一个中间宽度的脉冲。这是因为新占空比在脉冲中心位置生效,因此该脉冲宽度为旧脉宽的一半与新脉宽的一半之和。

3. 占空比变化仿真

复位

reset_n输入端口必须保持逻辑高电平才能使PWM发生器组件正常工作。该端口的低电平会异步复位组件。复位期间,组件会清除周期计数器,并将PWM输出和PWM反相输出都置为’0’。

结论

本PWM发生器是可编程逻辑组件,可产生PWM及其反相输出。系统时钟、PWM频率、占空比分辨率和相位数均可配置。通过用户逻辑接口可控制PWM占空比。