Сначала найдите это позиционное значение, то вы можете получить 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
Цель состоит в том, чтобы получить количество элементов, таким образом, 3 для параметра enum_t в примере. И решение должно быть в целом применимо. – EquipDev
Хорошо, если вы посмотрите на левую позицию, вы найдете ее равной 0. Диапазон от 0 до 2 - это «длина» три. Добавьте один в нужное положение. – user1155120
OK, поэтому самый простой способ сделать это: 'enum_t'pos (enum_t'right) + 1', или даже требуется сделать' enum_t'pos (enum_t'right) - enum_t'pos (enum_t'left) + 1'? Ни один из способов не является изящным, но, вероятно, не то, что люди VHDL делают много ... – EquipDev