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

Equ*_*Dev 6 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!
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)

use*_*120 5

首先找到它的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