VHDL赋值给数组类型

时间:2016-07-04 04:27:27

标签: arrays types vhdl variable-assignment

考虑一种类型

type foo is array (0 downto 0) of std_logic_vector(7 downto 0);

例如,当我尝试创建此类型的常量值时,为什么会出现编译器错误。请注意,我只尝试过使用Altera的Quartus II。

constant cFoo : foo := ( x"11" );
  

错误:[filename.vhd]上的VHDL类型不匹配错误(行号):cFoo类型与字符串文字不匹配。

但是,如果我的类型是

,一切都可以
type foo is array (0 downto 0) of std_logic_vector(7 downto 0); 

示例赋值为常量:

constant cFoo : foo := ( x"00", x"11" );

此外,考虑我尝试将索引0与另一个常量分配。例如。

type foo is array (0 downto 0) of std_logic_vector(7 downto 0);
constant cBar : std_logic_vector(7 downto 0); 
constant cFoo : foo := ( cBar  );

编译器吐出的错误现在是:

  

[filename.vhd]的VHDL错误(行号):标识符的类型" cBar"不同意它的用法" foo"类型。

所以基本上告诉我编译器没有意识到赋值是0的索引,而是分配给数组类型。

如何让编译器知道赋值只是索引0?

1 个答案:

答案 0 :(得分:4)

IEEE Std 1076 9.3.3聚合,9.3.3.1第4段:

  

命名和位置关联都可以在同一个聚合中使用,所有位置关联首先出现(按文本顺序排列),所有命名关联出现在下一个(按任何顺序排列,但如果任何关联跟随<强>其他协会)。 应始终使用命名关联指定包含单个元素关联的聚合,以便将它们与带括号的表达式区分开来。

使用MCVE

library ieee;
use ieee.std_logic_1164.all;

package ceefoo is
    type foo is array (0 downto 0) of std_logic_vector(7 downto 0);
    -- constant cFoo : foo := ( x"11" );
    constant cfoo:  foo := (0 => x"11");
    -- or
    constant cefoo: foo := (others => x"11");
end package;

您需要将命名关联与单个元素一起使用。第一个示例指定索引0,第二个示例指定任何元素。

上述引用小节的第3段:

  

每个元素关联将表达式与元素(可能没有)相关联。如果元素由选项明确指定,则称该元素关联被命名;否则,据说是位置。对于位置关联,每个元素由相应类型声明中元素的文本顺序中的位置隐式指定。

看到BNF很有帮助:

  

aggregate :: =
      element_association {,element_association}

     

element_association :: =
  [choices =&gt; ]表达

     

选择:: =选择{ | 选择}

     

选择:: =
  simple_expression
   | discrete_range
   | 元素 _simple_name
   | 其他人