Мэтью упомянул два важных улучшения: ваша цель case должна быть статическим выражением (тип которого является локально статическим типом), и если вы делаете синтез, вам нужно использовать цикл for.
Далее, вы не можете разрезать многомерный массив, следовательно, q_ctrl_reg (I, 31 до 0) также недопустим.Давайте исправим это, используя массив массива (показанный ниже):
type q_ctrl_reg_type is array (0 to MAX_REG -1) of std_logic_vector(31 downto 0) ;
signal q_ctrl_reg : q_ctrl_reg_type ;
Теперь давайте соберем все это вместе, позволим нам использовать цикл for вместо цикла while и оператор if вместо вашего оператора case:
for i in 0 to generic_num_of_instances - 1 loop
if loc_addr = 0 + I*256 then
q_ctrl_reg(I) <= s_axi_wdata;
end if;
end loop;