即
type A is array (natural range <>) of signed;
我一直在端口声明中使用A型的设计中使用它,因为我希望有一个并行设计,可以通过通用以及当前阶段的字长来控制,例如
port (
inputdata : A(0 to number_of_parallel_generic-1)(stage_wordlength_generic-1 downto 0)
);
因为我使用类型A并控制了许多泛型,例如具有16个字长和其他变化形式的4个宽数组(通常由for generate循环控制)
for i in 0 to length_of_generate_statement-1 generate
signal example_signal : A(0 to 3)(stage_wordlength_generic + i - 1 downto 0);
begin
<functional code>
end generate;
这种代码可以使我从体系结构的顺序部分中获得一些增长-例如从另外一个。
我可以避免这种情况的一种方法,而不是使用永远更改的generate语句来启动信号,实际上可能是在创建“类型数组”。
借我的眼光,这是用不太甚甚于vdl的方式写的,但希望您能看到我正在尝试做的事。
type my_arr_of_types is array(0 to length_of_array-1) of type;
for i in 0 to length_of_array-1 generate
my_arr_of_types(i) <= <type declaration with some dependance on i>;
end generate;
希望您能看到我正在尝试做的事情。
这将允许您调用my_arr_of_types元素,该元素本身就是要分配给信号/变量的类型。
即 发出信号my_sig:my_arr_of_types(n);
*其中n是数组的任何有效索引。
显然,VHDL或任何仿真工具都不允许这样做。但是谁能看到解决我问题的潜在解决方案?
请记住,我在port语句上使用了大多数类型,因此任何解决方案都必须符合port声明的限制。
答案 0 :(得分:1)
使用二维数组作为解决方案:
library ieee;
use ieee.numeric_std.all;
package utilities is
type T_SLM is array(natural range <>, natural range <>) of std_logic;
end package;
现在,您可以在端口声明中使用此类型以及两个通用参数。由于体系结构中现已知道大小,因此您可以创建已使用的已定义类型的带符号值,并且可以使用generate语句或函数将T_SLM
转换为myArray
类型。
library ieee;
use ieee.numeric_std.all;
library myLib;
use myLib.utilities.all;
entity foo is
generic (
number_of_parallel : natural;
stage_wordlength : natural
);
port (
Input : T_SLM(0 to number_of_parallel - 1, stage_wordlength - 1 downto 0)
);
end entity;
architecture a of foo is
type myArray is array (natural range <>) of signed(Input'range(2));
function convert(matrix : T_SLM) return myArray is
variable result : myArray(matrix'range(1));
begin
for i in matrix'range(1) loop
for k in matrix'range(2) loop
result(i)(j) := matrix(i, j);
end loop;
end loop;
return result;
end function;
signal InputData1 : myArray(Input'range(1));
signal InputData2 : myArray(Input'range(1));
begin
genInput: for i in Input'range(1) generate
genInput: for j in Input'range(2) generate
InputData1(i)(j) <= Input(i, j);
end generate;
end generate;
InputData2 <= convert(Input);
end architecture;
PoC Library的PoC.vectors软件包中已实现了许多类似的帮助程序功能。