包括 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,也不会发生错误。请注意,这两个代码的行为完全相同。