memoria constante en el Spartan 3 Starter Kit

1

Estoy en extrema necesidad de una memoria constante generada en tiempo de compilación de ~ 512 K x 16 bits en la placa del kit de inicio Spartan 3. Estoy configurando la placa a través del puerto JTAG, y me pregunto si

a) hay una forma de configurar previamente los datos en la SRAM integrada, para leerlos en tiempo de ejecución

b) hay una buena manera de implementar la ROM (la forma en que lo intenté excede las capacidades de los Boards en 8k x 16Bit)

c) ¿Hay otros buenos consejos sobre el tema / cosas que no he considerado?

Estoy usando Xilinx ISE, VHDL.

gracias de antemano.

    

2 respuestas

2

a) No puede hacer que ISE preconfigure automáticamente su SRAM integrada, pero, por supuesto, puede hacer que su diseño se inicialice al inicio (aunque esto requerirá que los datos estén presentes en otra parte del sistema, lo que básicamente es un fracaso). el propósito).

b) Cree un blockram, y asigne un archivo .coe con el contenido deseado, o use los atributos de inicialización para describir el contenido. Puede leer más sobre esto por ejemplo en el Capítulo 4 de la guía de usuario de Spartan 3 ( UG331 ) . Por supuesto, con tu tamaño de ROM, será un poco difícil.

c) Otras ideas podrían ser utilizar un chip SPI FLASH (o similar), implementar un pequeño diseño de receptor en serie en el FPGA y luego cargar el contenido de su chip FLASH desde, por ejemplo, HyperTerminal. Ya que es un chip FLASH, solo tendrás que hacer esto una vez, y una vez que lo hayas hecho, puedes eliminar el diseño del receptor en serie y cargar el diseño final en su lugar.

Los SPI FLASH son bastante baratos y fáciles de utilizar, pero también dependen de la rapidez con la que necesites acceder a los contenidos. Como es serial, no obtendrás tus palabras clave a 50MHz por ejemplo (ya que eso requiere que tu interfaz SPI se ejecute al menos a 800 MHz, lo cual me resisto a pensar que es posible en un Spartan3). Los chips FLASH paralelos también están disponibles, pero admito que no tengo mucha experiencia con ellos.

Un ejemplo de un SPI FLASH podría ser uno de los chips Atmels Dataflash .

En muchos casos, también puede utilizar el dispositivo FLASH en el que almacena el flujo de bits FPGA para almacenar datos de usuario adicionales. Echa un vistazo a XAPP694 para ver un ejemplo de cómo se hace esto.

La forma retro de hacer esto es usar una EEPROM de doble línea (o similar) y un quemador de EEPROM. Programe el chip desde su computadora y luego móntelo en su diseño.

    
respondido por el sonicwave
2

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.

    
respondido por el user3624

Lea otras preguntas en las etiquetas