Uno de los escenarios más comunes en el diseño de hardware es la inclusión de capacidad de almacenamiento en forma de memorias DDR SDRAM para acompañar a un procesador, FPGA o elemento inteligente. Hay ciertas pautas que es necesario seguir para lograr un enrutado adecuado, no sólo que funcione, sino que, además, presente un buen comportamiento en cuanto a emisiones electromagnéticas y a calidad de la señal. Analizaremos en este artículo dicho tema mediante un caso real.
Conviene empezar aclarando el significado de las siglas DDR: es el acrónimo en lengua inglesa para Double Data Rate. Hace referencia al hecho de que la transferencia de datos hacia y desde la memoria se realiza tanto en flanco de subida como de bajada de reloj. Es decir, si tenemos un reloj de frecuencia X, la tasa de datos será de 2X.
Existen varias generaciones de DDR, algunas ya obsoletas, según la velocidad a la que se pueden transmitir los datos. Actualmente la versión DDR4 está en uso y se prevé que la version DDR5 lo esté en poco tiempo.
La interfaz creada a tal efecto se compone esencialmente de 4 grupos diferentes de señales:
Las memorias DDR SDRAM se encuentran en el mercado en dos formas: directamente como chips (circuito integrado), o en módulos compuestos por varios chips que son insertables a través de una interfaz. En este último caso, se trata de una pequeña PCB ya diseñada y fabricada para su uso en una placa base, por ejemplo.
Ambos tienen sus ventajas y desventajas a la hora de diseñar una tarjeta de circuito impreso. En el caso de usar chips, tenemos mayor flexibilidad a la hora de configurar el sistema de memorias. Sin embargo, el enrutado será más complicado y deberemos prestarle más atención. En el caso del módulo, se invierten los papeles.
Refiriéndonos en este caso al uso de varios chips de memoria en nuestra PCB, podemos afrontar el problema desde dos perspectivas en lo que toca a las líneas comunes a todos las memorias:
Recientemente recibimos una petición de soporte por parte de otro grupo de trabajo dentro del Politécnico de Zurich. Se trataba de un diseño de una FPGA con procesador que precisaba de dos chips de memoria DDR3. El PCB ya había sido diseñado y fabricado, con múltiples errores en la parte concerniente a las memorias. Estando en fase de prototipado, se mandaron fabricar sólo 3 unidades, de las cuales se sospechan errores de soldadura bajo los BGAs (array de bolas) en dos de ellas. En la tercera, simplemente la tarjeta no superaba el test de diagrama de ojo.
En esta situación, resultaba imposible determinar si el error era exclusivamente de soldadura o de diseño (o ambos), ya que no teníamos prototipos suficientes para reproducirlo de forma idéntica en al menos dos tarjetas.
La topología elegida por el diseñador en este caso fue T-branch y el PCB constaba de 6 capas que hacían el enrutado bastante cómodo.
Tras un primer vistazo al diseño no se detectaron errores graves: cada señal estaba correctamente referenciada a un plano continuo de tierra y las longitudes de las mismas, en apariencia, eran correctas (quizás un poco más largas de lo estrictamente necesario). No se usaban terminaciones, pero, dada la relativa sencillez del sistema, no se consideran necesarias (bastaba con la terminación integrada en el chip). Entonces, ¿dónde residía el error? Veamos.
Antes de continuar, resumamos brevemente qué reglas de diseño debemos respetar en lo que refiere a tiempos (longitudes) de propagación de las señales. Vaya por delante que siempre es necesario estudiar las recomendaciones del fabricante. A grandes rasgos, serían:
Un segundo análisis más en profundidad del layout en cuestión nos revela el error de diseño: analizando las longitudes de los grupos de dirección / comandos y control a través del panel PCB de Altium, no se aprecia, a priori, ningún error. Sin embargo, las longitudes que estamos observando son las de la pista completa cuando lo que deberíamos analizar es las longitudes reales de emisor a receptor de cada chip. Por tanto, las ecualizaciones de las líneas de dirección / comandos y control eran completamente erróneas en realidad.
Por desgracia, la solución pasa por un rediseño de la tarjeta. La palabra clave es Xsignal.
Altium nos permite definir una señal de punto a punto. El nombre técnico es Xsignal. Deberemos primero definirlas de manera muy sencilla: seleccionamos los dos pads de origen y destino (pueden ser de Nets diferentes) y hacemos click con el botón derecho. Obtenemos esto:
Podemos acceder a todas las Xsignals mediante el panel PCB:
Las Xsignals pueden ser usadas en el mismo modo que cualquier otra Net dentro de las reglas de diseño (creando clases, por ejemplo) y así conseguir nuestro objetivo de líneas perfectamente ecualizadas de extremo a extremo. Es una herramienta potentísima y tremendamente útil.