PWM延时,FPGA里如何实现?我写的程序为什么出现这样的问题

[复制链接]
1752|5
 楼主| lae129 发表于 2013-6-9 10:18 | 显示全部楼层 |阅读模式
这是想做PWM的死区电路,在CPLD里实现,先写了个PWM上升沿延时处理电路,但出现怪问题:会出现行刺,计数值也有出现不确定状态。
哪位大侠能否帮我看下、指点下。谢谢!
module Edge_delay(
    CLK,
    Resetn,
    trigger,
    pos_edge2,
    pos_edge3
    );

input CLK;   // 5.3MHz
input Resetn;
input trigger;

output pos_edge2;
output pos_edge3;

reg pos_edge2;
wire pos_edge3;
reg [3:0]  counter2;
localparam cnt = 4'd11 ;       //

always @(posedge CLK or negedge Resetn)         //
    begin
        if (!Resetn)
            begin
                counter2 <= 4'd0 ;
                pos_edge2 <= 1'b0;
            end
        else
            begin
                if (!trigger)
                    begin
                        counter2 <= 4'd0 ;
                        pos_edge2 <= 1'b0;
                    end
                else if (counter2 < cnt)
                    begin
                        counter2 <= counter2 + 1'b1 ;
                        pos_edge2 <= 1'b1;
                    end
                else
                    begin
                        counter2 <= cnt ;
                        pos_edge2 <= 1'b1;
                    end
            end
    end

assign pos_edge3 = ((counter2 == cnt) && (trigger)) ? 1'b1 : 1'b0 ;

用quartus II 13.0编译后调用modelsim仿真,pos_edge3会出行刺,而且counter2会有不确定状态。



 楼主| lae129 发表于 2013-6-9 10:19 | 显示全部楼层
若做点小改动:pos_edge2只在counter2加1操作为1,甚其他时候为0。那么波形正常
always @(posedge CLK or negedge Resetn)        
    begin
        if (!Resetn)
            begin
                counter2 <= 4'd0 ;
                pos_edge2 <= 1'b0;
            end
        else
            begin
                if (!trigger)
                    begin
                        counter2 <= 4'd0 ;
                        pos_edge2 <= 1'b0;
                    end
                else if (counter2 < cnt)
                    begin
                        counter2 <= counter2 + 1'b1 ;
                        pos_edge2 <= 1'b1;
                    end
                else
                    begin
                        counter2 <= cnt ;
                        pos_edge2 <= 1'b0;
                    end
            end
    end
正常波形

本帖子中包含更多资源

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

×
Backkom80 发表于 2013-6-9 11:13 | 显示全部楼层
assign pos_edge3 = ((counter2 == cnt) && (trigger)) ? 1'b1 : 1'b0 ;

这句用时序逻辑,不要用组合逻辑
 楼主| lae129 发表于 2013-6-9 12:54 | 显示全部楼层
谢谢!但是用时序逻辑,有个问题,关断时最大的误差要延时一个时钟周期。如果我的死区设置为2uS,时钟是5.3MHz,这样误差最大两个周期了---最小死区1.6uS。
Backkom80 发表于 2013-6-9 13:14 | 显示全部楼层
倍频,5.3M可以倍到53M
 楼主| lae129 发表于 2013-6-9 13:37 | 显示全部楼层
对啊。我怎么没想到。谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部