VHDL 多 std_logic_vector 到一大 std_logic_vector

VHDL multiple std_logic_vector to one large std_logic_vector

我有四个 std_logic_vectors(15 向下到 0)并想将它们堆叠成一个 std_logic_vector(63 向下 0)所以我找到了一种方法,但它是否正确还是有更好更正确的方法?

signal slv16_1,slv16_2,slv16_3,slv16_4 : std_logic_vector(15 downto 0);
signal slv64 : std_logic_vector(63 downto 0);

slv64(15 downto 0) <= slv16_1;
slv64(31 downto 16) <= slv16_2;
slv64(47 downto 32) <= slv16_3;
slv64(63 downto 48) <= slv16_4;

由于源向量具有唯一的名称,我看不到自动执行此操作的方法。您可以尝试从不使用 16 位向量,而是使用较大的 64 位向量的切片。所以不是这样的分配:

slv16_1 <= "0101110000111010";

使用

slv64(15 downto 0) <= "0101110000111010";

或者像这样连接 slv16_2 而不是实体实例化:

output_port => slv16_2,

使用

output_port => slv64(31 downto 16),

我真的需要查看更多您的代码才能了解哪些代码最有效,但我的基本答案是 'use the larger vector in the first place'。

如果您出于某种原因不能这样做,另一种方法是将您的 16 位向量声明为数组的数组:

type slv16_array_type is array (integer range <>) of std_logic_vector(15 downto 0);
signal slv16_array : slv16_array_type(3 downto 0);

然后您可以像这样分配给元素:

slv16_array(0) <= "0101";

您可以将这种类型的元素与生成循环结合起来:

slv16_combine : for i in 0 to 3 generate
  slv64((16*(i+1))-1 downto 16*i) <= slv16_array(i);
end generate;

实现此目的的一种简单方法是使用串联运算符 &。它实现了与您在上面所做的相同的事情,但所需的代码更少。

slv64 <= slv16_4 & slv16_3 & slv16_2 & slv16_1;

VHDL 指南说这个应该有效:

slv64 <= (slv16_4, slv16_3, slv16_2, slv16_1);