如何获取枚举类型中的元素数量

时间:2014-09-28 04:39:34

标签: vhdl

使用枚举类型,如下所示,有一种很好的方法可以获取枚举类型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;

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