【发布时间】: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