VHDL整数范围输出总线宽度

问题描述

我目前正在用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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...