当递增或递减时,VHDL整数在整个位置上计数

当递增或递减时,VHDL整数在整个位置上计数,vhdl,fpga,modelsim,quartus,Vhdl,Fpga,Modelsim,Quartus,我已经编写了一个简单的VHDL时钟门控进程,它包含两个变量,一个整数递增(counter_up)和一个整数递减(counter_down),每个变量都绑定到一个LED输出 该测试系统的目标是,只要计数器从设定的起始值达到目标值,就可以断言输出。计数器在10时启动,并在20时输出其LED。计数器向下从25开始,并在5输出其LED。这些将分别继续计数和过流/欠流。两个计数器的范围为0到31(5位) 当我使用模拟时钟在modelsim上进行测试时,会出现“到处计数”的情况,如下所示: 计数器分别在1

我已经编写了一个简单的VHDL时钟门控进程,它包含两个变量,一个整数递增(counter_up)和一个整数递减(counter_down),每个变量都绑定到一个LED输出

该测试系统的目标是,只要计数器从设定的起始值达到目标值,就可以断言输出。计数器在10时启动,并在20时输出其LED。计数器向下从25开始,并在5输出其LED。这些将分别继续计数和过流/欠流。两个计数器的范围为0到31(5位)

当我使用模拟时钟在modelsim上进行测试时,会出现“到处计数”的情况,如下所示:

计数器分别在10步和20步后给出输出,但沿途似乎没有任何意义,而且我不确定如果我对计数器值尝试任何算术运算(例如,使用
numeric\u std
library),它将如何运行

此问题的原因是什么?是否可以强制使用预期值对其进行模拟

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;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.NUMERIC_STD.ALL;
实体测试是端口(
clk:标准逻辑中;
led_1、led_2:输出标准_逻辑
);
结束;
测试的架构arch_测试是
开始
过程(clk)
变量计数器向上:整数范围0到31:=10;
变量计数器向下:整数范围0到31:=25;
开始
如果clk'事件和clk='1',则
计数器向上:=计数器向上+1;
如果计数器向上=20,则

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


尝试使用
unsigned(4到0)
而不是整数,您需要分别将
conter\u-up
counter\u-down
的初始值更改为
到unsigned(10,5)
到unsigned(25,5)

它们并不完全相同,请注意,如果将
counter\u-up
位1反转,3和4您将获得一个完美的增量值序列,类似的情况似乎也发生在
计数器下降时。这就好像工具将一个受限的整数范围解释为一个枚举,然后决定在这个奇怪的模式上对其进行编码,但就像@Brian所说的,这不是模拟器可以做的,所以我猜这可能是一个后合成模拟


尝试使用
unsigned(4向下到0)
而不是整数,您需要将
conter\u向上
counter\u向下
的初始值更改为
到unsigned(10,5)
到unsigned(25,5)
分别。

显示的模拟器不是modelsim-它是quartus内置模拟器,仅模拟编译后的设计。使用RTL sim卡的Modelsim可能会显示正确的操作。至于为什么会出现错误,设计是否满足计时要求?我缺少的是,至少您没有将计数器限制在定义的范围内。您的VHDL模拟器应发出投诉并停止。模拟器可能会优化布尔方程,以实现您的模块目标:点亮LED。所以它不关心变量的值,它只想在第10个周期点亮led_1,然后每32个周期点亮一次。如果你能看看示意图,也许你会看到一些不同的经典计数器。(我不确定我的解释)。你有没有用信号而不是变量尝试过同样的设计?模拟器不应该优化任何东西,它应该忠实地执行它看到的东西。优化是合成工具的工作。除非这是问题中应说明的合成后模拟。显示的模拟器不是modelsim-它是quartus内置模拟器,仅模拟编译后的设计。使用RTL sim卡的Modelsim可能会显示正确的操作。至于为什么会出现错误,设计是否满足计时要求?我缺少的是,至少您没有将计数器限制在定义的范围内。您的VHDL模拟器应发出投诉并停止。模拟器可能会优化布尔方程,以实现您的模块目标:点亮LED。所以它不关心变量的值,它只想在第10个周期点亮led_1,然后每32个周期点亮一次。如果你能看看示意图,也许你会看到一些不同的经典计数器。(我不确定我的解释)。你有没有用信号而不是变量尝试过同样的设计?模拟器不应该优化任何东西,它应该忠实地执行它看到的东西。优化是合成工具的工作。除非这是问题中应说明的合成后模拟。