I'll turn your example code into something that infers a ROM:
Somewhere in your architecture section create the signals for accessing your ROM (ROM inference requires a clocked result) for simplicity (avoiding the verbosity of VHDL type casting cluttering the example) I've converted your numbers to hex:
subtype nybble is std_logic_vector(3 downto 0);
subtype byte is std_logic_vector(7 downto 0);
signal romClock : std_logic;
signal romAddress : nybble;
signal romResult : byte;
Then in the behavior section a process such as the following infers a ROM:
myROM: process(romClock,romAddress) is
begin
if (rising_edge(romClock)) then
case romAddress is
when x"1" => romResult <= x"0E"; -- 14
when x"2" => romResult <= x"2D"; -- 45
when x"3" => romResult <= x"43"; -- 67
when x"4" => romResult <= x"20"; -- 32
when x"5" => romResult <= x"0C"; -- 12
when x"6" => romResult <= x"40"; -- 64
when others => romResult <= x"00"; -- 0
end case;
end if;
end process myROM;
I've had to do this a few times on my Commodore-64-on-Zybo design via python scripts to turn the ROM binary data (Character, Basic and Kernal ROMs) into VHDL sources containing the huge 4K/8K line case blocks within them (if I need to write a converter anyways may as well convert to generic VHDL rather than the vendor-specific textual memory contents description files).
With just the CASE block you get a combinational constant selector implemented in LUTs rather than a ROM. To infer a ROM the result signal assignment has to be staged to a clock edge.
Repeat this pattern to generate additional ROMs.
One gotcha: you cannot generate more than one output per clock per ROM (this will prevent inference of a ROM if it occurs in your design). For multiple output you must either partition the data into separate ROMs for each output (interleaving solution) or use a small cyclic FSM with two states per result required and clock this FSM on both edges of its input clock (deserializing solution). Generate the ROM address on the - edge states (assuming the ROM outputs on + edges as it does in the above example) and assign the signal from the ROM's output on the + edge states. Ensure that any sync or async reset state and initialized/starting states are one of the - edge states.