实现8位PWM控制器,可调占空比(0-255)和预分频,精确控制输出占空比。
PWM控制器结构:
clk → 预分频器 → 8位计数器
│
counter < duty ?
↓是 ↓否
pwm=1 pwm=0
占空比 = duty / 256
PWM频率 = fclk / (256 x (prescale+1))// PWM Controller - 脉冲宽度调制控制器
// 可调占空比和频率,8位分辨率
module pwm_controller(
input wire clk,
input wire rst,
input wire [7:0] duty, // 占空比 0-255 (0=0%, 255=100%)
input wire [15:0] prescale, // 预分频值
output reg pwm_out,
output reg [7:0] counter_val
);
reg [15:0] prescale_cnt;
reg [7:0] counter;
always @(posedge clk or posedge rst) begin
if (rst) begin
pwm_out <= 1'b0;
counter <= 8'd0;
prescale_cnt<= 16'd0;
counter_val <= 8'd0;
end else begin
if (prescale_cnt >= prescale) begin
prescale_cnt <= 16'd0;
if (counter == 8'd255) begin
counter <= 8'd0;
end else begin
counter <= counter + 8'd1;
end
// PWM output: high when counter < duty
if (counter < duty)
pwm_out <= 1'b1;
else
pwm_out <= 1'b0;
counter_val <= counter;
end else begin
prescale_cnt <= prescale_cnt + 16'd1;
end
end
end
endmodule
测试4组占空比:duty=128→50.0%(128/256), duty=64→25.0%(64/256), duty=0→0%, duty=255→99.6%(255/256)。占空比精确到1/256。
本实验所有Verilog代码已通过Verilator编译验证,功能行为正确。测试用例覆盖核心功能路径,确保设计满足规格要求。
PWM在电机驱动(BLDC/步进)、LED调光、电源管理(DC-DC)、音频(D类功放)中无处不在。2024年STM32的TIM外设提供16位PWM+死区+中心对齐模式。Raspberry Pi Pico的PIO可编程生成任意PWM波形。
尝试修改代码中的关键参数,观察仿真结果变化:
💡 Verilator会在位宽不匹配时给出Warning,这是学习的好机会
在现有基础上增加新功能:
🔧 增量开发:每次只改一个地方,验证通过后再改下一个
| 语法 | 说明 | 示例 |
|---|---|---|
reg [7:0] | 8位寄存器 | reg [7:0] data; |
wire | 组合逻辑连线 | wire valid = cnt > 5; |
always @(posedge clk) | 时序逻辑 | 上升沿触发 |
always @(*) | 组合逻辑 | 敏感列表自动推导 |
localparam | 局部常量 | localparam DIV = 50000000; |
case | 多分支选择 | 注意default分支 |
$display | 仿真打印 | 不可综合,仅仿真用 |
本设计在典型FPGA上的资源占用估算:LUT约20-120个,FF约30-100个,无BRAM/DSP依赖(特殊模块除外)。时钟频率可达50-100MHz+。Verilator仿真速度约5-10M周期/秒。