FPGA 板上基于 Simulink 与 ModelSim 联合仿真验证的 Buck 闭环设计及调试
在数字电源开发中,将控制算法从仿真环境移植到 FPGA 往往伴随着较高的试错成本。若能在设计阶段完成软硬件联合仿真,可大幅缩短研发周期。本方案采用 Simulink 搭建主电路,Verilog 实现控制回路(含 DPWM 及 PI 补偿器),适用于基于 FPGA 的电力电子变换器控制验证。
设计指标
- 输入电压:额定 20V,范围 15V~25V
- 输出电压:> 10V
- 开关频率:50kHz
- 输出功率:100W
- 占空比范围:0.1~0.6
- 额定输出电流:10A
主电路搭建
Simulink 中构建 Buck 拓扑,包含输入电容、MOS 管桥臂及 LC 滤波网络。实际硬件中不存在理想开关,需加入死区保护。建议使用 Transport Delay 模块模拟驱动信号传播延时,参数依据 FPGA 时钟周期设定。例如 50MHz 时钟下,3 个周期的死区时间计算如下:
% 死区时间计算(假设 FPGA 时钟 50MHz)
deadtime = 3*(1/50e6);
set_param('buck_model/MOS_driver','DelayTime',num2str(deadtime));
控制回路设计
控制核心由 Verilog 实现,重点在于 DPWM 精度与 PI 抗饱和处理。
DPWM 模块
采用寄存器渐近式生成法(Σ-Δ调制),相比传统计数器方案,谐波特性更优。利用累加器溢出自动生成等效占空比:
module DPWM (
input clk,
input [15:0] duty,
output reg pwm
);
reg [15:0] acc_reg;
always @(posedge clk) begin
acc_reg <= acc_reg[15:0] + duty;
pwm <= (acc_reg < duty); // 妙用溢出特性
end
endmodule
PI 补偿器
定点数处理需注意 q 格式。使用右移替代除法以节省资源并防止溢出。积分项单独分配高位寄存器,输出限幅时锁定积分器以避免饱和:
reg signed [17:0] integral; // Q3.15 格式
always @(posedge clk) begin
if(!sat_flag) begin
integral <= integral + (error * Ki) >>> 8;
end
output <= (error * Kp) + integral[17:2];
end
联合仿真配置
在 Simulink 中使用 HDL Cosimulation 模块连接 ModelSim。关键设置是将仿真步长设为开关周期的 1/10 以下(建议 200ns)。启动后,两个软件将自动交换数据,实现实时对打。
调试与验证
调试初期建议断开电压环,单独测试 DPWM 波形。曾遇到占空比无法达到 0.6 的问题,排查发现是 Verilog 中 duty 寄存器位宽不足导致溢出回零。务必在 testbench 中加入边界值测试:
initial begin
duty = 16'h6666; // 0.6 对应 Q16 值
#100ms;
duty = 16'h0000;
#100ms;
$stop;
end
按此流程实施,从仿真到 FPGA 实测的电压调整率误差可控制在 0.8% 以内。实测显示,输入电压在 15V-25V 跳变时,输出电压纹波小于 50mV,动态响应时间仅 3 个开关周期。该方法适合需要快速迭代的数字电源项目,特别是复杂拓扑应用。


