我是FPGA的新手。我一直在做一些简单的测试,但发现一个我不完全了解的问题。
我有一个50MHz的时钟源。
我有一个信号定义为:
SIGNAL ledCounter : integer range 0 to 25000000 := 0;
当ledCounter达到25,000,000时,我切换LED并重置计数器。直接在FPGA上可以很好地工作。
IF (rising_edge(CLK)) THEN
ledCounter <= ledCounter + 1;
IF (ledCounter = 25000000) THEN
ledCounter <= 0;
toggle <= not toggle;
LED(0) <= toggle;
END IF;
END IF;
在ModelSim中运行时,当计数器达到25000000时会出现错误。要使其在模拟器中运行,我必须将范围定义为:
SIGNAL ledCounter : integer range 0 to 25000001 := 0;
有谁对为什么会这样有任何见解?该代码可以在FPGA上很好地运行,但是如果不进行上述修改,就不会在模拟器中运行。
编辑:modelsim错误是非描述性的:由于致命错误而无法继续。HDL呼叫顺序。在C:/Users/robert/Documents/fpga/testsim/test.vhd停止20流程行__17
这是因为行ledCounter <= ledCounter + 1发生在比较之前。即使ledCounter的值实际上不会达到25000001(由于被以下语句覆盖),目前仍计划达到该值,从而导致模拟错误。您可以通过在else分支中移动增量轻松解决它:
IF (rising_edge(CLK)) THEN
IF (ledCounter = 25000000) THEN
ledCounter <= 0;
toggle <= not toggle;
LED(0) <= toggle;
ELSE
ledCounter <= ledCounter + 1;
END IF;
END IF;
这样,ledCounter永远不会计划为25000001,并且不会发生任何错误。请注意,两个代码的行为完全相同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句