VHDL如何根据过程声明的结果定义整数范围

问题描述

我要使我的整数类型信号范围取决于某些过程的输出,即类似这样的结果

procedure blah( signal A : in std_logic_vector(0 to 1); signal B : inout integer) 

Begin

Case A is
When "00" => B <= 215;

When "01" => B <= 300;

When others => B <= 105;

end case;

End;

下一步,我想使用此过程的输出来定义整数类型的信号范围

Blah(A,myrange);

Signal myint: inout integer range 0 to myrange/23;

难点是我不能在体系结构的声明中使用过程,是否有任何方法可以为整数定义变量范围,或者有什么方法可以在开始声明后在体系结构部分内定义整数范围

解决方法

如评论中所述,您不能具有整数类型的变量范围。 VHDL是一种硬件描述语言。从纯硬件的角度来看,具有可变范围的整数类型意味着什么?假设您将myint信号用作加法器的输入。如果其类型在硬件的生命周期内发生变化,则意味着您也拥有一些动态芯片。当类型范围增加时,某些晶体管会突然出现,而当类型范围减小时,它们会消失。这真的没有道理吗?

因此,如果您了解此约束,则还必须了解,无需使用各种信号来定义您的类型。您需要的是可以在模拟或逻辑综合开始时静态计算的普通常量值。这里有两种可能性:

  1. 第一种情况:用于计算范围的此A输入实际上是设计的输入,可以在硬件的生命周期(例如,电路板的开关)的使用期内改变。然后,您必须将类型的尺寸设置为最坏的情况(300/23),这样即使在A采取最坏情况的值"01"的情况下,类型也始终足够:

     signal myint: integer range 0 to 300 / 23;
    

    注意:没有内部信号声明的模式规范,没有inout。内部信号始终可以分配和读取。例如,实体端口的模式(inout ...)限制了它们的使用方式。

  2. 第二种情况:此A值在您的硬件生存期内是恒定的。明确地说,这意味着如果您决定对FPGA进行编程或使用设计制造集成电路(IC),则在对FPGA进行编程或制造IC之前,将固定A的值,并且硬件将仅在此值下工作。之后,除非重新编程FPGA或制造另一个IC,否则无法对其进行更改。

    然后,在这种情况下,将其声明为通用参数比将其声明为输入端口或内部信号要好得多。这正是通用参数的用途。并且,如注释中所述,您不能在此处使用过程,但可以使用函数。由于您的过程只有一个输出,因此函数也可以完成此工作:

     entity foo is
       generic(A: std_logic_vector(0 to 1));
       port(...);
     end entity foo;
    
     architecture rtl of foo is
       function blah(val: in std_logic_vector(0 to 1)) return integer is
       begin
         case val is
           when "00" =>   return 215;
           when "01" =>   return 300;
           when others => return 105;
         end case;
       end function blah;
       signal myint: integer range 0 to blah(A) / 23;
    

    如果在操作过程中确实还需要此过程(与声明类型完全不同的目的),则甚至可以使用该函数来定义过程:

       procedure blah(signal A: in std_logic_vector(0 to 1); signal B: out integer) is
       begin
         B <= blah(A);
       end procedure blah;
    

    请注意,我将B的模式更改为out而不是inout,因为...它仅被您的过程用作输出,而从未用作输入。>

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...