问题描述
我目前正在用VHDL编写一个简单的计数器,试图尽可能地使其通用。理想情况下,我最终得到一个可以暂停,向上/向下计数并且仅取两个整数(最小值,最大值)值来确定合适的总线宽度的计数器。
据我所知,为了得到给定范围的整数,我只需要delcare
变量cnt:整数范围(最小值至最大值):= 0
其中min和max被定义为实体中的泛型(均为整数)。我的理解是,例如,如果min为0,max为5,它将创建3位整数变量。
我的问题是我实际上想输出此整数。所以,自然地,我写
counterOut:OUT整数范围,最小到最大
但是,这似乎并没有满足我的要求。我正在从Quartus Prime中生成一个原理图模块,它从[min ... max]创建了总线输出。例如,如果min = 0,max = 65,则输出66位总线。而不是七位总线。
如果我将计数器限制为无符号值,我也许可以算出输出总线大小,但是我想使其尽可能灵活,当然,我想知道我在做什么。实际做错了以及如何正确做。
TL; DR:我希望VHDL实体采用通用的min,max值,并生成具有所需宽度的整数输出总线以保存值的范围。怎么办?
如果有关系,我目前正在使用Quartus Prime Lite Edition V20.1.0。
注意:我知道我可以改用STD_LOGIC_VECTOR,但据我所知,它比整数类型的模拟速度要慢得多,并且不易使用。如果需要的话,我可以提供更多代码,但就我所知,实际上正是这一行。
我最初将此内容发布在Stackexchange上,但是我认为Stackoverflow可能是一个更好的地方,因为它更多的是编程而不是硬件问题。
编辑:完整的代码如下所示
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
USE ieee.std_logic_signed.all;
ENTITY Counter IS
GENERIC (modulo : INTEGER := 32;
min : INTEGER := 0;
max : INTEGER := 64);
PORT( pause : IN STD_LOGIC;
direction : IN STD_LOGIC; -- 1 is up,0 is down
clk : IN STD_LOGIC;
counterOut : OUT INTEGER RANGE min TO max --RANGE 0 TO 32 -- THIS line is the one generating an incorrect output bus width
);
END ENTITY Counter;
-- or entity
ARCHITECTURE CounterArch OF Counter IS
BEGIN
PROCESS(direction,pause,clk)
VARIABLE cnt : INTEGER RANGE min TO max := 0;
VARIABLE dir : INTEGER;
BEGIN
IF direction = '1' THEN
dir := 1;
ELSE
dir := -1;
END IF;
IF clk'EVENT AND clk = '1' THEN
IF pause = '0'THEN
IF (cnt = modulo AND direction = '1') THEN
cnt := min; -- If we're counting up and hit modulo,reset to min value.
ELSIF (cnt = min AND direction = '0') THEN
cnt := modulo; --Counting down hit 0,go back to modulo.
ELSE
cnt := cnt + dir;
END IF;
END IF;
END IF;
counterOut <= cnt;
END PROCESS;
END ARCHITECTURE CounterArch;
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)