Qué pasa realmente en los cables entre la FPGA y la DRAM
Una interfaz DRAM tiene dos mitades que se comportan de forma distinta. La de comando y dirección es unidireccional, va del controlador al DRAM y la comparten todos los chips del rank: CK y CK#, CS#, RAS#, CAS#, WE#, A, BA y BG, más CKE, ODT y RESET#.
La mitad de datos es bidireccional y se parte en byte lanes. Una lane son 8 DQ, su par DQS/DQS# y su DM, el bit que enmascara bytes en una escritura. Cada lane se rutea por su cuenta, así que puede llegar en un momento ligeramente distinto, y por eso cada una se sintoniza por separado.
En LiteDRAM, los pads del DRAM son un registro del archivo de plataforma con campos nombrados igual que estas señales (dq, dqs_p, a, ba, cs_n). El PHY cuenta las lanes a partir de ahí, y dos helpers de litedram/common.py las remodelan: PHYPadsReducer deja solo algunas y PHYPadsCombiner fusiona chips con buses de comando separados en un solo controlador.
¿Y esto cómo se aplica en tu negocio?
Dueños de negocio de Latinoamérica y España usan un agente de IA para ganar más y recuperar su tiempo. El Kit «tu mano derecha con IA» te muestra cómo en un video de 11 minutos, con una ficha para armar el tuyo. CAR está cerrada por ahora; al anotarte, te avisamos cuando abra.
👥 Quiero el Kit →¿Por qué el reloj del controlador no sirve para muestrear los datos?
En SDR, cada flanco de reloj transfiere una palabra. En DDR, dos: una en cada flanco. A esas velocidades el reloj que manda el controlador ya no es confiable para muestrear los datos, porque los retardos de la placa y de los chips son demasiado grandes.
La solución es que los datos viajen con su propio reloj. Ese es el strobe DQS: el lado que envía los datos también envía DQS, y el receptor muestrea DQ con él. Al viajar por el mismo camino, los retardos se cancelan. Es una interfaz source-synchronous.
El detalle fino está en la alineación. En escritura, el controlador envía DQS centrado respecto a DQ, con los flancos en medio de cada bit. En lectura, el DRAM envía DQS alineado al borde, sobre las transiciones, y el receptor lo retrasa un cuarto de reloj. Antes y después del burst, DQS se activa para un preamble y un postamble sin llevar datos.
Cada familia de FPGA resuelve ese cuarto de reloj con lo que tiene a mano. El PHY de Artix-7 relojea sus serializadores de DQS con sys4x_dqs, un reloj desplazado 90°; los PHY con output delays —Kintex-7 y Virtex-7 en bancas HP, y UltraScale— retrasan DQS directamente; Lattice y Gowin usan el reloj de escritura desplazado de su bloque DQS.
En lectura la diferencia es mayor. Los PHY de Xilinx no usan DQS: muestrean DQ con su propio reloj rápido a través de un input delay que read leveling afina por lane. Los de Lattice y Gowin sí usan el bloque DQS, que retrasa la señal 90°, captura DQ con ella y avisa cuándo vio un burst (burst detect).
Fly-by: por qué cada chip ve el reloj en un momento distinto
DDR3 y DDR4 rutean reloj, comando y dirección como un solo bus que pasa por cada chip en orden y termina en una terminación: la topología fly-by. Mantiene limpias señales muy cargadas a alta velocidad, pero cada chip recibe el reloj un poco más tarde que el anterior.
Las lanes de datos son punto a punto, así que sus retardos no siguen al reloj. Y un chip necesita que DQS llegue cerca de su propio flanco de CK (tDQSS). Con fly-by, el skew entre el primer y el último chip puede superar un periodo de reloj completo: cada lane necesita su propio retraso de DQS.
Write leveling mide ese retraso. El controlador pone al DRAM en modo write leveling con un bit de registro de modo (MR1 bit A7 en DDR3 y DDR4), manda pulsos de DQS, y el DRAM muestrea su CK con cada flanco de subida de DQS y devuelve el valor por DQ. El controlador va retrasando DQS paso a paso hasta que DQ pasa de 0 a 1: ahí DQS quedó alineado con CK en ese chip.
En LiteDRAM el mecanismo se expone por registros: wlevel_en habilita el modo, wlevel_strobe manda un pulso y los delays de salida por lane mueven DQS y DQ. El barrido lo corre el BIOS (sdram_write_leveling, en liblitedram).
Aquí hay una restricción de hardware que conviene conocer antes de elegir chip: write leveling necesita output delays. Kintex-7 y Virtex-7 en bancas HP y los UltraScale los tienen; el Artix-7 no, así que con una sola fase DQS estática solo algunas lanes de una memoria fly-by cumplen tDQSS. Su modo opcional with_ck_phase_shift (DDR3 a 1:4) mueve CK contra todas las lanes en bloque.
Las cuatro calibraciones del arranque
Write leveling alinea DQS con CK dentro de un periodo, pero una lane puede quedar un reloj entero adelantada o atrasada: el DRAM escribiría el burst desplazado unas palabras. Write latency calibration escribe un patrón conocido, lo lee de vuelta y mueve cada lane en relojes enteros hasta que cuadra. Después, DQ-DQS training centra DQ contra DQS en escritura: barre el output delay de los pines DQ de cada lane, escribe y relee un patrón en cada paso, y se queda con el medio del rango que pasa.
En lectura, el controlador no sabe cuándo llegan los datos. El DRAM responde CL relojes después de RD, pero la placa y los I/O agregan un retardo distinto por lane. Hay que encontrar dos ajustes por lane: uno grueso, qué ciclo de reloj rápido tiene la primera palabra (un bitslip que desplaza la salida del deserializador), y uno fino, en qué punto del bit muestrear (un input delay, desde pocos picosegundos hasta unos cien por paso según la FPGA: 78 ps en 7-Series con referencia de 200 MHz).
Read leveling escribe un patrón y, por cada bitslip, barre el delay y lo relee. El resultado es una ventana: el ojo de datos visto a través de la línea de retardo. Una ventana ancha es una interfaz robusta; una estrecha apunta a un problema de integridad de señal o de clocking. DDR3 y DDR4 pueden devolver además un patrón fijo desde su MPR, lo que permite afinar la lectura antes de haber escrito nada.
En LiteDRAM cada PHY declara sus taps y bitslips en settings y los expone por registros (rdly_dq_inc, rdly_dq_bitslip, y burstdet_seen en Lattice y Gowin). El BIOS corre el barrido e imprime una línea por lane y bitslip.
Terminación, ZQ y VREF: los ajustes que casi nadie mira
A velocidad de DRAM, una señal se refleja al final de una línea sin terminar. Por eso el DRAM termina sus pines de datos con ODT, y la FPGA termina sus entradas igual cuando recibe. DDR3 y DDR4 tienen dos valores de terminación —RTTNOM para reposo u otra rank, RTTWR mientras se escribe— y una fuerza de driver, RON. En DDR3 los defaults son 60, 60 y 34 ohm; en DDR4, 40, 120 y 34 ohm. LiteDRAM los fija en litedram/init.py y el PHY puede sobrescribirlos.
Los resistores varían con proceso, voltaje y temperatura, así que los chips se calibran contra una resistencia de precisión en el pin ZQ (240 ohm a tierra): ZQCL al inicializar y ZQCS periódico, que en LiteDRAM sale del refresher una vez por segundo por defecto.
El VREF es el otro punto ciego. DDR3 lo recibe por pines dedicados de la placa. DDR4, con pseudo open drain, lo genera interno y se programa en MR6. Aquí hay un dato relevante para quien piense en DDR4: la inicialización de LiteDRAM escribe MR6 solo con tCCD_L y deja el campo VREF en cero —el primer valor del rango 1, 60% de VDDQ—, es decir, el VREF de datos del DRAM no se entrena. Del lado FPGA, el PHY de UltraScale+ puede fijar el VREF de lectura de sus bancas HP (with_hpio_vref, registro rd_vref, códigos de 0 a 72), pero el BIOS no lo barre: queda en el valor de build salvo que el software lo escriba. LiteX issue 2769 registra ese hueco.
Relojes y la interfaz DFI
Una FPGA no puede correr al reloj del DRAM: un DDR3 a 800 MT/s tiene 400 MHz de reloj y mueve 800 Mbps por pin. Por eso el PHY usa los serializadores y deserializadores de los I/O, y el controlador corre a una fracción del reloj de la DRAM: el ratio de frecuencia. A 1:4, el controlador va a un cuarto del reloj DRAM. En el target de bench de la Arty A7, el controlador corre a 125 MHz, el reloj de DRAM a 500 MHz y el DDR3 a 1000 MT/s; como en DDR la tasa de datos es el doble del reloj DRAM, a 1:4 los datos van a ocho veces el reloj del controlador.
El controlador y el PHY se encuentran en la DFI, la interfaz nombrada por la especificación DDR PHY Interface. Por cada reloj de DRAM de un ciclo del controlador lleva un slot de comando y los datos de ese reloj; cada slot es una fase. Dos latencias atan comandos y datos: la de escritura (de WR al ciclo en que el controlador presenta los datos) y la de lectura (de RD al ciclo en que rddata_valid se activa). Y como los comandos no siempre arrancan en la fase 0, el PHY le dice al controlador en qué fase emitir lecturas y escrituras (rdphase, wrphase).
El techo práctico de cada familia se ve en la tabla de PHYs del manual: 7-Series usa OSERDESE2/ISERDESE2 con 32 taps y 8 bitslips; UltraScale(+) sube a 512 taps; ECP5 va con 8 taps y 4 bitslips; Nexus, 16 y 4; GW2A, 256 y 4; y GW5A, 256 con 4 u 8 según opere a 1:2 o 1:4.
El contexto: DDR5 avanza y el stack abierto sigue en DDR3/DDR4
La presión del mercado va en otra dirección. Altera anunció el 11 de agosto de 2026, a través de Business Wire, soporte de DDR5-6400 y LPDDR5-6400 en dispositivos Agilex 7 M-Series con Quartus Prime Pro 2026.1.1, y hasta 204,8 GB/s de ancho de banda agregado en configuraciones soportadas de esa familia. Los proveedores empujan la memoria rápida con herramientas cerradas y flujos propietarios.
LiteDRAM documenta DDR3, DDR4 y LPDDR4, con todo el trabajo de calibración expuesto. El proyecto LiteX, del que forma parte, es de licencia BSD; un paper de 2020 sobre LiteX describe a LiteDRAM como un core de DRAM «fully pipelined», de SDRAM a DDR3, y menciona un diseño de ejemplo con un DDR3 de 32 bits a más de 20 Gbps de ancho de banda. La diferencia no es solo de generación de memoria: es quién se come la complejidad del bring-up.
Qué significa esto para tu startup
- La familia de FPGA decide tu techo de calibración, y eso se resuelve en el layout. Si tu producto necesita un DDR3 fly-by con varios chips, el Artix-7 sin output delays te va a dejar lanes que no cumplen tDQSS. Kintex-7/Virtex-7 en bancas HP o UltraScale sí los tienen. Es una decisión de BOM, no de firmware.
- Presupuesta el bring-up como hito propio. Son cuatro calibraciones secuenciales y la de escritura depende de que la lectura ya funcione. Si tu cronograma asume que la placa arranca y listo, el primer prototipo te va a costar semanas.
- Usa el log de read leveling como KPI de calidad de cada placa. Una línea por lane y bitslip, con el ancho de ventana. Una ventana estrecha es señal de stackup, terminación o clocking, no de software: detectarlo en fabricación es mucho más barato que en campo.
- Si el margen importa, revisa VREF a mano. En DDR4, LiteDRAM deja el VREF de datos del DRAM en el valor por defecto (60% de VDDQ) y el BIOS no barre el VREF de lectura de las bancas HP en UltraScale+. Si tu aplicación vive al límite, ese ajuste queda de tu lado.
Conclusión
La razón por la que una interfaz DDR3 o superior se sintoniza en cada arranque no es un capricho de diseño: el reloj del controlador ya no puede muestrear los datos, cada chip ve el reloj en un momento distinto y cada lane llega con su propio retraso. El precio de la velocidad es un procedimiento de calibración por lane, por placa y por arranque.
Para un equipo de producto, la lectura práctica es que elegir FPGA y elegir memoria son la misma decisión. La documentación de LiteDRAM es útil justamente por eso: muestra qué necesita cada familia para cerrar esa calibración y deja a la vista los puntos donde todavía hay que escribir código propio.
Fuentes
- LiteDRAM manual — The DRAM interface and the PHY (fuente original)
- Altera Expands DDR5 Memory Support Across Agilex FPGA Portfolio (Yahoo Finance)
- LiteX: an open-source SoC builder and library based on Migen Python DSL (arXiv)
¿Y esto cómo se aplica en tu negocio?
Dueños de negocio de Latinoamérica y España usan un agente de IA para ganar más y recuperar su tiempo. El Kit «tu mano derecha con IA» te muestra cómo en un video de 11 minutos, con una ficha para armar el tuyo. CAR está cerrada por ahora; al anotarte, te avisamos cuando abra.
👥 Quiero el Kit →












