考虑一种类型
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?
答案 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
| 其他人