VHDL 将向量数组连接到向量
VHDL concatenate array of vectors to vector
我一直在尝试实现一种方法,通过该方法可以将向量数组连接到一个向量。基本上我需要这样的东西:
data_received((rx_length_int + 5) * 8)downto 0) <= rx_ident & rx_length & rx_data & rx_checksum;
data_received(BUILD2_RX_PKT_LEN downto ((rx_length_int + 5) * 8)) <= (others => '0');
其中 BUILD2_RX_PKT_LEN 是恒定大小,rx_data 具有可变字节数,但定义为:
type t_rx_data is array (0 to MAX_PLD) of STD_LOGIC_VECTOR((ADDRESS_WIDTH - 1) downto 0)
我已经实现了一些方法,例如循环遍历 rx_data 直到 rx_length_int,但是随着大小的增加,与 data_received 的连接存在问题......我确定有一个非常简单的解决方案,但我一直无法想出一个。任何帮助将不胜感激。
您可以构建具有指定范围的聚合,而不是依赖于结果类型来约束范围的无约束聚合(others => 0)
,例如(7 downto 2 => '0')
.
那为什么不
data_received <= (BUILD2_RX_PKT_LEN downto ((rx_length_int + 5) * 8) => '0')
& rx_ident & rx_length & rx_data & rx_checksum;
然而,它笨拙得令人难以理解。更好的方法是填充函数:
function pad_packet (data : std_logic_vector) return std_logic_vector is
variable temp : std_logic_vector (BUILD2_RX_PKT_LEN downto 1) := (others => '0');
-- NB "downto 0" would be an off-by-1 error if LEN is actual length
-- Initialised vhole vector to zero
begin
temp (data'length downto 1) := data;
return temp;
end pad_packet;
...
data_received <= pad_packet ( rx_ident & rx_length & rx_data & rx_checksum );
清晰多了...
我一直在尝试实现一种方法,通过该方法可以将向量数组连接到一个向量。基本上我需要这样的东西:
data_received((rx_length_int + 5) * 8)downto 0) <= rx_ident & rx_length & rx_data & rx_checksum;
data_received(BUILD2_RX_PKT_LEN downto ((rx_length_int + 5) * 8)) <= (others => '0');
其中 BUILD2_RX_PKT_LEN 是恒定大小,rx_data 具有可变字节数,但定义为:
type t_rx_data is array (0 to MAX_PLD) of STD_LOGIC_VECTOR((ADDRESS_WIDTH - 1) downto 0)
我已经实现了一些方法,例如循环遍历 rx_data 直到 rx_length_int,但是随着大小的增加,与 data_received 的连接存在问题......我确定有一个非常简单的解决方案,但我一直无法想出一个。任何帮助将不胜感激。
您可以构建具有指定范围的聚合,而不是依赖于结果类型来约束范围的无约束聚合(others => 0)
,例如(7 downto 2 => '0')
.
那为什么不
data_received <= (BUILD2_RX_PKT_LEN downto ((rx_length_int + 5) * 8) => '0')
& rx_ident & rx_length & rx_data & rx_checksum;
然而,它笨拙得令人难以理解。更好的方法是填充函数:
function pad_packet (data : std_logic_vector) return std_logic_vector is
variable temp : std_logic_vector (BUILD2_RX_PKT_LEN downto 1) := (others => '0');
-- NB "downto 0" would be an off-by-1 error if LEN is actual length
-- Initialised vhole vector to zero
begin
temp (data'length downto 1) := data;
return temp;
end pad_packet;
...
data_received <= pad_packet ( rx_ident & rx_length & rx_data & rx_checksum );
清晰多了...