2014-09-28 4 views
4

С перечислимым типом, как и ниже, есть хороший способ, чтобы получить число элементов в перечисленном типе 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! 

На основании ответа от Давида Кунц это может быть сделано как:

constant ENUM_LENGTH : natural := enum_t'pos(enum_t'right) + 1; 

ответ

3

Сначала найдите это позиционное значение, то вы можете получить 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: (ошибка утверждение): ЧАРЛИ 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

+0

Цель состоит в том, чтобы получить количество элементов, таким образом, 3 для параметра enum_t в примере. И решение должно быть в целом применимо. – EquipDev

+0

Хорошо, если вы посмотрите на левую позицию, вы найдете ее равной 0. Диапазон от 0 до 2 - это «длина» три. Добавьте один в нужное положение. – user1155120

+1

OK, поэтому самый простой способ сделать это: 'enum_t'pos (enum_t'right) + 1', или даже требуется сделать' enum_t'pos (enum_t'right) - enum_t'pos (enum_t'left) + 1'? Ни один из способов не является изящным, но, вероятно, не то, что люди VHDL делают много ... – EquipDev

Смежные вопросы