[verilog] 如何实现上下管pwm互锁???

[复制链接]
512|9
 楼主 | 2018-2-2 17:56 | 显示全部楼层 |阅读模式
请教大家一个问题,如何实现igbt上下管的pwm互锁,防止上下管同时出现高电平而导通。要求:上管PWMA=1的时候,下管失效PWMB=0;下管PWMB=1的时候,上管失效PWMA=0。用门极或锁存电路实现,因为我最后要用Verilog来写程序。
正常情况下或者在cpld里面分频后是互补的pwm波,加上死区就可以用了。但是如果是外来pwm的情况,为了防止出现同时为高,需要做一个这样的处理。
我自己写了的如下:

  1. //pwm_up_in pwm_dw_in互锁输出
  2. always @(posedge clk)
  3.         if(rst)
  4.                 pwm_up <= 1'b0;
  5.         else
  6.                 if(pwm_up_in && pwm_dw)
  7.                         pwm_up <= 1'b0;                                                                                                        //
  8.                 else
  9.                         pwm_up <= pwm_up_in;
  10.                
  11. always @(posedge clk)
  12.         if(rst)
  13.                 pwm_dw <= 1'b0;                                                                                                                //
  14.         else
  15.                 if(pwm_dw_in && pwm_up)
  16.                         pwm_dw <= 1'b0;                                                                                                        //
  17.                 else
  18.                         pwm_dw <= pwm_dw_in;
复制代码
这段代码出现的问题是,在复位时刻pwm_up,pwm_dw都是为0的,程序会进入全1或全0的循环当中。
我也画了这个图,不知道可不可以?


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主 | 2018-2-2 17:57 | 显示全部楼层
21ic改版了吗?怎么帖子变成对话框的形式了
| 2018-2-2 20:33 | 显示全部楼层
b_out <= a & ~a_in这也是语言
| 2018-2-2 20:35 | 显示全部楼层
b_in&手抖写错了
| 2018-2-3 11:32 | 显示全部楼层
应当使用R-S触发器.
 楼主 | 2018-2-6 11:26 | 显示全部楼层
最后想到这样行不行
  1. //pwm_up_in pwm_dw_in互锁输出
  2. always @(posedge clk or posedge rst or posedge pwm_dw)
  3.         if(rst)
  4.                 pwm_up <= 1'b0;                                                                                                               
  5.         else
  6.                 if(pwm_dw)
  7.                         pwm_up <= 1'b0;                                                                                                        //异步触发,当dw为1时,up恒为0
  8.                 else
  9.                         pwm_up <= pwm_up_in;                                                                                                //当dw为0时,up无限制

  10. always @(posedge clk or posedge rst or posedge pwm_up)
  11.         if(rst)
  12.                 pwm_dw <= 1'b1;                                                                                                                //复位时dw锁定,防止出现up_in=dw_in=1
  13.         else
  14.                 if(pwm_up)
  15.                         pwm_dw <= 1'b0;                                                                                                        //异步触发,当up为1时,dw恒为0
  16.                 else
  17.                         pwm_dw <= pwm_dw_in;                                                                                                //当up为0时,dw无限制
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主 | 2018-2-6 11:31 | 显示全部楼层
本帖最后由 hmf1235789 于 2018-2-6 11:33 编辑

用两个d触发器进行互锁,其中一路在变成1之前监测另一路的输出,如果另一路输出为1,则本路强制输出0;如果另一路输出为0,则本路=输入变化。另一路也做相同的判断。这样在任意时刻都只有一路为1,但是如果是在复位时刻, pwm_up和pwm_dw都会被清为0,然后寄存器保持,如果复位后两路pwm_in=1,则会出现误判,所以只要将其中一路 pwm_dw <= 1'b1; 就可以避免复位导致同时为0。另外d触发器用异步清零和置位。
| 2018-2-6 13:35 | 显示全部楼层
这个问题还没有解决?
首先rst在设计中无用,可删除。
其次,如果所云上下管没有优先级的话,那么我们就定义一个优先级切换的变量u_d
u_d在上管输入upIn为1下管输入dwIn为0被置1,否则在upIn==0且dwIn==1时被清零,其他情况(包括同时为0和同时为1)保持不变。
pwm_up和pwm_dw在时序上和u_d对齐,
那么up_out在u_d==1时输出为pwm_up,否则在u_d==0时受pwm_dw影响,代码如下
module blank(
input clk,
input up_in, dw_in,
output up_out, dw_out
);
reg upIn,dwIn,pwm_up, pwm_dw, u_d;
wire[1:0]  updw = {upIn, dwIn};
always @(posedge clk)begin
upIn <= up_in;
dwIn <= dw_in;
if(updw===2'b10) u_d <= 1;
else if(updw===2'b01) u_d <= 0;
pwm_up <= upIn;
pwm_dw <= dwIn;
end
assign up_out = pwm_up & ~(~u_d & pwm_dw);
assign dw_out = pwm_dw & ~(u_d & pwm_up);
endmodule
 楼主 | 2018-2-24 11:02 | 显示全部楼层
本帖最后由 hmf1235789 于 2018-2-24 11:11 编辑
ucx 发表于 2018-2-6 13:35
这个问题还没有解决?
首先rst在设计中无用,可删除。
其次,如果所云上下管没有优先级的话,那么我们就定 ...

非常感谢提供的另一种方法,你的方法如下:
  1. module blank(
  2. input clk,
  3. input up_in, dw_in,
  4. output up_out, dw_out
  5. );

  6. reg upIn,dwIn,pwm_up, pwm_dw, u_d;

  7. wire[1:0]  updw = {upIn, dwIn};

  8. always @(posedge clk)
  9.         begin
  10.         upIn <= up_in;                //保存输入状态
  11.         dwIn <= dw_in;
  12.         if(updw===2'b10)
  13.                 u_d <= 1;                //up_in=1 优先级=1
  14.         else if(updw===2'b01)
  15.                 u_d <= 0;                //dw_in=1 优先级=0
  16.         pwm_up <= upIn;                //输入状态
  17.         pwm_dw <= dwIn;
  18.         end

  19. //输出=
  20. assign up_out = pwm_up & ~(~u_d & pwm_dw);
  21. assign dw_out = pwm_dw & ~(u_d & pwm_up);


  22. endmodule
复制代码
其中没有rst,优先级u_d没有一个初始值。如果外部的up_in,dw_in输入时刻同时为1,那u_d没有做处理,应该默认为0?如果u_d=0,up_in,dw_in同时为1,根据up_out = pwm_up & ~(~u_d & pwm_dw)得出up_out=0,dw_out = pwm_dw & ~(u_d & pwm_up)得出1;也就是说如果输入时刻同时为1,那么up_out就要强制为0了。是这样解释的吗?

评论

ucx 2018-2-25 20:40 回复TA
硬件不同于软件,通常不关心初始值。这里的u_d对上下管来说是平等的。当上管先由0变成1时,优先级就被切换到上管,下管再变1不影响上管输出。 
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

关闭

热门推荐上一条 /4 下一条

分享 快速回复 返回顶部 返回列表