Interfacciare la memoria volatile DDR a FPGA senza esperienza pregressa può inizialmente sembrare piuttosto intimidatorio. Nonostante la flessibilità intrinseca di un FPGA, dove potremmo presumere di poter collegare l'I/O della memoria DDR esterna praticamente ovunque a qualsiasi pin libero, dobbiamo comunque considerare molte limitazioni.
Ad esempio, dove posizionare certi gruppi di pin della memoria DDR, quali tensioni utilizzare per le banche, quali orologi ci servono e dove collegarli, come evitare violazioni dei tempi, e così via.
Oltre all'interfacciamento a livello di schema, dobbiamo anche preoccuparci dell'interfaccia "nel mondo reale" sul circuito stampato, come alimentazione e distribuzione, decoupling, terminazione, impedenza e lunghezza delle tracce, abbinamento dei ritardi, e altro ancora.
Questo articolo esaminerà l'interfacciamento della memoria DDR con le FPGA da un punto di vista a livello di sistema e di schema. Come esempio pratico, esamineremo un design DSP audio basato su AMD/Xilinx Spartan-7 (denominato 'Xerxes'), che si interfaccia con della memoria DDR2.
Hardware DSP audio Xerxes (FPGA AMD/Xilinx Spartan-7 con memoria DDR2)
Il tipo di memoria che utilizziamo dipende dal design. Dipende dalle nostre esigenze di capacità e larghezza di banda della memoria, così come da ciò che la nostra FPGA scelta è in grado di fare.
Generalmente, la maggior parte delle FPGA moderne può interfacciarsi con memoria DDR2 e DDR3 (e le loro varianti a basso consumo e bassa tensione). Ovviamente, è anche possibile utilizzare memoria DDR4 più veloce e versioni successive, ma solitamente solo per FPGA più avanzate.
Non solo la massima velocità di trasferimento dati possibile è importante, ma anche i requisiti di tensione e potenza, il tipo di pacchetto, il costo e la disponibilità sono importanti. Tutto ciò deve essere considerato nelle prime fasi della progettazione.
Confronto Memoria DDR (Fonte: synopsys.com)
Quando scegliamo il nostro tipo di memoria, dobbiamo anche prestare attenzione al grado di velocità del dispositivo di memoria e alla valutazione della velocità del controller di memoria all'interno dell'FPGA. Possiamo scegliere di "derating" la nostra memoria o il controller, quindi non funzionando a piena larghezza di banda, il che a sua volta ci dà più margine di tempo.
Tabella tipica di Derating della Memoria (Fonte: AMD/Xilinx UG933)
Specificamente per le FPGA AMD/Xilinx, suggerirei di scaricare il loro IDE Vivado e giocare con il Memory Interface Generator (MIG) IP gratuito.
Questo ti mostrerà rapidamente quali tipi di memoria, gradi di velocità e parti compatibili puoi utilizzare.
Esempio di parti di memoria compatibili con Vivado MIG
Potresti chiederti, perché ho scelto la memoria DDR2 per la scheda Xerxes?
Anche se è uno standard piuttosto vecchio, usare la memoria DDR2 significava che potevo utilizzare il regolatore da 1.8V già disponibile sulla scheda (che alimenta altre parti del FPGA) e non dovevo aggiungere un altro regolatore separato.
Inoltre, il design di Xerxes non ha particolari requisiti di larghezza di banda della memoria, e quindi un'interfaccia DDR2 era sufficiente.
Inoltre, avere un'interfaccia a larghezza di banda inferiore semplifica il PCB, la terminazione e i vincoli di temporizzazione.
Dopo aver scelto un dispositivo di memoria adatto, è il momento di collegarlo all'FPGA nel tuo schema.
Prima, dobbiamo scegliere una banca adatta. Se stai utilizzando un'interfaccia dati larga 16 bit (o inferiore), per la maggior parte degli FPGA questa può di solito adattarsi in una banca. Se no, dobbiamo dividere l'interfaccia di memoria su più banche.
Per semplicità, opteremo per un'interfaccia di memoria larga 16 bit, come nel caso della scheda Xerxes. Scegli una banca libera che possa funzionare con la stessa tensione della memoria DDR stessa (nel caso di Xerxes, questa è la banca 34 a 1.8V a causa dell'uso della memoria DDR2).
Banca FPGA 34 con Decoupling Appropriato Alimentato dal Fornitore 1.8V
Per gli FPGA AMD/Xilinx, utilizzando gli strumenti Vivado e MIG, ottenere il pin-out per la nostra memoria DDR è molto semplice. Lo strumento suggerisce un pin-out adatto per quella banca, oppure possiamo assegnare manualmente i pin e verificare il pin-out.
Strumento Pin-Out Vivado MIG
Se configuri manualmente il pin-out, assicurati che i singoli canali byte DDR abbiano lo stesso numero di byte della banca e che gli strobe differenziali siano sui pin DQS capaci differenziali dell'FPGA.
Ricorda che il pin-out sarà probabilmente aggiustato durante la fase di layout e routing del PCB. Grazie alla flessibilità dell'FPGA, scambiare i pin durante il processo di progettazione del PCB può semplificare il routing e minimizzare le transizioni tra i layer.
Per questo esempio, poiché stiamo funzionando da una singola banca, dobbiamo usare il VREF interno, limitando la larghezza di banda massima della memoria.
Inoltre, dobbiamo prestare attenzione al clocking. Idealmente, la fonte di clock dovrebbe essere nella stessa banca collegata a un pin (o pin, se si utilizza una fonte di clock differenziale) capace di clocking.
Infine, assicurati di utilizzare gli strumenti dei fornitori per verificare il progetto e il timing. Quindi, con il pin-out iniziale a posto, nel tuo schema, definisci classi di net, coppie differenziali e regole, e usa la codifica colori per rendere la vita del tuo progetto PCB più semplice.
Connessioni DDR2 e sorgente di clock del Bank 34 FPGA
Per un singolo dispositivo, abbiamo semplicemente bisogno di realizzare connessioni punto-punto sulla componente della memoria DDR.
La terminazione dovrebbe essere presente sui segnali di indirizzo/comando/controllo (ACC); tuttavia, per tassi di dati inferiori possiamo spesso farne a meno. Io aggiungo sempre la terminazione sulla coppia di clock differenziale. Le corsie di byte dei dati sono terminate internamente su entrambe le estremità.
Si raccomanda di posizionare resistori di pull-down da 4.7k sui pin CKE, ODT e, opzionalmente, sulle linee CS#.
Connessioni di segnale e alimentazione del modulo di memoria DDR2
Infine, ovviamente il modulo di memoria deve essere alimentato. Nel caso della scheda Xerxes, il modulo DDR2 è connesso allo stesso regolatore da 1.8V del nostro bank 34 FPGA. È richiesta un'adeguata decoupling – come regola generale, se non specificato diversamente nei datasheet o nelle note applicative, l'obiettivo è utilizzare un piccolo condensatore (~100nF) per ogni due pin VDD e un condensatore di massa più grande per ogni dieci pin VDD.
La tensione del pin VREF può essere generata tramite un semplice divisore di potenziale con un condensatore di filtraggio, come mostrato nell'immagine sopra.
In questo articolo, abbiamo delineato le strategie di base per incorporare la memoria DDR esterna, non volatile, nei nostri progetti basati su FPGA da un punto di vista a livello di sistema e di schema.
Ricorda che questi sono i concetti di base, e a seconda delle esigenze del tuo sistema, il progetto sarà molto più complesso. Specialmente, se prevedi di utilizzare parti di memoria e interfacce più veloci, e più moduli.
Quando progetti sistemi avanzati basati su FPGA e DDR, assicurati di utilizzare gli strumenti e le funzionalità contenuti in strumenti ECAD di classe mondiale come Altium Designer. Assicurati di ottenere la tua prova gratuita di Altium Designer e Altium 365 qui.