继续使用数组出错(控制内存,vhdl)

时间:2014-04-01 16:47:50

标签: 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 : 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;

2 个答案:

答案 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缺失的原因,以及之后的每一个也是如此)。