У меня есть следующее перечислимое заявление: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, чтобы получить правильное количество/длину.
См. [Как получить количество элементов в перечисляемом типе] (http://stackoverflow.com/questions/26081676/how-to-get-number-of-elements-in-enumerated-type). Что не совсем ясно, так это то, что полезно знать количество * позиций * в перечислимом типе, возможно, вы могли бы просвещать читающую аудиторию. – user1155120
@DavidKoontz: Пример использования - это то, что значения перечисляемого типа иногда передаются через «std_logic_vector» в общем FIFO или ОЗУ, а минимальная длина 'std_logic_vector' тогда зависит от количества элементов в перечисляемом типе. –
@DavidKoontz В некоторых случаях необходимо передавать перечисления через общие модули, такие как FIFO, синхронизирующие синхронизаторы и так далее. Или нужно подключить перечисления к интегрированным логическим анаслизерам, таким как ChipScope. Все эти случаи нуждаются в: - я бы назвал это - метод сериализации в std_logic_vector, который должен знать, сколько бит требуется. Можно также обсудить, должны ли перечисления иметь атрибут «serialize» :). ОК, солнце встает, и я отредактирую страницу twiki .. – Paebbels