我想用FPGA定时往计算机发送中断信号(lint,低电平有效),而计算机在进入中断后发送握手信号(userO),FPGA在收到userO的上跳沿后立刻把lint置高。
附图是我的思路。首先从 8M 的主频(llclk)分出一个1K方波 level_1K。同时还定时地把lcx2清零。lcx2变成0之后,lint就完全取决于level_1K了。当level_1K变成低电平时,触发了中断。随后,当userO上跳的时候,lcx2变成1,于是lint立刻无效了。这样一直等到lcx2再次被清0……。
实际运行中,PC端容易死掉。最长的一次运行了800多秒后死掉的。短的只有10秒就死。一般现象是PC上的进程死掉(用任务管理器杀不掉),也有一次是整个机器死掉。
下面是代码:
p11: PROCESS(clr, userO)
BEGIN
IF (clr = '1') THEN
lcx2 <= '0';
ELSIF (RISING_EDGE(userO)) THEN
lcx2 <= '1';
END IF;
END PROCESS P11;
lint <= lcx2 OR level_1K;
P10:PROCESS (llclk)
BEGIN
IF (RISING_EDGE(llclk)) THEN
scalar_8M_1K <= scalar_8M_1K + 1;
IF (level_1K = '1') THEN
IF (scalar_8M_1K = 3989) THEN
clr <= '1';
ELSIF (scalar_8M_1K = 3994) THEN
clr <= '0';
END IF;
END IF;
IF (scalar_8M_1K = 3999) THEN
scalar_8M_1K <= 0;
IF (level_1K = '0') THEN
level_1K <= '1';
ELSE
level_1K <= '0';
END IF;
END IF;
END IF;
END PROCESS P10;
下面是RTL图,注意为了简洁,该图中是当 level_1K='1' AND scalar_8M_1K =1时置clr,当 level_1K='1' AND scalar_8M_1K =2时清clr,当 scalar_8M_1K =3时翻转level_1K
我实际测过一次,发现死机后userO停留在高电平,lcx2停留在低电平,level_1K和lint都是正常的1K方波。
另外,clr应该是1K。但是多次实测都表明是2K。原因不明。
恳请大侠指点,谢谢! |