VHDL生成具有减小长度的STD_LOGIC_VECTORS阵列

时间:2017-08-13 20:30:49

标签: arrays vhdl fpga xilinx

我正在尝试创建一个减少长度的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;

我是否错误地使用了生成语句?

1 个答案:

答案 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);