Métodos para la configuración de datos de RAM antes del reloj

Soy muy nuevo en el diseño digital (mi experiencia es el software). Estoy tratando de hacer uso de algunos bloques de RAM en un Xilinx FPGA, y quiero saber cuáles son los métodos habituales para configurar las señales de control de RAM con el reloj.

Actualmente tengo un solo reloj utilizado por todo mi diseño. La RAM puede realizar una lectura/escritura en cada flanco ascendente, y quiero usarla a esa velocidad. Por supuesto, las señales de control deben configurarse algún tiempo antes del flanco ascendente del reloj. Me imagino que hay algunas maneras de hacer esto:

  1. Configure las señales en el flanco descendente del reloj.
  2. Establezca las señales en el flanco ascendente. La herramienta de síntesis es lo suficientemente inteligente como para saber lo que quiero, conoce el tiempo de configuración requerido y se encarga de todo.
  3. Establezca las señales en el flanco ascendente. La herramienta de síntesis no es lo suficientemente inteligente, pero puedo hacer cosas divertidas con restricciones de tiempo para configurar las señales lo suficientemente temprano.
  4. Utilice dos relojes ligeramente desfasados, establezca las señales en el flanco ascendente del reloj adelantado.
  5. ¿Algún otro enfoque?

¿Cuáles de estos son posibles, cuáles son realmente buenos o se usan habitualmente, y hay ventajas o desventajas que ayuden a elegir entre ellos?

Editar: estoy usando VHDL simple por razones de portabilidad, y no estoy usando CoreGen o primitivos específicos de Xilinx. Sin embargo, sigo la documentación de Xilinx y escribo el VHDL de tal manera que las herramientas deduzcan el tipo de RAM correcto ("Directrices de codificación de HDL de RAM en UG687 si alguien está interesado). Las herramientas parecen estar haciendo esto correctamente.

Respuestas (3)

No necesita usar el otro borde ni cambiar la fase del reloj.

Simplemente configure los datos en el flanco ascendente, y luego el siguiente flanco ascendente lo registrará en la memoria (según la opción 2).

Ejecutar un análisis de tiempo estático le informará sobre cualquier violación de retención/configuración. Pero si agrega restricciones de forma de onda adecuadas a su reloj (es decir, frecuencia, servicio), el instalador hará todo lo posible para cumplir con los requisitos de tiempo.


Esta es la base fundamental del diseño síncrono. Cada registro sincroniza en el mismo borde al mismo tiempo, por lo que, en teoría, los datos del último ciclo en cualquier entrada de registro siempre se cargarán en el ciclo actual. Esto se logra principalmente utilizando arquitecturas de reloj de árbol H de baja desviación, donde la distancia desde la fuente del reloj hasta cualquier registro es prácticamente la misma longitud con los mismos retrasos, por lo que, en teoría, todos los registros deberían sincronizarse al mismo tiempo.

Los datos tardarán un poco más en llegar (ya que tienen un retraso de propagación DFF y un retraso de enrutamiento) antes de llegar al siguiente registro, lo que significa que la entrada de un registro cambiará en algún momento después del borde del reloj que lo configuró (y esperemos que antes del borde que se supone que lo cargue).

Probablemente no voy a responder las 5 preguntas secundarias, pero responderé a su pregunta principal

Quiero saber cuáles son los métodos habituales para configurar las señales de control de RAM en el reloj

El método habitual es que el fabricante tenga una nota de aplicación bastante detallada sobre el tiempo de su interfaz RAM. por ejemplo, una búsqueda rápida en Google encontró esta nota de aplicación para una SRAM QDR II usando un virtex-5.

Por lo general, estas interfaces se instancian mediante un editor principal. Este editor le dirá qué interfaces y opciones están permitidas. Estos pueden ser parámetros opcionales como el tamaño del bloque, la cantidad de bits de datos, etc. Igual de importante, una buena nota de la aplicación le indicará las limitaciones del núcleo.

Parece que desea hacer esto a mano, pero hay un par de ventajas al crear una instancia de un bloque.

  1. Está aprovechando el conocimiento de los diseñadores de chips y los ingenieros de aplicaciones de la empresa.

  2. El bloque ya se encargará del tiempo, la configuración, las esperas, los relojes múltiples, etc., siempre y cuando te mantengas dentro de sus limitaciones y no lo alimentes con basura.

  3. El bloque ya conoce todos los tipos de bloques disponibles en el silicio de destino y hará todo lo posible para mantener una huella pequeña o una velocidad rápida (que a veces es otra configuración)

Puedo hacer cosas divertidas con limitaciones de tiempo para configurar las señales lo suficientemente temprano

si eres un nuevo diseñador digital, hay muchos problemas para jugar con el tiempo. Recuerde que las herramientas de temporización/retraso/configuración/retención, etc., están ahí para ayudarlo. Es posible que esto no le moleste ahora, pero podría ser un problema si el diseño cambia un poco y de repente su LUT se coloca en otra porción porque cambió la configuración de tiempo pero no las restricciones de ubicación.

Como con la mayoría de las reglas, estas son reglas a menos que realmente sepa lo que está haciendo, entonces son pautas.

Trabaja siempre sincrónico y solo con el flanco ascendente. Recuerda que para escribir puedes usar un solo reloj, pero para leer necesitas al menos dos, uno para dar dirección y el segundo para leer los datos.