我的编译器给了我这些错误:
#错误: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;
答案 0 :(得分:0)
端口addr
是std_logic_vector
,无法直接投放到integer
。首先将其投放到unsigned
或signed
:
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”不需要(也不应该)成为过程敏感性列表的一部分。