【发布时间】:2017-04-10 13:44:28
【问题描述】:
问题:
如果可能的话,如何声明一个函数用于任何类型的参数T,其中对T 的唯一约束是它被定义为一维array,如
type T is array ( integer range <> ) of <i>a_random_type</i>;
其中<i>a_random_type</i> 可以是任何type。
以下语法错误的函数是所需的示例
function measure_size_of_any_array ( a : array ( integer range <> ) ) return natural is
variable r : natural := 0;
begin
for i in a'range loop
r := r + 1;
end loop;
return r;
end function;
然后可以用于任何array
type natural_array is array ( integer range <> ) of natural;
type stdlogv_array is array ( integer range <> ) of std_logic_vector;
[...]
variable some_natural_array : natural_array;
variable some_stdlogv_array : stdlogv_array;
[...]
constant size_1 : natural := measure_size_of_any_array(some_natural_array);
constant size_2 : natural := measure_size_of_any_array(some_stdlogv_array);
显然,这个问题是关于定义函数的方式而不是函数本身:我不是在寻找a'length。
可能的解决方案:
来自Ashenden's VHDL-2008: Just the New Stuff
可以为子程序指定泛型。
我们可以通过以下方式在泛型列表中声明一个正式的泛型类型:
type <i>indentifier</i>具有通用列表的函数采用以下形式:
function indentifier generic ( ... ) parameter ( ... ) return result_type is ... -- declarations begin ... -- statements end function identifier
这将允许以下定义
function measure_size_of_any_array
generic ( type arr_type )
parameter ( arr : arr_type );
以及以下使用
function measure_size_of_natural_array is new measure_size_of_any_array
generic ( arr_type => natural_array );
function measure_size_of_stdlogv_array is new measure_size_of_any_array
generic ( arr_type => stdlogv_array );
constant size_1 : natural := measure_size_of_natural_array(some_natural_array);
constant size_2 : natural := measure_size_of_stdlogv_array(some_stdlogv_array);
这提供了在不同调用之间共享函数主体的所需行为,无论array 的元素类型如何,但仍然需要实例化函数(可以根据需要在本地,所以它不是太糟糕了)。
由于主要供应商对 VHDL-2008 的支持很少(我尝试过的编译器不理解以前的解决方案),因此首选 VHDL-87、-93 或 -2002 解决方案。
收到第一个答案后发表评论:
前面的信息是我试图找到一种编写 VHDL 子程序的方法,只要它是 array 就可以接受任何参数(即回答最初的问题)。预期的答案不一定应该使用相同的方法(即使用 VHDL-2008 通用子程序)!
【问题讨论】:
-
顺便说一句,如果您添加一些 minimal complete verifiable example 代码而不是伪代码,这个问题会更好。
-
@J.H.Bonarius 当我的问题基本上是“我如何用 VHDL 表达这个?”时,我怎么能写这样一个例子?因此,如果我能够写出您要求的示例,那么这个问题就不存在了。
-
一个有趣的问题。如果没有 VHDL-2008,我认为您不会找到答案。
标签: vhdl