2015-10-14 80 views
0

我有四個std_logic_vectors(15 downto 0),並希望將它們堆疊到一個std_logic_vector(63 downt 0),所以我找到了一種方法,但它是正確的方式還是有一個更優化和正確的方法來做到這一點?VHDL多std_logic_vector到一個大的std_logic_vector

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; 
+2

也許VHDL別名是你的選擇。可以使用別名爲64位向量的一部分賦予一個新名稱,而所有操作都是在原始信號上執行的。 – Paebbels

+0

謝謝你解決問題的好方法。 – Mathias

回答

5

完成此操作的簡單方法是使用連接運算符&。它實現了上面所做的同樣的事情,但所需的代碼更少。

slv64 <= slv16_4 & slv16_3 & slv16_2 & slv16_1; 
+0

VHDL-2008還支持由片元素以及陣列基類型的元素組成的聚合。有些情況下使用聚合可以克服連接運算符的重載解析模糊性,而聚合是一項基本操作。 – user1155120

0

由於源矢量具有唯一的名稱,所以我沒有看到一種方法來自動執行此操作。你可能會嘗試的是從不使用16位向量,而是使用更大的64位向量片。因此,而不是分配是這樣的:

slv16_1 <= "0101"; 

使用

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

或代替實體實例,你連slv16_2這樣的:

output_port => slv16_2, 

使用

output_port => slv64(31 downto 16), 

我是ld確實需要看到更多的代碼給udnerstand什麼可能效果最好,但是我的基本答案是'首先使用更大的向量'。

如果你因爲某些原因做到這一點,那麼另一個辦法就是聲明你的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; 
0

VHDL指南說,這其中應該工作:

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