最开始的程序:
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最后可能会接机械开关。后面的程序虽然能对波形发生器的信号正确处理,但我相信对机械开关肯定无**确消抖,所以这个不是我最终需要的结果。