我的 FPGA 通过 PCI9054 和计算机连接。FPGA 以及 PCI9054 的时钟频率是 8M。
FPGA 把 8M 分频成 1 HZ,并且产生给计算机的中断信号。
计算机收到中断后,先升高 userO 的电平,再把计数器累加 1 并显示到屏幕上。然后再开中、降低
userO 的电平。
userO 充当计算机和 FPGA 之间的握手信号。当 FPGA 收到 userO 的高电平时,就撤销中断信号,这样
可以避免多次重复的中断。
最终的效果就是:FPGA 每秒发送一个中断,而且计算机也只响应一次。
但实际测试了之后,发现计算机响应的中断多了一些。我看屏幕上的计数器,也发现偶尔有跳数现象,比如直接从 1 跳到 3.
我用计算机自身的时钟做参照,从 11:37:10 到 13:03:30,是 5180 秒,却收到了 5211 次中断。
下面的 VHDL 程序是 FPGA 上的,其中 llclk 是 8M 时钟,lint 是给计算机的中断信号,低电平有效,
P10:PROCESS (llclk)
BEGIN
IF (RISING_EDGE(llclk)) THEN
scalar_8M_1 <= scalar_8M_1 + 1;
IF (scalar_8M_1 = 3999999) THEN
scalar_8M_1 <= 0;
IF (level_1 = '0') THEN
level_1 <= '1';
ELSE
level_1 <= '0';
END IF;
END IF;
END IF;
END PROCESS P10;
P9: PROCESS (llclk, userO)
BEGIN
IF (RISING_EDGE(llclk)) THEN
lcx1 <= level_1;
lcx2 <= userO;
IF (lcx1 = '0' AND level_1 = '1') THEN
lint <= '0';
ELSIF (lcx2 = '0' AND userO = '1') THEN
lint <= '1';
END IF;
END IF;
END PROCESS P9;
请问是什么原因呢?会不会是计算机和 FPGA 的速度差太快了,后者只有8M,导致 userO 的高电平非常窄,有的时候就被 FPGA 的 P9 给漏掉了,于是引起了第二次中断。
可是另一方面,毕竟 PCI9054 和 FPGA 是共享一个时钟的。所以 PCI9054 应该能保证 userO 持续至少一个时钟周期:这样看来,FPGA 也没有理由漏掉 userO 啊!
恳请各位高人发表意见,谢谢! |