【问题标题】:VHDL integers counting all over the place when incremented or decrementedVHDL整数在递增或递减时到处计数
【发布时间】:2019-10-02 02:25:56
【问题描述】:

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

此测试系统的目标是只要计数器从设定的起始值达到目标值,就可以简单地断言输出。 counter_up 从 10 开始并在 20 处输出其 LED。counter_down 从 25 开始并在 5 处输出其 LED。这些将分别继续计数和溢出/不足。两个计数器的范围从 0 到 31(5 位)。

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

计数器确实分别在 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;

【问题讨论】:

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

标签: vhdl fpga modelsim quartus


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    相关资源
    最近更新 更多