VHDL将多个标准逻辑向量转换为一个大型标准逻辑向量

VHDL将多个标准逻辑向量转换为一个大型标准逻辑向量,vhdl,Vhdl,我有四个std_逻辑_向量(15向下到0),并希望将它们叠加到一个std_逻辑_向量(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 down

我有四个std_逻辑_向量(15向下到0),并希望将它们叠加到一个std_逻辑_向量(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;
信号slv16_1、slv16_2、slv16_3、slv16_4:std_逻辑_向量(15到0);
信号slv64:标准逻辑向量(63至0);

slv64(15到0)因为源向量有唯一的名称,所以我看不到一种自动化的方法。您可以尝试的是永远不要使用16位向量,而是使用更大的64位向量的切片。因此,与这样的作业不同:

slv16_1 <= "0101110000111010";
output_port => slv16_2,
slv16_array(0) <= "0101";
使用

我真的需要看更多的代码来理解什么可能是最好的,但我的基本答案是“首先使用更大的向量”

如果由于某种原因无法执行此操作,另一种方法是将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);
type slv16_array_type是标准逻辑向量(15到0)的数组(整数范围);
信号slv16_阵列:slv16_阵列类型(3至0);
然后,您可以将以下内容指定给元素:

slv16_1 <= "0101110000111010";
output_port => slv16_2,
slv16_array(0) <= "0101";

slv16_数组(0)实现这一点的简单方法是使用串联运算符
&
。它实现了与上面相同的功能,但所需的代码更少

slv64 <= slv16_4 & slv16_3 & slv16_2 & slv16_1;

slv64VHDL指南说这个应该可以工作:

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

slv64 VHDL-2008还支持由元素片和数组基类型元素组成的聚合。在某些情况下,使用聚合可以克服级联运算符的重载解析模糊性,而聚合是一种基本操作。VHDL别名可能是您的替代方法。别名可用于为64位向量的部分赋予新名称,而所有操作均在原始信号上执行。这是解决问题的好方法。