2016-01-28 55 views
0

您好我正在嘗試使用ARRAYS的內存。我想將4個較小的ARRAYS連接成一個更大的ARRAY。我已經使用&這樣做,因爲這樣的嘗試:兩種陣列類型的VHDL串聯std_logic

MEM_STRING(1) <= MEM_CHAR(3) & MEM_CHAR(3) & MEM_CHAR(0) & MEM_CHAR(1); 

但是編譯器說,它發現沒有&字符的定義。 MEM_STRING(1)是28位,每個MEM_CHAR是7位。 我可以將每個MEM_CHAR轉換爲std_logic_vector,分配給一個信號,然後連接,但它似乎是一個很長的路要走的事情。有沒有其他方法可以做到這一點?

TYPE SEG7 IS ARRAY (6 DOWNTO 0) OF std_logic; 
TYPE REG_CHAR IS ARRAY (3 DOWNTO 0) OF SEG7; --Array block for characters 
TYPE STRINGS IS ARRAY (27 DOWNTO 0) OF std_logic; 
TYPE REG_STRINGS IS ARRAY (6 DOWNTO 0) OF STRINGS; --Array block for strings 
SIGNAL MEM_CHAR   : REG_CHAR; --Assign character 
SIGNAL MEM_STRING  : REG_STRINGS; --Assign String 

這些是ARRAY使用的刪除。 最佳方面 d

+0

您是否可以顯示聲明,包括您聲明的任何類型? – user1155120

回答

1

我可以每個MEM_CHAR到std_logic_vector,分配給一個信號,然後轉換成串聯,但它似乎是一個很長的路要走的事。有沒有其他方法可以做到這一點?

MEM_CHAR和std_logic_vector沒有緊密相關。 MEM_CHAR的元素類型是SEG7,std_logic_vector的元素類型是std_ulogic。

您應該創建類型REG_CHAR的集合,轉換至類型字符串:

library ieee; 
use ieee.std_logic_1164.all; 

entity memchar is 
end entity; 

architecture foo of memchar is 

    TYPE SEG7 IS ARRAY (6 DOWNTO 0) OF std_logic; 
    TYPE REG_CHAR IS ARRAY (3 DOWNTO 0) OF SEG7; --Array block for characters 
    TYPE STRINGS IS ARRAY (27 DOWNTO 0) OF std_logic; 
    TYPE REG_STRINGS IS ARRAY (6 DOWNTO 0) OF STRINGS; --Array block for strings 
    SIGNAL MEM_CHAR:   REG_CHAR; --Assign character 
    SIGNAL MEM_STRING:   REG_STRINGS; --Assign String 

    function to_strings (REGC: REG_CHAR) return STRINGS is 
     variable retstr: STRINGS; 
     subtype strings_range is natural range STRINGS'RANGE; 
     variable retptr: strings_range; -- default value is STRINGS'LEFT 
    begin 
     for i in REG_CHAR'RANGE loop -- 3 downto 0 
      for k in SEG7'RANGE loop -- 6 downto 0 
       retstr(retptr) := REGC(i)(k); 
       if retptr /= 0 then  -- quit decrementing at 0 
        retptr := retptr - 1; 
       end if; 
      end loop; 
     end loop; 
     return retstr; 
    end function; 

begin 
    -- MEM_STRING(1) <= MEM_CHAR(3) & MEM_CHAR(3) & MEM_CHAR(0) & MEM_CHAR(1); 
    MEM_STRING(1) <= to_strings(REG_CHAR'(MEM_CHAR(3), 
              MEM_CHAR(3), 
              MEM_CHAR(0), 
              MEM_CHAR(1) 
              ) 
           ); 

end architecture; 

這個例子的分析,闡述和模擬,它告訴我們總的元素的長度的總和相匹配STRINGS長度。

注意從左到右的順序保存在函數to_strings中。

而且值得一提的是,所有這些迂迴的定義都是痛苦的,更沒有提供Minimal, Complete, and Verifiable example的問題。如果

+0

非常感謝您的時間和幫助,非常感謝。我正在燃燒午夜油,因此這是一個糟糕的帖子,非常感謝。 – hoboBob

0

代替:

TYPE SEG7 IS ARRAY (6 DOWNTO 0) OF std_logic; 
TYPE STRINGS IS ARRAY (27 DOWNTO 0) OF std_logic; 

你做到:

subtype SEG7 IS std_logic_vector(6 DOWNTO 0) ; 
subtype STRINGS IS std_logic_vector(27 DOWNTO 0) ; 

然後,你可以這樣做:

MEM_STRING(1) <= MEM_CHAR(3) & MEM_CHAR(3) & MEM_CHAR(0) & MEM_CHAR(1); 

或者:

MEM_STRING(1) <= MEM_CHAR(3) & MEM_CHAR(2) & MEM_CHAR(1) & MEM_CHAR(0); 

您也可以跳過創建子類型SEG7和STRINGS並完成:

--Array block for characters  
TYPE REG_CHAR IS ARRAY (3 DOWNTO 0) OF std_logic_vector(6 DOWNTO 0) ; 
--Array block for strings 
TYPE REG_STRINGS IS ARRAY (6 DOWNTO 0) OF std_logic_vector(27 DOWNTO 0) ; 
SIGNAL MEM_CHAR   : REG_CHAR; --Assign character 
SIGNAL MEM_STRING  : REG_STRINGS; --Assign String