你能用 VHDL 制作一个类型数组吗?
Can you make an array of types in VHDL?
Vivado Simulation 不支持具有签名组件的无约束类型。
即
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 生成循环控制)
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;
这种代码可以让我从我的体系结构的连续部分获得比特增长——例如来自加法。
现在...进入手头的问题。
我可以解决这个问题而不是使用永远变化的生成语句启动信号的一种方法实际上可能是创建 "array of types".
请注意这是用不太 vhdl 的方式写的,但希望你能看到我想做什么。
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 的元素,它本身是一种类型,然后分配给 signal/variable。
即
信号 my_sig : my_arr_of_types(n);
*其中 n 是数组的任何有效索引。
显然这在 VHDL 或任何仿真工具中是不允许的。但是有人能看到我的问题的潜在解决方案吗?
请记住,我在端口声明中使用了这些类型中的大部分,因此任何解决方案都必须符合端口声明的限制。
使用二维数组作为解决方案:
套餐
library ieee;
use ieee.numeric_std.all;
package utilities is
type T_SLM is array(natural range <>, natural range <>) of std_logic;
end package;
实体
现在您可以在端口声明中将此类型与两个通用参数一起使用。由于架构中的大小现在已知,您可以创建您使用的定义类型的有符号值,您可以使用生成语句或函数从 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 in package PoC.vectors.
中已经实现了许多像这样的辅助函数
Vivado Simulation 不支持具有签名组件的无约束类型。
即
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 生成循环控制)
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;
这种代码可以让我从我的体系结构的连续部分获得比特增长——例如来自加法。
现在...进入手头的问题。
我可以解决这个问题而不是使用永远变化的生成语句启动信号的一种方法实际上可能是创建 "array of types".
请注意这是用不太 vhdl 的方式写的,但希望你能看到我想做什么。
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 的元素,它本身是一种类型,然后分配给 signal/variable。
即 信号 my_sig : my_arr_of_types(n);
*其中 n 是数组的任何有效索引。
显然这在 VHDL 或任何仿真工具中是不允许的。但是有人能看到我的问题的潜在解决方案吗?
请记住,我在端口声明中使用了这些类型中的大部分,因此任何解决方案都必须符合端口声明的限制。
使用二维数组作为解决方案:
套餐
library ieee;
use ieee.numeric_std.all;
package utilities is
type T_SLM is array(natural range <>, natural range <>) of std_logic;
end package;
实体
现在您可以在端口声明中将此类型与两个通用参数一起使用。由于架构中的大小现在已知,您可以创建您使用的定义类型的有符号值,您可以使用生成语句或函数从 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 in package PoC.vectors.
中已经实现了许多像这样的辅助函数