2016-04-15 199 views
2

INTENTION:VHDL - std_logic_vectors的數組轉換成std_logic_vector

我從上ZedBoard RAM讀數據時,RAM有32位長字,所以我使用下面的緩衝

type mem_word is array (0 to 127) of std_logic_vector(31 downto 0); 
signal buffer_word : mem_word; 

但然後,我想以線性方式解決數據中的一箇中間線性緩衝區

signal buffer_linear : std_logic_vector(4095 downto 0); 
buffer_linear <= buffer_word; -- !!! PROBLEM 

所以我可以很容易地解決任何問題位而不重新計算(buffer_word的)特定字中的位置。

問題:

如何從std_logic_vectors的陣列進入1個長std_logic_vector?有沒有辦法避免在循環中連接128個單詞? (類似buffer_linear < = buffer_word;

回答

4

您需要一個函數將矢量矢量轉換爲一維矢量。

我下面的例子使用類型名稱T_SLVV_32來表示它是向量的向量,而內部向量是32位長。 (請參閱我的鏈接源文件,獲取名爲T_SLM的真正的2維STD_LOGIC矩陣類型)。因此T_SLVV_32等同於您的mem_word類型。

subtype T_SLV_32 is STD_LOGIC_VECTOR(31 downto 0); 
type T_SLVV_32 is array(NATURAL range <>) of T_SLV_32; 

function to_slv(slvv : T_SLVV_32) return STD_LOGIC_VECTOR is 
    variable slv : STD_LOGIC_VECTOR((slvv'length * 32) - 1 downto 0); 
begin 
    for i in slvv'range loop 
    slv((i * 32) + 31 downto (i * 32))  := slvv(i); 
    end loop; 
    return slv; 
end function; 

用法:

buffer_linear <= to_slv(buffer_word); 

該函數創建沒有邏輯,只是佈線。
注意:一次訪問存儲器的所有位,會阻止推理RAM或ROM存儲器塊的綜合工具!

來源:PoC.vectors

參見由GitHub我的向量包上變換向量和矩陣闡述和向後更多的例子。

+0

RAM塊可以使用的條件是什麼?一次訪問位是否有限制? –

+2

@MartinG最好的辦法是看看你的綜合工具內存推理模式。例如這裏http://www.xilinx.com/support/documentation/sw_manuals/xilinx2014_1/ug901-vivado-synthesis.pdf第95頁及以後 –

+0

該條件可能包括讀寫過程都是同步的,即因爲BlockRam是一個同步RAM,並且同時讀取一些上限(32或64)位。 –

相關問題