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
信号作为加法器的输入。如果它的类型在硬件的生命周期内发生变化,则意味着您也有一些动态硅。有些晶体管会在类型范围增加时突然出现,而在类型范围减小时消失。这真的没有意义,是吗?
因此,如果您了解此约束,则还必须了解无需使用不同的信号来定义您的类型。您需要的是可以在仿真或逻辑综合开始时静态计算的普通常量值。这里有两种可能性:
第一种情况:您用来计算范围的这个 A
输入实际上是您设计的一个输入,它可以在硬件的生命周期内改变(电路板的开关,例如实例)。然后,您必须将您的类型确定为最坏情况 (300/23
),这样它始终足够,即使 A
取最坏情况值 "01"
:
signal myint: integer range 0 to 300 / 23;
注意:内部信号声明没有模式规范,没有inout
。始终可以分配和读取内部信号。例如,实体端口具有一种模式(in
、out
...)来限制它们的使用方式。
第二种情况:这个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
因为...它仅用作您的过程的输出,从不用作输入。
我想让我的整数类型信号范围取决于某些过程的输出,例如这样的东西
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
信号作为加法器的输入。如果它的类型在硬件的生命周期内发生变化,则意味着您也有一些动态硅。有些晶体管会在类型范围增加时突然出现,而在类型范围减小时消失。这真的没有意义,是吗?
因此,如果您了解此约束,则还必须了解无需使用不同的信号来定义您的类型。您需要的是可以在仿真或逻辑综合开始时静态计算的普通常量值。这里有两种可能性:
第一种情况:您用来计算范围的这个
A
输入实际上是您设计的一个输入,它可以在硬件的生命周期内改变(电路板的开关,例如实例)。然后,您必须将您的类型确定为最坏情况 (300/23
),这样它始终足够,即使A
取最坏情况值"01"
:signal myint: integer range 0 to 300 / 23;
注意:内部信号声明没有模式规范,没有
inout
。始终可以分配和读取内部信号。例如,实体端口具有一种模式(in
、out
...)来限制它们的使用方式。第二种情况:这个
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
因为...它仅用作您的过程的输出,从不用作输入。