我是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 Process line__17
答案 0 :(得分:6)
这是因为在计算机之前,行ledCounter&lt; = 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并且不会发生错误。请注意,两个代码的行为完全相同。