打印
[FPGA]

FPGA对一个频率几Hz的脉冲计数,几千次会丢失一次。换一

[复制链接]
1707|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tanghuihua|  楼主 | 2014-7-28 16:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tanghuihua 于 2014-7-28 16:13 编辑

最开始的程序:
PROCESS(nRESET,CLK) -- FIN 消抖动
BEGIN
        IF nRESET = '0' THEN
                CTLTRIGER0 <= '0';
                fliterCnt0 <= 0;
        ELSIF CLK'EVENT AND CLK = '1' THEN
                IF FIN = '0' THEN
                        IF fliterCnt0 < 50000 THEN
                                fliterCnt0 <= fliterCnt0 + 1;
                        ELSE
                                fliterCnt0 <= fliterCnt0;
                        END IF;
                        IF fliterCnt0 = 200 THEN
                                CTLTRIGER0 <= '1';
                        ELSE
                                CTLTRIGER0 <= '0';
                        END IF;
                ELSE
                        fliterCnt0 <= 0;
                        CTLTRIGER0 <= '0';
                END IF;
        END IF;
END PROCESS;


PROCESS(nRESET,CLK)
BEGIN
        IF nRESET = '0' THEN
                INWIRE <= '0';
        ELSIF CLK'EVENT AND CLK = '1' THEN
                INWIRE <= CTLTRIGER0 ;
        END IF;
END PROCESS;



PROCESS(nRESET,Addr,nWE,nCS,CLK)
BEGIN
        IF nRESET = '0' OR (Addr = conv_std_logic_vector(SUBADDR10,8) AND nCS = '0' AND nWE = '0') THEN
                hTrigCount <= X"0000";
        ELSIF CLK'EVENT AND CLK = '1' THEN
                IF CTLTRIGER0 = '1' AND INWIRE = '0' THEN
                        hTrigCount <= hTrigCount + X"0001";
                END IF;
        END IF;
END PROCESS;


测试方法,在FIN信号上外接一个脉冲计数器,CPU每隔1秒读取hTrigCount并在屏幕显示,运行一段时间后停止FIN的信号,发现CPU读出显示的数据总是比外接的脉冲计数器值少几次。发生时机无规律。

后把上图中红色部分修改为:
PROCESS(nRESET,CLK) -- FIN 消抖动
BEGIN
        IF nRESET = '0' THEN
                strig0 <= FIN;
                strig1 <= FIN;
                strig2 <= FIN;
                strig3 <= FIN;
                CTLTRIGER0 <= '0';
        ELSIF CLK'EVENT AND CLK = '1' THEN
                strig3 <= strig2;
                strig2 <= strig1;
                strig1 <= strig0;
                strig0 <= FIN;
                IF strig3 = '0' AND strig2 = '0' AND strig1 = '0' AND strig0 = '0' THEN
                        CTLTRIGER0 <= '1';
                ELSE
                        CTLTRIGER0 <= '0';
                END IF;
        END IF;
END PROCESS;

再次测试,丢失现象消失,测试几万次都没有丢一个。
注:CLK为20MHz有源晶振,FIN输入为周期为200ms,低电平25ms的脉冲波形。FPGA为CycloneII的EP2C5T144C7。

请高手帮我分析一下,有可能是什么情况产生以上结果?
我的程序是需要对FIN进行消抖处理的,因为FIN最后可能会接机械开关。后面的程序虽然能对波形发生器的信号正确处理,但我相信对机械开关肯定无**确消抖,所以这个不是我最终需要的结果。

相关帖子

沙发
zhaojingzb| | 2014-7-29 08:53 | 只看该作者
问题应该出在FIN信号上

使用特权

评论回复
板凳
tanghuihua|  楼主 | 2014-7-29 10:49 | 只看该作者
FIN应该没有问题,我在FPGA内部将FIN直接连接到一个输出脚上,然后将外接计数器接到这个输出上,外接计数器的计数是准确的,没有丢失现象。

使用特权

评论回复
地板
sahh| | 2014-7-29 12:12 | 只看该作者
答案别人不一定给得了。但可以建议一个检查方法。

你把两套电路放在一起,同时工作,两个hTrigCount会一起工作,理论上,它们会一起加上去, 但是不同步。

先用延时逻辑,让这两边接近同步。

然后在signaltag里设置一个触发条件,当两者不相等的时间超过一定数值时触发,就表示有一个漏掉了。然后再回头看看,发生了什么事情。

使用特权

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

本版积分规则

14

主题

35

帖子

2

粉丝