打印
[verilog]

如何实现上下管pwm互锁???

[复制链接]
2221|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
PWM, mb, code, ST, se
请教大家一个问题,如何实现igbt上下管的pwm互锁,防止上下管同时出现高电平而导通。要求:上管PWMA=1的时候,下管失效PWMB=0;下管PWMB=1的时候,上管失效PWMA=0。用门极或锁存电路实现,因为我最后要用Verilog来写程序。
正常情况下或者在cpld里面分频后是互补的pwm波,加上死区就可以用了。但是如果是外来pwm的情况,为了防止出现同时为高,需要做一个这样的处理。
我自己写了的如下:

//pwm_up_in pwm_dw_in互锁输出
always @(posedge clk)
        if(rst)
                pwm_up <= 1'b0;
        else
                if(pwm_up_in && pwm_dw)
                        pwm_up <= 1'b0;                                                                                                        //
                else
                        pwm_up <= pwm_up_in;
               
always @(posedge clk)
        if(rst)
                pwm_dw <= 1'b0;                                                                                                                //
        else
                if(pwm_dw_in && pwm_up)
                        pwm_dw <= 1'b0;                                                                                                        //
                else
                        pwm_dw <= pwm_dw_in;
这段代码出现的问题是,在复位时刻pwm_up,pwm_dw都是为0的,程序会进入全1或全0的循环当中。
我也画了这个图,不知道可不可以?


QQ图片20180202174623.jpg (174.42 KB )

QQ图片20180202174623.jpg

相关帖子

沙发
hmf1235789|  楼主 | 2018-2-2 17:57 | 只看该作者
21ic改版了吗?怎么帖子变成对话框的形式了

使用特权

评论回复
板凳
ucx| | 2018-2-2 20:33 | 只看该作者
b_out <= a & ~a_in这也是语言

使用特权

评论回复
地板
ucx| | 2018-2-2 20:35 | 只看该作者
b_in&手抖写错了

使用特权

评论回复
5
xch| | 2018-2-3 11:32 | 只看该作者
应当使用R-S触发器.

使用特权

评论回复
6
hmf1235789|  楼主 | 2018-2-6 11:26 | 只看该作者
最后想到这样行不行
//pwm_up_in pwm_dw_in互锁输出
always @(posedge clk or posedge rst or posedge pwm_dw)
        if(rst)
                pwm_up <= 1'b0;                                                                                                               
        else
                if(pwm_dw)
                        pwm_up <= 1'b0;                                                                                                        //异步触发,当dw为1时,up恒为0
                else
                        pwm_up <= pwm_up_in;                                                                                                //当dw为0时,up无限制

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



搜狗截图20180206112157.jpg (148.75 KB )

搜狗截图20180206112157.jpg

使用特权

评论回复
7
hmf1235789|  楼主 | 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触发器用异步清零和置位。

使用特权

评论回复
8
ucx| | 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

使用特权

评论回复
9
hmf1235789|  楼主 | 2018-2-24 11:02 | 只看该作者
本帖最后由 hmf1235789 于 2018-2-24 11:11 编辑
ucx 发表于 2018-2-6 13:35
这个问题还没有解决?
首先rst在设计中无用,可删除。
其次,如果所云上下管没有优先级的话,那么我们就定 ...

非常感谢提供的另一种方法,你的方法如下:
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;                //up_in=1 优先级=1
        else if(updw===2'b01)
                u_d <= 0;                //dw_in=1 优先级=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
其中没有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不影响上管输出。 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

48

帖子

0

粉丝