我正在尝试实现控制内存,但我一直得到“数组聚合中缺少索引32的实际值”。错误。这应该是256 x 28控制内存。有人知道我的代码中导致此错误的原因吗?
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use
IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity control_memory is
Port ( mw : out STD_LOGIC;
mm : out STD_LOGIC;
rw : out STD_LOGIC;
md : out STD_LOGIC;
fs : out STD_LOGIC_VECTOR (4 downto 0);
mb : out STD_LOGIC;
tb : out STD_LOGIC;
ta : out STD_LOGIC;
td : out STD_LOGIC;
pl : out STD_LOGIC;
pi : out STD_LOGIC;
il : out STD_LOGIC;
mc : out STD_LOGIC;
ms : out STD_LOGIC_VECTOR (2 downto 0);
na : out STD_LOGIC_VECTOR (7 downto 0);
in_car : in STD_LOGIC_VECTOR (7 downto 0));
end control_memory;
architecture Behavioral of control_memory is
type mem_array is array(0 to 255) of STD_LOGIC_VECTOR(27 downto 0);
begin
memory_m : process(in_car) variable control_mem : mem_array:=(
X"FFFFFFF",
X"0000000",
X"AAAAAAA",
X"0000000",
X"BBBBBBB",
X"0000000",
X"CCCCCCC",
X"0000000",
X"DDDDDDD",
X"0000000",
X"1111111",
X"0000000",
X"2222222",
X"0000000",
X"3333333",
X"0000000",
X"0000000",
X"0000000",
X"0000000",
X"0000000",
X"0000000",
X"0000000",
X"0000000",
X"0000000",
X"0000000",
X"0000000",
X"0000000",
X"0000000",
X"0000000",
X"0000000",
X"0000000",
X"0000000");
variable addr : integer;
variable control_out : std_logic_vector(27 downto 0);
begin
addr := conv_integer(in_car);
control_out := control_mem(addr);
MW <= control_out(0);
MM <= control_out(1);
RW <= control_out(2);
MD <= control_out(3);
FS <= control_out(8 downto 4);
MB <= control_out(9);
TB <= control_out(10);
TA <= control_out(11);
TD <= control_out(12);
PL <= control_out(13);
PI <= control_out(14);
IL <= control_out(15);
MC <= control_out(16);
MS <= control_out(19 downto 17);
NA <= control_out(27 downto 20);
end process;
end Behavioral;
答案 0 :(得分:2)
鉴于这些声明,
type mem_array is array(0 to 255) of STD_LOGIC_VECTOR(27 downto 0);
memory_m : process(in_car)
variable control_mem : mem_array:=(
X"FFFFFFF",
...
X"0000000");
用于初始化control_mem的聚合应该提供256个条目;显然(我还没算过!)它只提供0到31的条目,因此你会收到错误。
最容易提供缺失的条目,使用默认的&#34;其他&#34;子句。
memory_m : process(in_car)
variable control_mem : mem_array:=(
X"FFFFFFF",
...
X"0000000",
others => X"0000000");
编辑以显示大卫建议使用命名关联。
命名关联在许多地方都很有用,包括过程参数列表。 一个很好的用途是 - 在这里 - 数组是稀疏的,因为只需要明确设置有趣的值;默认&#34;其他&#34;照顾其他人。
memory_m : process(in_car)
variable control_mem : mem_array:=(
0 => X"FFFFFFF",
2 => X"AAAAAAA",
4 => X"BBBBBBB",
...
14 => X"3333333",
others => X"0000000");
答案 1 :(得分:0)
您对流程中control_mem
变量的赋值是总共32个向量。但是,control_mem
的类型为mem_array
,这是一个包含256个向量(0 to 255
)的数组。因此,您只分配0到31(这就是为什么32缺失的原因,以及之后的每一个也是如此)。