How does to reverse items in an array type
There are a few attributes that can be used to determine the bounds of ranges :


T'right and T'left
T'low and T'high
T'ascending : boolean : indicates a TO=true or DOWNTO=false range.

No idea why VHDL strings usually start at 1
The problem is what means a string defined as (10 downto 1)? Is it some text in a right-to-left language as Arabic? It would make no sense to reverse the order of letters!
If you want to inverse the order, you can use a loop :

FOR i in p'range LOOP
     q(i):=p(i);
END LOOP;



If it is just because the vector is badly defined, you can write

    q:=p;