Чтобы преобразовать в целое, использование:
IntVal := StateType'POS(State) ;
Оттуда легко преобразовать в STD_LOGIC_VECTOR, но я предпочитаю работать с целыми числами, когда возможно, поскольку они меньше в хранилище, чем std_logic_vector. Для проверки это будет проще, если вы начнете больше думать о целых числах, когда значение меньше 32 бит.
Если вам это нужно, как std_logic_vector, используя только numeric_std вы можете:
Slv8Val := std_logic_vector(to_unsigned(IntVal, Slv8Val'length)) ;
Для проверки, я свободно использовать numeric_std_unsigned, поэтому преобразование является проще:
Slv8Val := to_slv(IntVal, Slv8Val'length) ;
В случае, если Вы имеют целое число и хотят преобразовать его обратно в нумерованное значение, вы можете использовать «VAL.
State := StateType'VAL(IntVal) ;
В OSVVM мы используем записи с разрешенными значениями для создания интерфейса транзакции. У нас есть разрешенные типы для целых чисел (osvvm.ResolutionPkg.integer_max). Мы переносим перечисленные значения через запись, используя «POS (как мы выразились)) и« VAL (как мы его выясним).
Примечание. Не путайте «VAL with» VALUE. «VALUE преобразует строку в значение, противоположное« IMAGE ».
Вы, конечно, узнаете все это в классе OSVVM SynthWorks :).
Лучший и самый чистый способ - реализовать функцию с входом enum и с типом возврата std_logic_vector (или целое число) и использовать конструкцию case для возврата правильного std_logic_vector для своего перечисления. –
Но если число состояний увеличивается, функция также увеличивается. Мне нужно что-то более портативное ... – ferdepe
См. Также 'attribute enum_encoding' –