打印

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

[复制链接]
1255|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。

使用特权

评论回复
5
Backkom80| | 2013-6-9 13:14 | 只看该作者
倍频,5.3M可以倍到53M

使用特权

评论回复
6
lae129|  楼主 | 2013-6-9 13:37 | 只看该作者
对啊。我怎么没想到。谢谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝