问题描述
我要使我的整数类型信号范围取决于某些过程的输出,即类似这样的结果
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
的值,并且硬件将仅在此值下工作。之后,除非重新编程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
,因为...它仅被您的过程用作输出,而从未用作输入。>