Enrutamiento de diseño de PCB DDR3

Estoy tratando de diseñar un chip DDR3 de 128 MB y un FPGA Spartan-6. Pines de señal DDR ubicados en pines específicos del controlador de memoria y no se pudieron intercambiar. Nunca he hecho enrutamiento DDR y opté por el esquema de la placa SP605 Xilinx como referencia para minimizar los puntos de error humano. He buscado una buena cantidad de literatura, pero no tengo absolutamente ninguna experiencia en memoria DDR y estoy un poco asustado. Así que he dividido las señales de memoria DDR3 en estos grupos (clases de red).

net class   L min   L max   vias/trace
sdram_ud    19.905  19.931  2
sdram_ld    20.244  20.293  0
sdram_clk   19.102  19.106  2
sdram_addr  31.775  32.77   0..2
sdram_ctl   31.736  32.082  0..2

sdram_ud (pink):
    dq(15..8)
    udqm
    udqsn, udqsp
sdram_ud (blue):
    dq(7..0)
    ldqm
    ldqsn, ldqsp
sdram_addr (orange):
    a(12..0)
    ba(2..0)
    we, cas, ras
sdram_clk (yellow):
    ckp, ckn
sdram_ctl (green):
    cs, clke, rst, odt

L1 L3 L6

Los planos de tierra y potencia se omiten en las capturas de pantalla.

Todas las clases se enrutaron en el orden en que se enumeraron. sdram_ld y sdram_ud enrutados en diferentes capas. Todos los miembros de la clase sdram_ctl se conectaron a tierra a través de 4k7 Ohm. Todos los miembros de la clase sdram_addr terminaron en vtt a través de un paquete de resistencias de 50 ohmios en la capa inferior. He puesto tantas tapas de desacoplamiento como pude: 0603/0402 cerámica 0.1uf + una grande de polímero 4u7f.

DDR3 layed out on 6-layer board with this stackup:
L1 signal/power
L2 gnd
L3 signal
L4 gnd
L5 power
L6 signal/power

El ancho de pista de la señal es de 0,125 mm. Con la acumulación estándar de mi fabricante, la impedancia es de alrededor de 70 ohmios. ¿Es suficiente o necesito cotizar para la acumulación personalizada?

Señales DDR3 ubicadas en L1 y L3. Terminación, desacoplamiento, vref y vtt ubicados en L6. Hay una isla 1v5 en L5 en la parte de Memoria y FPGA.

Intenté seguir la regla S/3S, pero supongo que no funcionó para mí. He diseñado y ajustado todo a mano. La clase Addr todavía me parece un desastre, pero esta es mi mejor carrera hasta ahora. Las señales DQ se intercambian dentro de DQ[15..8] y DQ[7..0]. sdram_ctl sintonizado para coincidir con sdram_addr. sdram_ud no está ajustado para coincidir con sdram_ld simplemente sucedió.

Mis preguntas son: ¿Este diseño funcionará al menos a la velocidad más baja posible? ¿Dividí correctamente las señales DDR3 en clases? ¿Está bien esa diferencia entre clases de longitud de pista? Según tengo entendido, la calibración DDR es el proceso de compensación de retrasos de las clases netas en relación con el reloj (ckp, ckn). ¿Está bien tener algunas líneas de dirección enrutadas en un lado y otras en el otro? ¿Tengo suficiente espacio libre en la pista?

Además, parece que Altium no tiene en cuenta la longitud de las vías, por lo que las tolerancias de longitud pueden ser de +-1,5 mm más para la clase addr.

UPD: El chip DDR3 es MT41J64M16LA en FBGA de 96 bolas (paso de 0,8 mm) El chip FPGA es XC6SLX45T en BGA de 484 bolas (paso de 1 mm)

UPD2: las huellas de color rojo oscuro en L6 son vref net.

¿Ha tenido en cuenta los retrasos en los paquetes en ambos extremos?
@pericynthion No, supongo que el paquete DDR es ideal. En cuanto al lado de FPGA, creo que es más un problema de síntesis/implementación.
@pericynthion Además, hay una respuesta de Xilinx en forums.xilinx.com/t5/Processor-System-Design-and-AXI/…
¡Vale, tiene sentido!
¿Tu solución funcionó al final? ¿Qué software de diseño de PCB usaste?

Respuestas (3)

Entonces, finalmente ensamblé la placa con este diseño y la porción DDR3 terminó funcionando a 333MHz. Aunque ahora creo que las huellas están demasiado cerca unas de otras. Se debe mantener la regla W/3W.

EDITAR: tenga en cuenta que este diseño tiene una línea de reloj muy corta (relativamente). Algunos algoritmos de calibración en algunos sistemas pueden no funcionar.

EDITAR: Sí, mi impedancia de seguimiento es de ~ 60 ohmios. Y no hay VTT/Vref ic en esas imágenes de mi OP.

¡Gracias por seguirnos! ¿No funcionó a velocidades más rápidas? ¿Cuál fue el síntoma?
¿Cuánto tiempo tomó completar este diseño de PCB y llegar a la etapa de prueba de hardware? ¿Qué software de diseño de PCB usaste?
@pericynthion He usado el MIG de Xilinx para generar el núcleo MCB. Acabo de medir el valor de velocidad máxima que ofrece.
@Quantum0xE7 El DDR3 fue mi parte inicial, así que ~6 meses. Tenga en cuenta que lo estaba haciendo en mi tiempo libre. Además, la placa es algo compleja con SRAM, FMC LPC, HDMI, PCIe, etc. El proyecto será de código abierto en algún momento, una vez que complete las pruebas y escriba las demostraciones. Yo uso el diseñador Altium.
¿Realizó la simulación de los rastros de DDR3 y otros rastros de alta velocidad en Altium Designer? ¿Has usado Hyperlynx? Cuando dices hacerlo en tiempo libre, ¿cuánto es eso por día o por semana?
@ Quantum0xE7 No, no simulé nada. Pero he buscado en Google un montón de placas DDR3/DDR2 y capturas de pantalla de diseño. Y vi que algunos diseños enrutados eran tan impredecibles. Como tengo SRAM en el diseño, tenía una copia de seguridad, así que solo lo hice yolo. Pasó mucho tiempo para comprender realmente qué y cómo quiero que se hagan las cosas. Eligiendo partes, leyendo documentos, revisando otros diseños, viendo tutoriales, etc. A veces paso 1 día completo por semana y otras veces paso 3/4 horas por día durante toda la semana. Redondearía a 1 hora al día o menos. Algunas etapas de diseño son divertidas y otras aburridas, depende de eso.
@batyastudios sería genial si pudieras compartir la experiencia de alguna manera, los recursos que usaste para llegar a la meta para esto. Me sorprende ver que no simulaste nada :O
@ Quantum0xE7 También hice un diseño DDR3 recientemente por primera vez en mi vida y también tomó aparentemente 6 meses y tampoco lo simulé :) También estoy pensando en hacer una pregunta similar como OP... probablemente...
@PF4Public, ¿no simulaste? ¿Qué tan seguro puedes estar de que funcionará? Me sorprende que hayas tardado 6 meses sin hacer ninguna simulación SI. ¿No funcionó al final?
@ Quantum0xE7 Usé el chip Allwinner, por lo que la información era realmente escasa, y mucho menos los modelos de simulación. Al igual que el OP, no hice esto todo el día, tenía otras tareas que hacer, pero hacer algo la primera vez lleva mucho tiempo para recopilar la información, absorberla, etc. Al final, mi placa no funcionó del todo, solo en parte y sospecho una cosa, que creo que hice mal, lo que arruina DDR, por eso también estoy considerando hacer una pregunta similar :)

Su clase clk, addr y ctl en realidad debería ser solo una clase. Típicamente llamado CA. Su reloj es realmente corto. Debe coincidir con CA.

Algunos consejos para hacer su vida más fácil en el futuro:

  • Enrute TODAS las señales en una clase en la misma capa. De esa forma, todas las señales en una clase tendrán exactamente el mismo número y tipo de vías, y la misma constante dieléctrica y velocidad de propagación. Para que todo se cancele automáticamente.

  • En la mayoría de los casos, las resistencias de terminación de 50 ohmios se pueden omitir en diseños punto a punto como este, donde CA solo alimenta una sola SDRAM. Ahorra toneladas de energía, simplifica el diseño y elimina la necesidad de un regulador VTT. Pero es posible que desee mantener la resistencia de terminación del reloj.

  • Los retrasos del paquete en el lado de la CPU/FPGA deben compensarse en diseños de alto rendimiento. El retraso del paquete es esencialmente los cables de enlace de longitud variable desde el silicio hasta la bola BGA. No tiene nada que ver con la síntesis/implementación.

Pero a 333 MHz tienes bastante margen para errores.

Como mencionaste, el reloj maestro es muy corto. Supongo que el rastro rojo es para el voltaje Vref. Debe conectarlo con una traza o polígono más ancho. Puede probar L4 como una señal en la pila. L3-L4 debe ser un material de núcleo más grueso que el otro núcleo o preimpregnados. No deben influirse entre sí.