Hay muchas formas de crear ROM dentro de un FPGA usando VHDL. Pero, honestamente, es demasiado grande para poner una respuesta aquí. Sin reducir su pregunta en algo más manejable, será difícil dar una respuesta completa.
Pero, permítame comenzar dándole una idea sobre qué tipo de cosas son posibles (a.k.a. lo que he hecho con Xilinx ISE) ...
En el momento de la compilación, su código VHDL puede leer un archivo de texto que tiene la representación binaria del contenido de su ROM. Cada línea del archivo de texto tendría algo como "001011101" que representa el contenido de esa palabra de la ROM (o RAM inicializada). Nota: La última vez que probé esto, que fue hace varias versiones de ISE, estaba limitado a un "texto" binario. Sé que otras herramientas de síntesis de VHDL podrían soportar algo más complejo y útil.
En el momento de la compilación, puede calcular el contenido de la ROM (o RAM inicializada). En uno de mis proyectos, relleno la ROM con una tabla de onda sinusoidal calculada en tiempo de compilación. En un proyecto diferente, calculo los coeficientes para un filtro y los almaceno en la ROM. Debo enfatizar que los contenidos de la ROM se calculan en tiempo de compilación, no simplemente de un archivo u otra fuente de datos enlatada. De esta manera, los datos cambiarán para reflejar cualquier cosa relevante, como la profundidad de bits de la tabla de ondas sinusoidales o el número de toques del filtro. Incluso puedo hacer mis cálculos en punto flotante y luego convertirlos en std_logic_vector antes de ponerlos en la ROM.
En mi código VHDL puedo especificar de forma agradable cuáles deberían ser los contenidos de la ROM. Esencialmente enumerar cuáles son los contenidos similares a esto: rom_contents: = ("01001", "10111", "00111", ..); Incluso puede utilizar las funciones VHDL para convertir datos no std_logic_vector en std_logic_vectors, lo que hace que su código VHDL sea más legible o fácil de mantener.
Hay varias cosas clave para saber cómo hacer esto:
La clave principal es simplemente conocer VHDL por dentro y por fuera. Sepa cómo funcionan los tipos de datos y cómo manipularlos. No hay nada específico de Xilinx aquí, ya que estas son independientes del fabricante de FPGA (aunque no todas las herramientas de síntesis de VHDL admiten todo tipo de construcciones de VHDL).
La siguiente clave es mirar el código de ejemplo. Con solo ir al sitio web de Xilinx y buscar "técnicas de codificación de ROM" se obtendrá mucha información. Incluso la documentación de Xilinx XST tiene mucha información allí. La mayor parte de esa información se encuentra en el PDF de la guía de 10+ usuarios de XST, por lo que debe saberlo antes de intentar abrir ese archivo gigantesco.
Si me dieras algo específico, podría desenterrar algún código de ejemplo. Y de manera específica, necesito saber exactamente qué quiere decir con "memoria constante generada en tiempo de compilación". No hay forma de que pueda darles más ejemplos genéricos de ROM, eso sería demasiado. Pero es posible un ejemplo muy específico.