VHDL整数范围包括在内?FPGA与仿真的区别

Rob*_*obC 4 fpga vhdl modelsim intel-fpga

我是FPGA的新手.我一直在做一些简单的测试,我发现了一个我不完全理解的问题.

我有一个50MHz的时钟源.

我有一个信号定义为:

SIGNAL ledCounter : integer range 0 to 25000000 := 0;
Run Code Online (Sandbox Code Playgroud)

当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;
Run Code Online (Sandbox Code Playgroud)

当在ModelSim内部运行时,当计数器达到25000000时,我得到一个错误.为了在模拟器中运行,我必须将范围定义为:

SIGNAL ledCounter : integer range 0 to 25000001 := 0;
Run Code Online (Sandbox Code Playgroud)

有没有人知道为什么会这样?代码在FPGA上运行良好,但如果没有上述修改,则无法在模拟器中运行.

编辑:modelsim错误是非描述性的:由于致命错误无法继续.HDL呼叫序列.停在C:/Users/robert/Documents/fpga/testsim/test.vhd 20 Process line__17

Jon*_*let 6

发生这种情况是因为lineCounter <= 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;
Run Code Online (Sandbox Code Playgroud)

这样,ledCounter永远不会被安排为25000001并且不会发生错误.请注意,两个代码的行为完全相同.

  • IEEE Std 1076-2008,10.5.2.2执行简单的赋值语句,第6段:"为了执行目标是标量类型的简单波形赋值语句,首先评估右侧的波形. .如果波形中任何值表达式的值不属于目标的子类型,也是一个错误." (2认同)