FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
登录
首页-技术文章/快讯-技术分享-正文

基于FPGA的PWM信号生成与占空比调节设计指南

二牛学FPGA二牛学FPGA
技术分享
6小时前
0
0
3

Quick Start 快速上手指南

本指南将引导您从零开始,在 FPGA 上实现一个频率固定、占空比可调的 PWM 信号发生器。整个流程约需 30 分钟(含工具安装时间)。

  1. 安装 Vivado 或 Quartus Prime 标准版(本文以 Vivado 2023.1 为例)。
  2. 新建 RTL 工程,选择目标器件(如 XC7A35T-1CSG324C)。
  3. 编写顶层模块,例化一个计数器与比较器,输出 PWM 信号。
  4. 添加约束文件(.xdc),将输出引脚连接到 LED 或示波器探头。
  5. 运行综合(Synthesis)与实现(Implementation)。
  6. 生成比特流(Bitstream)并下载到 FPGA 板卡。
  7. 观察 LED 亮度变化或示波器波形,验证占空比可调。
  8. 通过拨码开关或 UART 输入修改占空比参数,观察实时响应。

前置条件与环境

项目推荐值说明替代方案
器件 / 板卡Xilinx Artix-7 (XC7A35T) 或 Altera Cyclone IV主流入门级 FPGA,资源充足其他 7 系列 / MAX10 均可
EDA 版本Vivado 2023.1 或 Quartus Prime 20.1较新版本提供更好的综合优化Vivado 2018.3+ / Quartus 17.1+
仿真器Vivado Simulator 或 ModelSim支持波形调试与覆盖率分析Verilator, Icarus Verilog
时钟 / 复位50 MHz 板载时钟,低有效异步复位常用配置,时序易满足100 MHz / 高有效复位(需调整逻辑)
接口依赖JTAG 下载器(如 Digilent HS2)用于比特流下载与在线调试USB-Blaster / on-board JTAG
约束文件至少包含时钟周期约束与输出引脚分配确保时序收敛与正确映射可使用 Tcl 脚本自动生成
调试工具逻辑分析仪(ILA / SignalTap)或示波器验证波形质量与占空比精度板载 LED 做视觉验证

目标与验收标准

  • 功能点:生成频率 1 kHz、占空比 0%–100% 可调的 PWM 信号。
  • 性能指标占空比调节步进 ≤ 1%(分辨率 100 级),输出频率误差 < 5%。
  • 资源占用:LUT ≤ 32,FF ≤ 32,无需 DSP slice。
  • 验收方式:示波器测量 PWM 周期与高电平时间,与设定值偏差 < 5%。
  • 波形特征:上升/下降沿单调,无毛刺(占空比切换时无异常脉冲)。

实施步骤

工程结构

  • 顶层模块pwm_top.v – 例化计数器、比较器、输入接口。
  • 计数器模块pwm_counter.v – 实现周期计数器(0 到 PERIOD-1)。
  • 占空比输入duty_cycle.v – 从外部接口(拨码开关或 UART)读取并同步。
  • 输出寄存器pwm_out_reg – 在时钟上升沿输出比较结果。

关键模块实现

// pwm_counter.v
module pwm_counter #(
    parameter PERIOD = 50000 // 50 MHz / 1 kHz = 50000
)(
    input wire clk,
    input wire rst_n,
    output reg [15:0] cnt
);

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            cnt &lt;= 16'd0;
        else if (cnt == PERIOD - 1)
            cnt &lt;= 16'd0;
        else
            cnt &lt;= cnt + 1'b1;
    end

endmodule
// pwm_top.v
module pwm_top #(
    parameter PERIOD = 50000,
    parameter DUTY_WIDTH = 7  // 0-100 级占空比
)(
    input wire clk,
    input wire rst_n,
    input wire [DUTY_WIDTH-1:0] duty_set,  // 外部占空比设定值
    output reg pwm_out
);

    wire [15:0] cnt;
    reg [15:0] threshold;

    // 例化计数器
    pwm_counter #(.PERIOD(PERIOD)) u_counter (
        .clk(clk),
        .rst_n(rst_n),
        .cnt(cnt)
    );

    // 将 duty_set 映射到阈值(0 ~ PERIOD-1)
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            threshold &lt;= 16'd0;
        else
            threshold &lt;= (duty_set * (PERIOD - 1)) / 100;
    end

    // 比较输出
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            pwm_out &lt;= 1'b0;
        else
            pwm_out &lt;= (cnt &lt; threshold) ? 1'b1 : 1'b0;
    end

endmodule

约束文件示例(pwm_top.xdc)

# 时钟约束
create_clock -period 20.000 -name sys_clk [get_ports clk]

# 输出引脚分配
set_property PACKAGE_PIN R2 [get_ports pwm_out]
set_property IOSTANDARD LVCMOS33 [get_ports pwm_out]

# 输入引脚(拨码开关示例)
set_property PACKAGE_PIN T1 [get_ports duty_set[0]]
set_property IOSTANDARD LVCMOS33 [get_ports duty_set[0]]

综合与实现

在 Vivado 中依次点击 Run SynthesisRun Implementation。若出现时序违例,检查时钟约束是否正确,或降低时钟频率。综合完成后,查看资源报告确认 LUT/FF 占用符合预期。

生成比特流与下载

点击 Generate Bitstream,完成后使用 Open Hardware Manager 连接 FPGA 板卡,选择比特流文件并下载。

验证结果

下载成功后,用示波器测量 PWM 输出引脚:

  • 频率应为 1 kHz ± 5%(即周期 1 ms ± 50 µs)。
  • 改变 duty_set 值(例如从 0 到 100),高电平时间应线性变化。
  • 在占空比切换瞬间,波形不应出现毛刺或异常脉冲。

若使用 LED 验证,占空比从 0% 逐渐增大时,LED 亮度应平滑变亮。

排障指南

  • 问题:输出无信号 – 检查时钟是否正常、复位是否释放、约束文件中的引脚分配是否正确。
  • 问题:频率偏差大 – 确认 PERIOD 参数计算正确(PERIOD = 时钟频率 / 目标频率)。
  • 问题:占空比调节不连续 – 检查 duty_set 输入是否同步到时钟域,避免亚稳态。
  • 问题:综合后资源超限 – 优化计数器位宽,或使用更小的 PERIOD 值。

扩展与进阶

  • 多通道 PWM:例化多个比较器,每个通道独立占空比,共享同一计数器。
  • 动态频率切换:将 PERIOD 设为可编程寄存器,实现变频 PWM。
  • 死区插入:在互补 PWM 输出中插入死区时间,防止桥臂直通。
  • 与微处理器集成:通过 AXI-Lite 接口将 PWM 寄存器映射到 CPU 地址空间,实现软件控制。

参考与附录

  • Vivado Design Suite User Guide: Synthesis (UG901)
  • Xilinx 7 Series FPGA Libraries Guide (UG953)
  • Altera Quartus Prime Handbook Volume 1: Design and Synthesis
  • 附录 A:完整工程源码(含仿真 Testbench)可在成电国芯 FPGA 云课堂资源库下载。

通过本指南,您已掌握 FPGA 上 PWM 信号生成的核心原理与实现方法。后续可根据实际需求灵活扩展功能。

标签:
本文原创,作者:二牛学FPGA,其版权均为FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训所有。
如需转载,请注明出处:https://z.shaonianxue.cn/37363.html
二牛学FPGA

二牛学FPGA

初级工程师
这家伙真懒,几个字都不愿写!
59917.51W3.93W3.67W
分享:
成电国芯FPGA赛事课即将上线
FPGA 状态机编码方式对比:二进制、格雷码与独热码设计与选择指南
FPGA 状态机编码方式对比:二进制、格雷码与独热码设计与选择指南上一篇
Vivado中综合与实现策略:时序优化与资源平衡下一篇
Vivado中综合与实现策略:时序优化与资源平衡
相关文章
总数:646
Verilog编码风格:可综合代码的书写规范与陷阱规避

Verilog编码风格:可综合代码的书写规范与陷阱规避

本文档旨在为FPGA开发者提供一套清晰、可执行的可综合Verilog编码…
技术分享
14天前
0
0
126
0
基于FPGA的频率计设计

基于FPGA的频率计设计

频率计是一种专门对被测信号频率进行测量的电子测量仪器。本实验是基于FPG…
技术分享, 行业资讯
3年前
0
0
908
0
FPGA开发中Vivado与ModelSim联合仿真的高效配置方法

FPGA开发中Vivado与ModelSim联合仿真的高效配置方法

在FPGA开发流程中,功能仿真是验证设计逻辑正确性的关键环节。Vivad…
技术分享
6天前
0
0
54
0
评论表单游客 您好,欢迎参与讨论。
加载中…
评论列表
总数:0
FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
没有相关内容