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

基于Verilog的PWM波形发生器设计指南与实现

二牛学FPGA二牛学FPGA
技术分享
4小时前
0
0
1

Quick Start(快速上手)

  1. 安装 Vivado 2019.2 或更高版本,并确认已添加 Xilinx 器件库(如 Artix-7)。
  2. 创建一个新的 Vivado 项目,选择器件 xc7a35tcsg324-1(或目标板卡对应型号)。
  3. 在项目中添加 Verilog 源文件,命名为 pwm_generator.v
  4. 编写 PWM 模块代码,包含参数化占空比和频率的接口(详见实施步骤)。
  5. 编写一个简单的 testbench 文件,实例化 PWM 模块并施加时钟与复位激励。
  6. 运行行为仿真(Simulation),观察 pwm_out 波形:应看到周期固定的方波,高电平宽度随占空比参数变化。
  7. 为模块添加顶层约束(时钟周期 10 ns,引脚分配至 LED 或 GPIO),综合并实现。
  8. 生成比特流并下载到 FPGA 板卡,用示波器或逻辑分析仪观察 PWM 输出,或观察 LED 亮度变化(若驱动 LED)。

前置条件与环境

项目推荐值说明/替代方案
器件/板卡Xilinx Artix-7 (xc7a35tcsg324-1) 或 Zynq-7000 系列Altera Cyclone IV / V;Lattice iCE40
EDA 版本Vivado 2019.2 / 2020.1Quartus Prime 18.0+;Lattice Diamond
仿真器Vivado Simulator (xsim)ModelSim / Questa / Verilator
时钟/复位板载 100 MHz 时钟,低电平有效复位50 MHz 晶振;高电平复位需修改逻辑
接口依赖至少一个 GPIO 输出(如 LED)PMOD 扩展口;示波器探头
约束文件XDC 约束:时钟周期 10 ns,引脚分配SDC 约束(Altera)

目标与验收标准

完成本工程后,应达到以下可验证结果:

  • 功能点:PWM 输出波形周期可配置(通过参数 PERIOD_CYCLES 设置),占空比可通过输入端口 duty_cycle 动态调整(0~255 对应 0%~100%)。
  • 性能指标:最大工作频率 ≥ 100 MHz(基于 Artix-7 速度等级 -1)。
  • 资源占用:不超过 32 个 Slice、1 个 BRAM(可选)。
  • 验收方式:行为仿真中 pwm_out 波形占空比与 duty_cycle 输入一致;上板后 LED 亮度随 duty_cycle 变化,或示波器测量占空比误差 < 1%。

实施步骤

工程结构

建议采用以下目录结构:

pwm_project/
├── src/
│   └── pwm_generator.v
├── sim/
│   └── tb_pwm.v
├── constr/
│   └── top.xdc
└── vivado_project/   (Vivado 项目文件)

关键模块:pwm_generator.v

核心代码片段如下,注意参数化设计:

module pwm_generator #(
    parameter PERIOD_CYCLES = 1000,  // 计数器周期(决定 PWM 频率)
    parameter DUTY_WIDTH   = 8      // 占空比输入位宽
)(
    input  wire                  clk,
    input  wire                  rst_n,
    input  wire [DUTY_WIDTH-1:0] duty_cycle,  // 0 ~ 2^DUTY_WIDTH-1
    output reg                   pwm_out
);

reg [31:0] counter;
reg [31:0] threshold;

// 计算阈值:threshold = (duty_cycle * PERIOD_CYCLES) / (2^DUTY_WIDTH)
always @(*) begin
    threshold = (duty_cycle * PERIOD_CYCLES) &gt;&gt; DUTY_WIDTH;
end

always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        counter &lt;= 0;
        pwm_out &lt;= 0;
    end else begin
        if (counter &gt;= PERIOD_CYCLES - 1)
            counter &lt;= 0;
        else
            counter &lt;= counter + 1;

        if (counter &lt; threshold)
            pwm_out &lt;= 1;
        else
            pwm_out &lt;= 0;
    end
end

endmodule

设计要点

  • 参数化设计:通过 PERIOD_CYCLESDUTY_WIDTH 两个参数,可灵活调整 PWM 频率与占空比分辨率。例如,PERIOD_CYCLES = 1000 且时钟 100 MHz 时,PWM 频率为 100 kHz。
  • 阈值计算:使用移位操作代替除法,节省资源并提升时序性能。注意 DUTY_WIDTH 应保证移位不溢出。
  • 计数器清零:当 counter 达到 PERIOD_CYCLES - 1 时归零,确保周期准确。
  • 输出逻辑:当 counter < threshold 时输出高电平,否则低电平,实现占空比控制。

仿真验证(tb_pwm.v)

编写 testbench 文件,实例化 PWM 模块,施加 100 MHz 时钟与复位,并依次设置 duty_cycle 为 64、128、192,观察输出波形。关键检查点:

  • 复位后 pwm_out 为低电平。
  • 每个周期内高电平宽度与 duty_cycle 比例一致(例如 duty_cycle=128 时占空比约 50%)。
  • 改变 duty_cycle 后,下一周期立即生效。

约束与综合

创建 top.xdc 约束文件,内容示例:

create_clock -period 10.000 [get_ports clk]
set_property PACKAGE_PIN W5 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property PACKAGE_PIN U16 [get_ports pwm_out]  # 连接至 LED 或 GPIO
set_property IOSTANDARD LVCMOS33 [get_ports pwm_out]

运行综合(Synthesis)与实现(Implementation),检查时序报告,确保建立时间满足要求(通常 slack > 0)。

验证结果

完成实现后,生成比特流并下载至 FPGA。验证方法:

  • 仿真验证:运行行为仿真,截图保存波形,标注占空比与理论值对比。
  • 上板验证:将 pwm_out 连接至 LED,观察亮度随 duty_cycle 变化;或用示波器测量占空比,误差应 < 1%。

排障指南

  • 仿真无输出:检查时钟与复位信号是否正常;确认 duty_cycle 输入不为 0。
  • 综合时序违规:降低 PERIOD_CYCLES 或增加流水线级数;检查时钟约束是否正确。
  • 上板后 LED 常亮或常灭:检查引脚分配与约束文件;用示波器测量实际波形。
  • 占空比误差大:确认 DUTY_WIDTHPERIOD_CYCLES 匹配;避免阈值计算溢出。

扩展应用

  • 多通道 PWM:例化多个模块,每个通道独立控制占空比,用于 RGB LED 或电机控制。
  • 频率动态调整:将 PERIOD_CYCLES 改为输入端口,实现运行时变频。
  • 死区插入:在互补 PWM 输出中加入死区时间,适用于 H 桥驱动。
  • 高精度 PWM:使用 Xilinx 原语(如 OSERDES)实现更高分辨率。

参考与附录

  • Xilinx UG901:Vivado Design Suite 用户指南(综合与实现)
  • Xilinx UG949:Vivado Design Suite 用户指南(约束与时序)
  • Verilog IEEE 1364-2001 标准文档
  • 附录 A:完整 testbench 代码示例(略)
  • 附录 B:不同器件下的约束文件模板(略)
标签:
本文原创,作者:二牛学FPGA,其版权均为FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训所有。
如需转载,请注明出处:https://z.shaonianxue.cn/38127.html
二牛学FPGA

二牛学FPGA

初级工程师
这家伙真懒,几个字都不愿写!
72517.69W3.94W3.67W
分享:
成电国芯FPGA赛事课即将上线
2026年FPGA学习路线:从开发板到AI加速器的实践指南
2026年FPGA学习路线:从开发板到AI加速器的实践指南上一篇
VHDL与Verilog对比:硬件描述语言入门选择指南下一篇
VHDL与Verilog对比:硬件描述语言入门选择指南
相关文章
总数:744
FPGA实战:手把手教你设计高效FIR滤波器

FPGA实战:手把手教你设计高效FIR滤波器

在数字信号处理(DSP)的世界里,滤波器就像一位聪明的“信号化妆师”,能…
技术分享
1个月前
0
0
61
0
基于Verilog的5级流水线简易RISC CPU设计实现指南

基于Verilog的5级流水线简易RISC CPU设计实现指南

本文档旨在提供一份完整的实践指南,指导读者完成一个基于Verilog的5…
技术分享
6天前
0
0
18
0
2026年,FPGA算法加速工程师:如何成为芯片界的“炼金术士”?

2026年,FPGA算法加速工程师:如何成为芯片界的“炼金术士”?

嘿,朋友!你有没有发现,身边的一切都在加速“变聪明”?从手机里流畅的AI…
技术分享
18天前
0
0
101
0
评论表单游客 您好,欢迎参与讨论。
加载中…
评论列表
总数:0
FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
没有相关内容