1) в зависимости от задачи можно по разному оптимально написать:
Код
signal a : std_logic;
signal u : std_logic_vector(24 downto 0);
signal y : std_logic_vector(24 downto 0);
signal z : std_logic_vector(24 downto 0);
-- a OR u
y <= (others=>'1') when a='1' else u;
-- a AND u
z <= (others=>'0') when a='0' else u;
2) Для этих целей есть функция conv_std_logic_vector;
Код
signal v : std_logic_vector(24 downto 0);
v <= conv_std_logic_vector( 16#1ABCDEF#, 25 );
Также советую Вам поизучать типы UNSIGNED и SIGNED. Это надстройка над std_logic_vector, которая понимает арифметические операции. Например, добавить к std_logic_vector единицу нельзя, так как это просто массив битов, над которым не определена схема представления целых чисел, ну то есть операции сложения и вычитания. А над UNSIGNED и SIGNED определены такие операции. Для UNSIGNED будет что-то типа такого:
Код
signal u : UNSIGNED(24 downto 0);
u <= TO_UNSIGNED( 16#1ABCDEF#, 25 );
3) Да, оператор for можно синтезировать, если на этапе синтеза можно вычислить все выражения, зависящие от итератора цикла. Ну или попросту, представьте себе, что транслятор просто N раз запишет все операторы внутренностей цикла, заменив в них итератор конкретным значением. В тех случаях, когда синтезатору цикл не нравится, его обычно можно переписать в другом виде, который будет синтезируемым. Но for при этом останется.