// 等脉宽pwm波。用pwm_dat控制占空比
module IntermediateFrequencyWeld(
clk,rst_n,
PWM_dat,
IGBT_1,IGBT_2
);
input clk; //50MHz
input rst_n; //低电平复位信号
input[3:0] PWM_dat;
output IGBT_1,IGBT_2;
//---------------------------------------------------
//reg[14:0] cnt; //分频计数器 1.6k
reg[3:0] cnt;
reg us600_r;
always @ (posedge clk or negedge rst_n) //异步复位
if(!rst_n) cnt <= 4'd0;
else cnt = cnt+1'b1; //寄存器cnt 0.6ms循环计数
//--------------------------------------------------------
reg t1;
always @ (posedge clk or negedge rst_n) //异步复位
if(!rst_n) t1 <= 1'b0;
else if (cnt == 4'b1110) t1 <= 1'b1;
reg[3:0] pwm_r;
always @(posedge clk or negedge rst_n)
if (!rst_n) pwm_r <= 1'b0;
else if (t1) pwm_r <= PWM_dat; //在每个周期的开始,才将变化的值采集进来,不然可能出现尖峰杂波。
//----------------------------------------------------------------------------
always @ (negedge clk or negedge rst_n) //比较时用下降延,防止出现竞争。让clk在上升沿把cnt数值稳定后,再用来与pwm_r进行比较。
if (!rst_n) us600_r<= 1'b0;
else if(pwm_r > cnt) us600_r <= 1'b1; //
else us600_r <= 1'b0;
//----------------------------------------------------
assign IGBT_1 = us600_r;
assign IGBT_2 = ~us600_r;
endmodule
文章评论(0条评论)
登录后参与讨论