VHDL: Почему длина не определена для перечислений?
У меня есть следующее объявление enum:
type T_STATUS is ( -- position / index
STATUS_INIT, -- pos = 0
STATUS_RECONFIGURING, -- pos = 1
STATUS_RELOADING, -- pos = 2
STATUS_READY, -- pos = 3
STATUS_ERROR -- pos = 4
);
Почему нельзя использовать T_STATUS'length
чтобы подсчитать T_STATUS
Члены?
Пример кода:
constant Count : POSITIVE := T_STATUS'length;
Временное решение:
Это можно получить с помощью T_STATUS'high
а также T_STATUS'pos
следующее:
constant Count : POSITIVE := T_STATUS'pos(T_STATUS'high) + 1;
Это работает, потому что 'high
дает последний член enum и 'pos
преобразует этого члена в его позицию в списке enum. Поскольку позиции начинаются с 0, нужно добавить 1, чтобы получить правильное количество / длину.
2 ответа
@Paebbels
Никто не просил это ни для одной из предыдущих ревизий. Кстати, рабочей группе нужны дополнительные опытные пользователи, такие как вы сами, чтобы участвовать. Это поможет нам сделать соответствующую работу для следующего пересмотра.
Этот запрос фиксируется здесь: http://www.eda.org/twiki/bin/view.cgi/P1076/EnumAttributes
Наш твик начинается здесь: http://www.eda.org/twiki/bin/view.cgi/P1076/
Текущие предложения находятся здесь: http://www.eda.org/twiki/bin/view.cgi/P1076/CollectedRequirements
Информация о собрании находится здесь: http://www.eda.org/twiki/bin/view.cgi/P1076/MeetingMinutes
IEEE 1076 - это индивидуальная рабочая группа, которая поощряет участие сообщества VHDL. Для участия в программе нет особых требований к членству. Помогите сформировать следующую ревизию, присоединяйтесь к нам.
Джим Льюис 1076 WG Стул
Немного более конкретно, перечислимый тип - это скалярный тип, а не тип массива.
'LENGTH
указано в IEEE Std 1076-2008 16.2.3 Предопределенные атрибуты массивов.
И из 5.2.2 Типы перечисления, 5.2.2.1 Общие, пункт 5:
Каждый литерал перечисления дает другое значение перечисления. Предопределенные отношения порядка между значениями перечисления следуют за порядком соответствующих номеров позиций. Номер позиции значения первого перечисленного литерала перечисления равен нулю; номер позиции для каждого дополнительного литерала перечисления на один больше, чем у его предшественника в списке.
мы видим, что каждый литерал перечисления представляет номер позиции, основанный на его порядке объявления, а первое значение имеет номер позиции, равный нулю (основа для вашего "обходного пути").
Все это происходит потому, что VHDL является формальным обозначением. Длина не описывает диапазон значений, она описывает количество элементов в массиве.