对于枚举类型,如下所示,有一种不错的方法来获取枚举类型中的元素数enum_t:
type enum_t is (ALFA, BRAVO, CHARLIE); -- Number of elements is 3
-- Don't work: length is not valid attribute for enum_t
constant ENUM_LENGTH : natural := enum_t'length; -- illegal!
Run Code Online (Sandbox Code Playgroud)
根据David Koontz的回答,可以完成以下操作:
constant ENUM_LENGTH : natural := enum_t'pos(enum_t'right) + 1;
Run Code Online (Sandbox Code Playgroud)
首先找到它的POSitional值,然后可以让VHDL告诉你它是什么:
entity enum_length is
end entity;
architecture foo of enum_length is
type enum_t is (ALFA, BRAVO, CHARLIE);
constant enum_left: natural := enum_t'POS(ALFA);
constant enum_right: natural := enum_t'POS(CHARLIE);
begin
assert FALSE
Report "CHARLIE POS = " & natural'IMAGE(enum_right);
end architecture;
Run Code Online (Sandbox Code Playgroud)
ghdl -r enum_length
enum_length.vhdl:9:5:@ 0ms :(断言错误):CHARLIE POS = 2
参见IEEE Std 1076-2008 5.2.2.1(枚举类型)概述第6段:
每个枚举文字都会产生不同的枚举值。枚举值之间的预定义顺序关系遵循相应位置编号的顺序。列出的第一个枚举文字的值的位置编号为零;每个其他枚举文字的位置号都比其列表中的前一个数字大一。
因此,最左边的枚举值的位置为0。最右边的枚举值的位置比元素数少一。您还可以找到最右边的“ VAL”并找到它的位置:
entity enum_length is
end entity;
architecture foo of enum_length is
type enum_t is (ALFA, BRAVO, CHARLIE);
constant enum_left: natural := enum_t'POS(ALFA);
constant enum_right: natural := enum_t'POS(CHARLIE);
constant enum_t_elems: natural:= enum_t'POS(enum_t'RIGHT) + 1;
begin
-- assert FALSE
-- Report "CHARLIE POS = " & natural'IMAGE(enum_right);
assert FALSE
Report "enum_t number of elements = " & natural'IMAGE(enum_t_elems);
end architecture;
Run Code Online (Sandbox Code Playgroud)
ghdl -r enum_length
enum_length.vhdl:13:5:@ 0ms :(断言错误):enum_t元素数= 3