包括 VHDL 整数范围? FPGA 与仿真的区别
VHDL integer range inclusive? Difference in FPGA vs. simulation
我是 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 进程 line__17
发生这种情况是因为行 ledCounter <= ledCounter + 1 发生在比较之前。即使 ledCounter 的值实际上不会达到 25000001,由于被以下语句覆盖,此时它 scheduled 达到它,导致模拟错误。您可以通过在 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,也不会发生错误。请注意,这两个代码的行为完全相同。
我是 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 进程 line__17
发生这种情况是因为行 ledCounter <= ledCounter + 1 发生在比较之前。即使 ledCounter 的值实际上不会达到 25000001,由于被以下语句覆盖,此时它 scheduled 达到它,导致模拟错误。您可以通过在 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,也不会发生错误。请注意,这两个代码的行为完全相同。