Я обычно использую функцию (названную «If Then Else» = ite), чтобы обойти отсутствие тернарного оператора в VHDL.
function ite(b: boolean; x, y: integer) return integer is begin
if (b) then
return x;
else
return y;
end if;
end function ite;
Использование как это:
constant foo : integer := ite(SOME_INTEGER = 42, 1337, 4711);
Вы можете перегрузить эту функцию для разных типов возврата. Обратите внимание, что логическое выражение должно быть постоянным во время оценки при использовании для инициализации константы.
Более реалистичный пример, рецепт, который я часто использую:
entity foo is
generic (
DEBUG_LVL : integer := 0
)
...
attribute MARK_DEBUG : string;
...
signal my_signal : std_logic;
attribute MARK_DEBUG of my_signal : signal is ite(DEBUG_LVL >= 1, "TRUE", "FALSE");
Этот последний пример, конечно, требует "функции ите" с подписью
function ite(b: boolean; x, y: string) return string;