2013-12-16 34 views
1

令人煩惱的是,我知道如何在C++中輕鬆完成此操作,而不是在VHDL中。我想從一個約束的三維陣列中的數據快速,輕鬆地轉移到一個二維數組,如:如何以VHDL傳輸陣列數據?

2d_array[N][M] 
3d_array[i][N][M] 

2d_array=3d_array[i] 

所以我的VHDL看起來是這樣的:

type buff_array is array(2 downto 0, 7 downto 0) of std_logic_vector(31 downto 0); 
    type ram_array is array(7 downto 0) of std_logic_vector(31 downto 0); 
    shared variable ram: ram_array; 
    shared variable buff: buff_array; 

而且我願意做這樣的事情:

if we = '1' then 
       buff(pua, addr) := d; 
       ram:=buff(poa); 
      end if; 

任何想法?

而且我知道我能爲循環做一個快速的,但我想嘗試和避免額外的邏輯

+1

不要使用共享變量 - 您正在爲未來儲存潛在的問題!最近有幾個帖子使用它們,誰在教這個? –

回答

2

快速修復是聲明buff_array爲:

type buff_array is array(2 downto 0) of ram_array; 

然後當然放的聲明buf_array申報ram_array後。

用於2D/3D陣列

實施例:

type array_2d_t is array(2 downto 0, 1 downto 0) of std_logic_vector(31 downto 0); 
type array_3d_t is array(3 downto 0) of array_2d_t; 
shared variable array_2d_v : array_2d_t; 
shared variable array_3d_v : array_3d_t; 
... 
array_2d_v := array_3d_v(1); 
+0

這會給我我想要的3D陣列嗎? – fiz

+0

如果將此擴展爲3D,則可應用相同的原則。 Se在答案中增加了一個例子 –

+0

感謝您的信息。它的工作,但唯一的問題是,如果我現在嘗試寫我的std_logic_vector例如buff(3,1),它說:「索引名稱前綴類型buff_array期望1維」 – fiz

4

只能分配整個陣列如果它們是相同類型的。 因此,考慮

type ram_array is array(7 downto 0) of std_logic_vector(31 downto 0); 

你可以聲明變量 - 甚至陣列 - 這種類型的。

signal buf : ram_array; 
signal ram_2d: array(2 downto 0) of ram_array; 

現在buf <= ram_2d(1)應該工作。

1

這只是說明Morten對那些想要了解問題和解決方案的答案,否則這些問題會被共享的變量名稱更改和缺乏LRM引用所遮蔽。

此示例分析:

library ieee; 
use ieee.std_logic_1164.all; 

package declare is 
-- type buff_array is array(2 downto 0, 7 downto 0) of std_logic_vector(31 downto 0); 
    type ram_array is array(7 downto 0) of std_logic_vector(31 downto 0); 
    type buff_array is array (2 downto 0) of ram_array; -- added declaration 
    shared variable ram: ram_array; 
    shared variable buff: buff_array; 
end package; 

library ieee; 
use ieee.std_logic_1164.all; 
use work.declare.all; 

entity ramarray is 
end entity; 

architecture foo of ramarray is 
    signal we: std_logic; 
begin 
    we <= '1'; 
SOMELABEL: 
    process (we) 
    begin 
     if we = '1' then 
      ram := buff(1); -- unchanged 
     end if; 
    end process; 

end architecture; 

多維切片不允許[1]。通過將buff轉換爲數組子類型的數組類型的數組來分離每個維度的索引,可以讓賦值運算符的兩側具有相同的基本類型,爲元素類型爲ram_array的單維數組提供切片名稱。


[1] IEEE標準1076年至2008年,第8.5節切片名「A切片名稱表示另一個一維陣列的連續元素的序列組成的一維陣列。的信號的切片是一個信號;一個變量的切片是一個變量;一個常量的切片是一個常量;一個切片的值是一個值。「

另請參見快速通道更改提案FT-15 Slicing of multidimensional arrays and arrays of arrays 從2004年6月起,仍在進行中。

4

回覆:

我知道我能爲循環做一個快速的,但我想嘗試和避免額外的邏輯

for循環只是從一個地方複製值到另一個不會是任何邏輯 - 編譯器將展開循環並創建你所描述的佈線。

這是一個常見的誤解,認爲使用for循環可以實現大邏輯。它的真正含義是它多次重複了循環內部的邏輯,所以如果循環中的邏輯是微不足道的,展開版本也是如此。它不創建計數器和比較器等。

(並且,原諒推測,作爲VHDL的一個相對新手,不要擔心邏輯的數量。當然,通過綜合塊來關注事物去吧,但是你可能會驚訝於a)這些工具的性能如何,以及b)這些設備有多大?:)避免過早的優化,就像軟件一樣!

+0

我希望我可以upvote這兩次。 – rick

+0

希望我可以打勾多個答案 – fiz

+0

@fiz:你總是可以問一個關於循環是否推斷額外邏輯的問題,我也會將答案粘貼在那裏(只是在開玩笑:) –