不断获取阵列错误(控制内存,vhdl)

不断获取阵列错误(控制内存,vhdl),vhdl,Vhdl,我试图实现控制内存,但我一直得到“数组聚合中缺少索引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

我试图实现控制内存,但我一直得到“数组聚合中缺少索引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;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用
IEEE.STD_逻辑_算术ALL;
使用IEEE.STD_LOGIC_UNSIGNED.ALL;
实体控制_内存不可用
端口(mw:输出标准逻辑;
mm:输出标准逻辑;
rw:输出标准_逻辑;
md:输出标准逻辑;
fs:输出标准逻辑向量(4到0);
mb:输出标准逻辑;
tb:输出STD_逻辑;
ta:输出标准逻辑;
td:输出标准逻辑;
pl:输出标准逻辑;
pi:输出标准逻辑;
il:输出标准逻辑;
mc:输出标准逻辑;
ms:输出标准逻辑向量(2到0);
na:输出标准逻辑向量(7到0);
车内:标准逻辑车内向量(7到0);
端控存储器;
控制内存的行为体系结构是
mem_类型数组是STD_逻辑_向量(27到0)的数组(0到255);
开始
内存:进程(车内)变量控制内存:内存数组:=(
X“FFFFFFF”,
X“0000000”,
X“AAAAA”,
X“0000000”,
X“BBBBBBB”,
X“0000000”,
X“CCCCC”,
X“0000000”,
X“ddddd”,
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”);
变量addr:整数;
变量控制输出:标准逻辑矢量(27至0);
开始
地址:=conv_整数(在车内);
控制输出:=控制内存(地址);

MW您在流程中分配给
控制_mem
变量的是32个向量的集合<但是,代码>控制\内存
属于
内存数组
,它是一个256个向量的数组(
0到255
)。因此,您只将0分配给31(这就是为什么32缺失的原因,之后的每一个也是如此)。

鉴于这些声明

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,因此您会收到错误

使用默认的“others”子句最容易提供缺少的条目

编辑以显示David建议的命名关联的使用

命名关联在许多地方都很有用,包括过程参数列表。 一个很好的用途是数组稀疏,因为只需要显式设置感兴趣的值;默认的“others”处理其余部分

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");
在聚合中,“如果元素是由选项显式指定的,则称为元素关联;否则称为位置关联”。Brian的回答同时使用位置关联和命名关联(
others=>…
)来定义
control\u mem
的聚合默认值。当使用这两个关联时,必须像Brian一样首先列出位置。如果您希望索引值方便,还可以使用单独命名的关联(例如
0=>x“FFFFFFF”、1=>x“0000000”、2=>x“AAAAAAA”…,其他=>x“0000000”
)。
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");