K-J,
Is writing 16#7FFF# and x"7FFF" is the same ?
No (but kind of close depending on what you mean by 'same'). In the context that you're using it here, x"7FFF" is an unsigned vector (i.e. the type of 'address_i'), whereas 16#7FFF# is an integer constant. VHDL allows you to specify integer literals with a base by using the # wrapper. The number before the first # sign indicates the base. The base must be between 2 and 16, so each of these are valid
123 -- Base 10 implied
10#123# -- Base 10 explicitly specified
16#ABCD# -- Hexadecimal
8#777# -- Octal
5#1234321# -- Base 5
Note that since you're specifying an integer value rather than bits within a collection, you're not hamstrung by having to have the right collection of bits as you are currently having with your posted problem which has 15 bits which isn't a multiple of 4 which means you have to kludge together the last three bits somehow.
So even though 16#1234# appears to be 4 digit hex number, it does not have a 'vector' number of bits associated with it so it is not '16 bits' wide. It is simply a constant integer. That means though that you can't assign 16#7FFF# to an unsigned, nor can you assign x"7FFF" to an integer.
my_unsigned <= 16#7FFF# -- Illegal, the right hand side is integer, the left is unsigned
my_unsigned <= to_unsigned(16#7FFF#, my_unsigned'length); -- Legal
my_integer <= x"7FFF"; -- Illegal, the right hand side is unsigned (actually ambigous, could be a string), the left is integer
my_integer <= to_integer(unsigned'(x"7FFF")); -- Legal
Kevin Jennings