0

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

# 错误: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;
4

2 回答 2

1

端口addr是 astd_logic_vector并且不能直接转换为integer。将其转换为unsignedsigned首先:

dout <= 内容(TO_INTEGER(SIGNED(addr)));

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

变量 addr_var : 整数 := 0;
...
dout <= 内容(addr_var);

这两种解决方案中的哪一种适合您,这取决于addr您在访问CONTENT.

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

于 2013-06-15T13:10:22.103 回答
0

“addr”(整数变量,显然没有为其定义 TO_INTEGER)和“addr”(端口)之间存在名称冲突,“addr”(端口)是“位包”,因此同样没有 TO_INTEGER 方法。如果后者是 numeric_std 中的无符号(或有符号)类型,或者您将 STD_LOGIC_VECTOR 强制转换为无符号,那么您将拥有 TO_INTEGER 可以工作的数字。

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

顺便说一句,“addr”不需要(也不应该)是过程敏感度列表的一部分。

于 2013-06-15T22:44:59.637 回答