我正在尝试创建一个减少长度的std_logic_vectors数组。我尝试使用通用的std_logic_vector创建一个数组,然后使用generate语句来生成向量。
architecture behavioral of dadda_mul_32bit is
type and_planes is array (0 to 31) of std_logic_vector;
begin
generate_and_plane:
for i in 0 to 31 generate
and_planes(i) <= and_vector(a, b(i), i);
end generate generate_and_plane;
end behavioral;
以及返回通用std_logic_vector的函数:
function and_vector(vec: std_logic_vector; x: std_logic; length: natural) return std_logic_vector is
variable result: std_logic_vector(length - 1 downto 0);
begin
for i in 0 to length - 1 loop
result(i) := vec(i) and x;
end loop;
return result;
end function;
我是否错误地使用了生成语句?
答案 0 :(得分:3)
and_planes
类型不是信号,因此您无法分配它!
更多的是你正在创建一个部分约束类型,需要在对象(例如信号)声明中进行约束。
VHDL不支持参差不齐的数组。 (其中每个元素具有不同大小的阵列)。如果您需要这个用于模拟,您可以使用访问类型并模拟像C中的不规则数组。如果您需要它进行综合,那么您可以使用一维数组模拟一个参差不齐的数组,并使用一些函数来计算嵌套的边界矢量。
见我的回答:
顺便说一下。 VHDL-2008增加了一个重载:"and"(std_logic, std_logic_vector)
,因此不需要函数来计算向量中每个位的单个位的和。
-- slice 'a' and gate it by 'b(i)'
and_planes(i) <= a(i downto 0) and b(i);