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

VHDL How to define integer range based on result from procedures declaration

我想让我的整数类型信号范围取决于某些过程的输出,例如这样的东西

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 的值,并且硬件将仅使用此值工作。如果没有 re-programming 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 因为...它仅用作您的过程的输出,从不用作输入。