当递增或递减时,VHDL整数在整个位置上计数
我已经编写了一个简单的VHDL时钟门控进程,它包含两个变量,一个整数递增(counter_up)和一个整数递减(counter_down),每个变量都绑定到一个LED输出 该测试系统的目标是,只要计数器从设定的起始值达到目标值,就可以断言输出。计数器在10时启动,并在20时输出其LED。计数器向下从25开始,并在5输出其LED。这些将分别继续计数和过流/欠流。两个计数器的范围为0到31(5位) 当我使用模拟时钟在modelsim上进行测试时,会出现“到处计数”的情况,如下所示: 计数器分别在10步和20步后给出输出,但沿途似乎没有任何意义,而且我不确定如果我对计数器值尝试任何算术运算(例如,使用当递增或递减时,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
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个周期点亮一次。如果你能看看示意图,也许你会看到一些不同的经典计数器。(我不确定我的解释)。你有没有用信号而不是变量尝试过同样的设计?模拟器不应该优化任何东西,它应该忠实地执行它看到的东西。优化是合成工具的工作。除非这是问题中应说明的合成后模拟。