我有四个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;
答案 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);