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

问题描述 投票:0回答:1

我编写了一个简单的VHDL时钟门控过程,其中包含两个变量,一个向上计数的整数(counter_up)和一个向下计数的整数(counter_down),分别与LED输出绑定。

该测试系统的目标是,只要计数器从设置的起始值达到目标值,就简单地声明输出。 counter_up从10开始并在20输出其LED。counter_down从25开始并在5输出其LED。这将分别继续计数和上溢/下溢。两个计数器的范围从0到31(5位)。

当我在modelsim上使用模拟时钟对它进行测试时,就会发生“'到处计数'的情况,如下所示:

https://i.imgur.com/KExlEI4.png

计数器确实分别在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;
vhdl fpga modelsim quartus
1个回答
0
投票

它们并不完全正确,请注意,如果将counter_up位1、3和4取反,则会得到一个理想的增量值序列,并且counter_down似乎也会发生类似的情况。好像该工具将受约束的整数范围解释为枚举,然后决定以这种奇怪的模式对其进行编码,但是就像@Brian所说的那样,这不是模拟器可以做的,所以我猜测这很可能是一篇博文合成器仿真。

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

© www.soinside.com 2019 - 2024. All rights reserved.