2015-06-24 3 views
2

У меня есть следующее перечислимое заявление:VHDL: Почему длина не определена для перечислений?

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 дает последний член перечисления и 'pos преобразует этот член в его позицию в enum lis т. Поскольку позиции начинаются с 0, нужно добавить 1, чтобы получить правильное количество/длину.

+0

См. [Как получить количество элементов в перечисляемом типе] (http://stackoverflow.com/questions/26081676/how-to-get-number-of-elements-in-enumerated-type). Что не совсем ясно, так это то, что полезно знать количество * позиций * в перечислимом типе, возможно, вы могли бы просвещать читающую аудиторию. – user1155120

+1

@DavidKoontz: Пример использования - это то, что значения перечисляемого типа иногда передаются через «std_logic_vector» в общем FIFO или ОЗУ, а минимальная длина 'std_logic_vector' тогда зависит от количества элементов в перечисляемом типе. –

+0

@DavidKoontz В некоторых случаях необходимо передавать перечисления через общие модули, такие как FIFO, синхронизирующие синхронизаторы и так далее. Или нужно подключить перечисления к интегрированным логическим анаслизерам, таким как ChipScope. Все эти случаи нуждаются в: - я бы назвал это - метод сериализации в std_logic_vector, который должен знать, сколько бит требуется. Можно также обсудить, должны ли перечисления иметь атрибут «serialize» :). ОК, солнце встает, и я отредактирую страницу twiki .. – Paebbels

ответ

2

@Paebbels

Никто не просил это для любого из предыдущих редакций. Кстати, рабочей группе нужны дополнительные опытные пользователи, такие как вы сами, чтобы участвовать. Это поможет нам получить соответствующую работу для следующего пересмотра.

Этот запрос захватывается здесь: http://www.eda.org/twiki/bin/view.cgi/P1076/EnumAttributes

Наш TWiki начинается здесь: 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 Председатель

+0

Я обновляю страницу EnumAttributes и добавлю свои варианты использования в раздел «Использование моделей». Это путь intedend? Я использую эту конструкцию для сериализации/deserislize перечислений в строки или std_logic_vectors и наоборот. Если инструмент синтеза поддерживает ввод/вывод файлов, это очень помогает в отладке :). Потому что другие инструменты могут считывать экспортированную информацию. – Paebbels

+0

Для сериализации в строки я просто использовал бы «образ» и «значение». Но это не помогает с std_logic_vector, хотя '' enum_encoding' может. –

+0

@briandrummond О, извините, мой комментарий был немного коротким. Для сериализации в строку я тоже использую «образ». Значение не поддерживается всеми инструментами. Мое обходное решение - это цикл для проверки всех результатов изображения, пока он не совпадёт :). – Paebbels

2

Чуть больше к точке, нумерованный тип является скалярным типом не является типом массива.

'LENGTH указан в IEEE Std 1076-2008 16.2.3 Предопределенные атрибуты массивов.

А из 5.2.2 перечислимых типов, 5.2.2.1 Генеральных, пункт 5:

Каждого перечисление буквальные дают другое значение перечисления. Предопределенные отношения порядка между значениями перечисления следуют порядку соответствующих номеров позиций. Номер позиции значения первого перечисленного перечисляемого числа равен нулю; номер позиции для каждого дополнительного литерала перечисления больше, чем номер его предшественника в списке.

Мы видим, что каждый листинг перечисления представляет собой номер позиции, основанный на его порядке объявления, а первое значение имеет номер позиции нуля (основание для вашего «обходного пути»).

Все это происходит потому, что VHDL является формальной нотацией. Длина не описывает диапазон значений, который описывает количество элементов в массиве.

+0

ОК, длина - это хорошее имя атрибута для размера массива. Как насчет '' count' для размера перечисления? Я думаю, мы должны переместить эту дискуссию в список рассылки VHDL :). – Paebbels

+1

Комментарий Дэвида заключается в том, что 1076 в настоящее время использует LENGTH только для массивов. Это не мешает РГ 1076 расширить свое значение. Я думаю, нам нужно использовать то, что естественно для сообщества пользователей. Если это COUNT, я в порядке с ним, но, как @Paebbels, когда я пытался его использовать, я, естественно, подумал, почему бы не расширить «ДЛИННОСТЬ». –

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