2013-06-15 4 views
0

이 실제 데이터에 대한 기능을 찾을 수 없습니다 :내 컴파일러는 나에게 이러한 오류를주고있다

# 오류 : COMP96_0305 : SUBONE_MODULE_VHDL.vhd (93, 23)이 실제 데이터에 대한 기능 "TO_INTEGER"를 찾을 수 없습니다.

# 에러 : COMP96_0138 : SUBONE_MODULE_VHDL.vhd (93, 23). 어레이 오브젝트에 대한 참조에서 색인 종류가 다양한 유형과 호환되지 **

library IEEE; 
use IEEE.STD_LOGIC_1164.all; 

use IEEE.NUMERIC_STD.all; 


entity SUBONE_MODULE_VHDL is 
port(
    addr : in STD_LOGIC_VECTOR(4 downto 0); 
    clk : in STD_LOGIC; 
    dout : out STD_LOGIC_VECTOR(4 downto 0) 
    ); 
end SUBONE_MODULE_VHDL; 


architecture SUBONE_MODULE_VHDL of SUBONE_MODULE_VHDL is  

type ROM_Array is array (0 to 31) 
of std_logic_vector(4 downto 0); 


constant Content: ROM_Array := (
    0 => "10011",  -- Suppose ROM has 
    1 => "00000",  -- prestored value 
    2 => "00001",  -- like this table 
    3 => "00010",    -- 
    4 => "00011",  -- 
    5 => "00100",    -- 
    6 => "00101",  -- 
    7 => "00110",    -- 
    8 => "00111",    -- 
    9 => "01000",    -- 
    10 => "01001",  -- 
    11 => "01010",   -- 
    12 => "01011",   -- 
    13 => "01100",  -- 
    14 => "01101",  -- 
    15 => "01110",  -- 
    16 => "01111",  -- 
    17 => "01110",  -- 
    18 => "01110",  -- 
    19 => "01110",  -- 
    20 => "01110",  -- 
    21 => "00000",  -- 
    22 => "00001",  -- 
    23 => "00010",  -- 
    24 => "00011",  -- 
    25 => "00100",  -- 
    26 => "00101",  -- 
    27 => "00110",  -- 
    28 => "00111",  -- 
    29 => "01000",  -- 
    30 => "01001",  -- 
    31 => "01010",  -- 
OTHERS => "00000" 
);  

begin 
    process(clk, addr) 
    variable addr : integer := 0; 
    begin 
     if(clk'event and clk = '1') then 
      dout <= Content(TO_INTEGER(addr)); 
     end if; 
    end process; 

end SUBONE_MODULE_VHDL; 

답변

0

포트 addrstd_logic_vector이며 직접 integer으로 전송할 수 없습니다. unsigned 또는 첫번째 signed에 캐스팅 :

dout <= Content(TO_INTEGER(SIGNED(addr)));

편집 : addr라는 이름의 변수와 같은 이름의 포트와 충돌도 있습니다. 따라서 변수 이름을 예를 들어로 바꿉니다. addr_var으로 문제가 해결됩니다. 이 경우에는 형 캐스트가 필요하지 않습니다. 두 솔루션의 당신을위한 권리입니다

variable addr_var : integer := 0;
...
dout <= Content(addr_var);

CONTENT에 액세스하는 동안 사용할들이 의도 addr하는에 따라 달라집니다.

일반적으로 포트, 신호 또는 변수에 대해 똑같은 이름을 다시 사용하는 것은 좋지 않습니다.

0

"addr"(TO_INTEGER이 분명히 정의되지 않은 정수 변수)과 "비트 가방"인 "addr"(포트) 사이에 이름 충돌이 있으므로 TO_INTEGER 방법. 후자가 numeric_std의 부호없는 (또는 서명 된) 유형이거나 STD_LOGIC_VECTOR를 부호가없는 것으로 변환하면 TO_INTEGER가 작동하는 숫자가됩니다.

"addr"변수를 제거하고 "addr"포트를 부호없는 또는 Natural (음수가 아닌 형식)으로 만들 수 있습니다.

"addr"은 프로세스 감도 목록의 일부일 필요는 없습니다.