VHDL多个std_logic_vector到一个大的std_logic_vector

时间:2015-10-14 15:55:20

标签: vhdl

我有四个std_logic_vectors(15 downto 0)并希望将它们堆叠成std_logic_vector(63 downt 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;

3 个答案:

答案 0 :(得分:11)

实现此目的的一种简单方法是使用连接运算符&。它实现了与上面相同的功能,但需要的代码更少。

slv64 <= slv16_4 & slv16_3 & slv16_2 & slv16_1;

答案 1 :(得分:1)

由于源向量具有唯一的名称,我没有看到自动化的方法。你可能尝试的是永远不要使用16位向量,而是使用更大的64位向量的切片。所以不是像这样的任务:

slv16_1 <= "0101110000111010";

使用

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

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

output_port => slv16_2,

使用

output_port => slv64(31 downto 16),

我真的需要看到更多的代码才能理解什么可能效果最好,但我的基本答案是“首先使用较大的矢量”#。

如果由于某种原因无法做到这一点,另一种方法是将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;

答案 2 :(得分:1)

VHDL指南说这个应该有效:

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