打印

定时握手:FPGA有点快!

[复制链接]
1310|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
情场探花|  楼主 | 2012-3-31 14:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的 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 啊!
恳请各位高人发表意见,谢谢!

相关帖子

沙发
情场探花|  楼主 | 2012-3-31 15:59 | 只看该作者
本帖最后由 情场探花 于 2012-3-31 16:12 编辑

进一步的实验似乎否定了计算机太快的猜测!
我改动了计算机的程序,每次把 userO 拉高后,先 Sleep(1)。这样就保证了 userO 的高
电平持续至少 15ms,相对于 8M 的 FPGA 频率来说肯定能够识别出来
可问题丝毫没有改善。

使用特权

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

本版积分规则

442

主题

1192

帖子

6

粉丝