无法找到这些实际的功能

时间:2013-06-15 01:26:18

标签: vhdl fpga synthesis asic

我的编译器给了我这些错误:

#错误:COMP96_0305:SUBONE_MODULE_VHDL.vhd:(93,23):找不到这些实际值的功能“TO_INTEGER”。

#Error: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;

2 个答案:

答案 0 :(得分:0)

端口addrstd_logic_vector,无法直接投放到integer。首先将其投放到unsignedsigned

  

dout&lt; = Content(TO_INTEGER(SIGNED(addr)));

编辑:与名为addr的变量和同名端口之间也存在冲突。 因此,将变量重命名为例如addr_var将解决问题。在这种情况下,不需要任何类型转换。

  

变量addr_var:integer:= 0;
  ...
  dout&lt; = Content(addr_var);

这两个解决方案中哪一个适合您,取决于您在访问addr时打算使用哪个CONTENT

通常,对端口,信号或变量重复使用完全相同的名称是个坏主意。

答案 1 :(得分:0)

“addr”(整数变量,显然没有定义TO_INTEGER)和“addr”(端口)之间存在名称冲突,这是一个“包位”,因此,再次没有TO_INTEGER方法。如果后者是来自numeric_std的无符号(或签名)类型,或者您将STD_LOGIC_VECTOR强制转换为无符号,那么您将拥有TO_INTEGER可用的数字。

我的偏好是消除变量“addr”并使“addr”端口无符号,甚至是Natural(非负形式的Integer)。

顺便说一下,“addr”不需要(也不应该)成为过程敏感性列表的一部分。