VHDL 整数在递增或递减时到处计数

VHDL integers counting all over the place when incremented or decremented

我编写了一个简单的 VHDL 时钟门控过程,其中包含两个变量,一个向上计数的整数 (counter_up) 和一个向下计数的整数 (counter_down),每个变量都与一个 LED 输出相连.

该测试系统的目标是只要计数器从设定的起始值达到目标值,就简单地使输出断言。 counter_up 从 10 开始并在 20 输出其 LED。counter_down 从 25 开始并在 5 输出其 LED。这些将继续计数并分别 over/under 流动。两个计数器的范围都从 0 到 31(5 位)。

当我使用如下所示的模拟时钟在 modelsim 上对此进行测试时,会发生 'counting all over the place':

计数器确实分别在 10 步和 20 步后给出了输出,但一路上似乎没有任何意义,我不确定如果我对计数器值尝试任何算术它会如何表现(例如,使用 numeric_std 库)。

这个问题的原因是什么,是否可以强制使用预期值模拟它们?

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.NUMERIC_STD.ALL;

ENTITY test IS PORT(

    clk: IN STD_LOGIC;
    led_1,led_2: OUT STD_LOGIC
    );
END;

ARCHITECTURE arch_test OF test IS

BEGIN
    PROCESS(clk)
        VARIABLE counter_up: INTEGER RANGE 0 TO 31 := 10;
        VARIABLE counter_down: INTEGER RANGE 0 TO 31 := 25;
    BEGIN
        IF clk'EVENT AND clk = '1' THEN

            counter_up := counter_up + 1;

            IF counter_up = 20 THEN
                led_1 <= '1';
            ELSE
                led_1 <= '0';
            END IF;

            counter_down := counter_down - 1;

            IF counter_down = 5 THEN
                led_2 <= '1';
            ELSE
                led_2 <= '0';
            END IF;

        END IF;
    END PROCESS;
END;

它们并不是到处都是,请注意,如果您反转 counter_up 位 1、3 和 4,您将获得一个完美的增量值序列,并且类似的事情似乎发生在 counter_down.就好像该工具将一个受限的整数范围解释为一个枚举,然后决定以这种奇怪的模式对其进行编码,但正如@Brian 所说,这不是模拟器会做的事情,所以我猜这可能是 post 合成模拟。

尝试使用 unsigned(4 downto 0) 而不是整数,您需要将 conter_upcounter_down 的初始值分别更改为 to_unsigned(10, 5)to_unsigned(25, 5) .