2017-02-15 4 views
1

Я хочу знать, можно ли преобразовать тип перечисления, например, FSM-состояния в std_logic_vector или integer. Я делаю testbench с OSVVM для FSM, и я хочу использовать пакет табло для автоматического сравнения ожидаемого состояния с фактическим.Преобразование типа перечисления в std_logic_vector VHDL

Спасибо!

+0

Лучший и самый чистый способ - реализовать функцию с входом enum и с типом возврата std_logic_vector (или целое число) и использовать конструкцию case для возврата правильного std_logic_vector для своего перечисления. –

+0

Но если число состояний увеличивается, функция также увеличивается. Мне нужно что-то более портативное ... – ferdepe

+0

См. Также 'attribute enum_encoding' –

ответ

4

Чтобы преобразовать в целое, использование:

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 :).

+0

Вот что я искал! Спасибо Джим! Спасибо за советы! – ferdepe

+0

Есть ли аналогичный способ перехода от целого к перечисляемому типу? –

+0

@scary_jeff это «VAL (но я подозреваю, что вы уже это знали). Пример, приведенный выше. –

0

Может быть, как это ...

function my_func(inp : t_my_enum) return integer is 
begin 
    case inp is 
     when stateA => 
      return 1; 
     when stateB => 
      return 2; 
     when others => 
      return 0; 
    end case; 
end function my_func; 

... <= my_func(stateB);` 
Смежные вопросы