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 );

清晰多了...