Interfaz de ram estática a fpga

Hace un tiempo hice esta pregunta sobre la conexión de una memoria RAM estática a una fpga con el fin de crear un búfer de cuadros vga que quería hacer como un pequeño proyecto de pasatiempo. Me quedó claro en ese momento que el proyecto era demasiado difícil para mi nivel de conocimiento (ya que básicamente soy un programador de C++ y sabía poco sobre electrónica), pero desde entonces he creado algunos proyectos más pequeños basados ​​en cpld, así que ahora siento Sé lo suficiente como para mirar el proyecto que quiero construir de nuevo :)

Estoy pensando en usar este chip de memoria , ya que parece ajustarse a mis requisitos. La hoja de datos indica que puedo leer un byte de datos cada 10 ns y que tengo que configurar la dirección un mínimo de 10 ns antes de querer leer los datos. Tiene un tiempo de "retención de datos por cambio de dirección" de 3 ns.

Esto implica para mí que, suponiendo un reloj de 10 ns, simplemente puedo configurar las líneas de dirección en cada ciclo de reloj y volver a leer los datos de la dirección anterior. Que la salida de datos será válida en o antes del próximo reloj de 10 ns, y seguirá siendo válida durante al menos 3 ns después de que cambie la dirección, por lo que es seguro leerlo.

¿Es esto algo razonable (establecer la dirección al mismo tiempo que leo los datos de la dirección anterior)? Al mirar la hoja de datos parece que sí.

Esto es lo más rápido que funcionaría, también podría usar un reloj más lento si llevar el tiempo al límite de esta manera fuera un problema, solo quería entender si había entendido la hoja de datos correctamente.

Respuestas (3)

Asumo que estás viendo el "Ciclo de lectura No. 1". Sí, esa es la interpretación correcta de la hoja de datos.

Ahora debe preocuparse por el lado de la FPGA, que tiene sus propios tiempos de configuración/retención y retrasos. Si tiene suficiente margen de frecuencia en el FPGA, no necesita preocuparse mucho por esto más allá de las limitaciones de tiempo básicas; las herramientas abstraerán las cosas hasta cierto punto. Pero eventualmente encontrará algo que necesita ser microgestionado, por lo que es útil comenzar a pensar en estos problemas ahora. Sugiero completar el lado HDL de su proyecto (lea esos informes de tiempo) antes de finalizar su diseño de hardware.

Operar una interfaz externa de 100 MHz en familias de FPGA económicas probablemente requerirá algo de cuidado. Sin embargo, puede comenzar bajo y lento, como unas pocas decenas de MHz, antes de mojarse los pies.

¿Pero no puedes ejecutar RAM estáticas más lento? ¿No es esa la mitad del punto de ellos?
@AmigableClarkKant Por supuesto. No veo dónde he insinuado lo contrario.
"Operar una interfaz externa de 100 MHz" suena muy desalentador y aterrador para esta persona muy novata. Pero a la luz de su comentario, creo que entiendo mejor "Puede comenzar de a poco". Escribiría "al principio, no intente abarrotar todo el rendimiento de la RAM. Ejecute muy lentamente al principio y asegúrese de que funcione antes de intentar ejecutarlo a las velocidades especificadas". (¿Te entiendo bien?)
genial gracias Probablemente pueda ejecutar la memoria a 60 Mhz más o menos para mi proyecto, lo que debería darme un poco de espacio libre. Supongo que no hay una manera fácil de simular la mayor parte de esto, ¿está ahí? Entonces, ¿tendría que mirar principalmente los informes de tiempo y las hojas de datos de FPGA?
@AmigableClarkKant Sí, básicamente. Pero el factor limitante probablemente será el FPGA.
@JohnBurton No conozco ninguna herramienta de simulación de extremo a extremo, aunque deben existir en alguna parte. Las herramientas de FPGA básicamente simulan el lado de FPGA, así que esa es la mayor parte del trabajo. Querrá comenzar restringiendo el reloj principal y luego verificando el retraso/configuración en los pads de E/S para ver si cumplen con las especificaciones. A partir de ahí, puede volverse más elegante con restricciones de tiempo si es necesario.
Gracias, tratar de hacer cualquier cosa con poco tiempo es nuevo y emocionante para mí :)
@JohnBurton, creo que podría simularlo diseñando una "RAM" en un FPGA con solo un puñado de direcciones de memoria, lo más cerca posible de las especificaciones.
Desearía poder hacer +1 en esto varias veces para el bit "leer esos informes de tiempo".

Con respecto a las simulaciones, construir su propio modelo SRAM sería una experiencia de aprendizaje útil: las comprobaciones de tiempo se pueden simular como se describe en este enlace

Alternativamente, el archivo VHDL de Hamburgo tiene algunos modelos de SRAM que pueden ser útiles y/o instructivos.

Una vez que haya construido su banco de pruebas y lo haya hecho funcionar en su código HDL, también puede generar una lista de redes post-PAR y usarla en el banco de pruebas. Este modelo tendrá algunos retrasos reales modelados (y requisitos de tiempo), lo que le dará cierta confianza de que obtendrá algo útil al final.

Cuando estaba pensando en simular ram, estaba pensando en hacerlo en un fpga usando block ram, pero por supuesto eso sería difícil. Supongo que podría hacerlo en un simulador, por supuesto.
Siempre hágalo primero en un simulador: obtiene muchas más iteraciones por hora que construyendo en un FPGA. Además, las BlockRAM son síncronas (tienen un reloj), mientras que su SRAM es asíncrona. Tendría que construir un modelo de RAM asíncrono a partir de las pequeñas memorias que pueden formar las LUT para obtener un modelo asíncrono. E incluso entonces el momento sería diferente.

Parece que entiendes bastante bien el lado de SRAM, así que no tocaré eso.

Viniendo de CPLD, que no tienen muchas chanclas, es posible que no esté familiarizado con la canalización. Esencialmente, es el acto de insertar flip-flops en la ruta lógica para reducir el tiempo del ciclo. Teniendo en cuenta que su FPGA absorberá 800 MB/s, es casi seguro que necesitará canalizar su diseño para lograr el cierre de tiempo.

Considera calcular 2x+1. Son dos operaciones, una multiplicación y una suma. Si intenta realizar ambas operaciones en un solo ciclo de reloj, la señal puede tardar 20 ns (valor sacado de la nada por conveniencia) en atravesar tanto el multiplicador como el sumador. Sin embargo, si lo canalizó para que la multiplicación ocurra en una etapa y se alimente a un flip flop, y luego la adición ocurra en una segunda etapa, entonces puede reducir su período de reloj a 10 ns, ya que solo se necesitan 10 ns para que la señal llegue. propagarse de un flip flop al siguiente.

Recomendaría comenzar MUCHO más lento, si tiene un tiempo de acceso de 10 ns, comenzaría con algo mucho más seguro, como accesos de 100 ns. Solo asegúrese de que puede leer y escribir un patrón de bits en la RAM y luego repetir ese patrón en un osciloscopio. Una vez que sabe que puede leer y escribir en la RAM correctamente, entonces comienza a agregar sus etapas de canalización, mientras mantiene los accesos de 100 ns. Este paso es solo para asegurarse de que los datos se propaguen a través de la canalización correctamente, ya que es muy fácil perderse una etapa. Su objetivo aquí es agregar suficientes etapas para que el informe de tiempo indique que es factible un ciclo de reloj de 10 ns ("lograr el cierre de tiempo" en el lenguaje). Una vez que tenga suficientes etapas en la tubería y estén funcionando correctamente, aumente la velocidad de su reloj.

Buen consejo, tiene mucho sentido.