Convertiré tu código de ejemplo en algo que infiere una ROM:
En algún lugar de su sección de arquitectura, cree las señales para acceder a su ROM (la inferencia de ROM requiere un resultado cronometrado) para simplificar (evitando la verbosidad del tipo de VHDL que contiene el ejemplo) He convertido sus números a hexadecimal:
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;
Luego, en la sección de comportamiento, un proceso como el siguiente infiere una 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;
He tenido que hacer esto varias veces en mi diseño Commodore-64-on-Zybo mediante scripts de Python para convertir los datos binarios de ROM (Character, Basic y Kernal ROM) en fuentes VHDL que contienen la enorme línea 4K / 8K los bloques de casos dentro de ellos (si necesito escribir un convertidor, de todos modos también puedo convertir a VHDL genérico en lugar de los archivos de descripción de contenido de memoria textual específicos del proveedor).
Con solo el bloque CASE, se obtiene un selector de constante combinacional implementado en LUT en lugar de una ROM. Para deducir una ROM, la asignación de la señal de resultado debe realizarse en un borde del reloj.
Repita este patrón para generar ROM adicionales.
One gotcha: no puede generar más de una salida por reloj por ROM (esto evitará la inferencia de una ROM si ocurre en su diseño). Para salidas múltiples, debe dividir los datos en ROM separadas para cada salida (solución de intercalación) o usar un FSM cíclico pequeño con dos estados por resultado requerido y cronometrar este FSM en los bordes ambos de su reloj de entrada ( solución deserializante). Genere la dirección de la ROM en los estados del borde (suponiendo que las salidas de la ROM estén en los bordes + como en el ejemplo anterior) y asigne la señal de la salida de la ROM en los estados del borde +. Asegúrese de que cualquier estado de sincronización o reinicio asíncrono y los estados inicializados / iniciales sean uno de los estados de borde.