使用枚举类型,如下所示,有一种很好的方法可以获取枚举类型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!
根据David Koontz的回答,可以这样做:
constant ENUM_LENGTH : natural := enum_t'pos(enum_t'right) + 1;
答案 0 :(得分:3)
首先找到它的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;
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;
ghdl -r enum_length
enum_length.vhdl:13:5:@ 0ms :(断言错误):enum_t元素数= 3