Memória kezelése NI FPGA-n

Adatok tárolásáról az FPGA-n találhatunk leírást itt és itt. Ebben a bejegyzésben bemutatok egy egyszerű projektet, ami a memóriát olvasva állít elő egy periodikus analóg jelet.

Memóriát legegyszerűbben a Project Explorerben adhatunk hozzá az FPGA target-hez. A kiválasztott memória esetén a Memory Properties párbeszédablakban állíthatjuk be többek között a memória nevét, méretét, típusát (nagyobb adatmennyiség tárolására a Block Memory a legjobb opció) és a tárolt adatok típusát.

Memória hozzáadása az FPGA target-hez

Memória hozzáadása az FPGA target-hez

Az alábbi ciklus állítja elő a memória tartalom alapján a kimenő analóg jelet. A shift regiszter az index léptetésére szolgál. A bemutatott logika helyett elvileg maradékos osztást is lehetne alkalmazni, azonban FPGA target esetén kifejezetten nem javasolják bármilyen osztás vagy maradékos osztás használatát azok jelentős erőforrás igénye miatt. A memória olvasó node-ot a Project Explorer-ből egyszerűen elhelyezhetjük a programunkban, ekkor az alapértelmezett Memory Write metódus kerül kiválasztásra. Olvasássá úgy alakíthatjuk át a node-ot, hogy a helyi menüben kiválasztjuk a Select Method/Read opciót. A példában az N határozza meg, hogy hány pontból álljon a periodikus jel, a Count határozza meg a kimenet frissítésének gyakoriságát, az i és a Data változó pedig hibakeresési célokra szolgál.

Egyszerű példa a memória olvasására

Egyszerű példa a memória olvasására

Ami fontos kérdés ebben a példában: hogyan kerülnek az adatok a memóriába?

Egyrészt, fel tudjuk tölteni kezdő adatokkal az Initial Values fülön a Memory Properties párbeszédablakban. Ugyanakkor a legtöbb esetben azt szeretnénk, hogy a PC-ről bármikor frissíthessük a memória tartalmát, hogy az éppen kívánt jelet állíthassuk elő. Sajnos erre nincs beépített megoldás, nekünk kell írni egy apró programot, ami elvégzi a feladatot.

Memória írása a DMA FIFO-t felhasználva

Memória írása a DMA FIFO-t felhasználva

A fenti kódban a DMA FIFO-t használjuk arra, hogy lehetőséget adjunk a PC-nek a memória kezelésére. DMA FIFO-t a memóriához hasonlóan adhatunk hozzá az FPGA target-hez, jelen esetben a „Host to Target - DMA” opciót kell kiválasszuk, adattípusként pedig az U64-et választottam. Ebben az esetben a felső 32 bit a memória címét tartalmazza, az alsó 32 bit pedig a memória értékeket. Természetesen, szükség esetén lehet optimalizálni a felhasznált adattípust. Azért választottam, hogy így legyenek egybecsomagolva az adatok, mert ebben az esetben semmiképp sem fordulhat elő, hogy véletlenül felcserélődik a két adat. A kapott 32 bit-es adatot először átalakítom a kívánt adattípusba, majd pedig eltárolom a memóriába a kapott címre.

A memória feltöltése és a többi paraméter írása a LabVIEW FPGA interfészen keresztül történik. Az alábbi példaprogramban először az N és a Count paraméterek vannak beállítva (Read/Write control), majd pedig egy ciklusban le vannak töltve az adatok (Invoke Method; Method / FIFO neve / Write). Alapértelmezésben a Close FPGA Reference le fogja állítani az FPGA kódot, ezért azt át kell konfigurálni a helyi menüből (a Close and Reset is Last Reference helyett az egyszerű Close).

A Host VI

A Host VI

A teljes megoldás PC-n való tesztelésére használhatjuk a Desktop Execution Node-ot, egy egyszerű VI látható a következő ábrán. A VI-t futtatva, látjuk, hogy az FPGA épp hogy működik, a Host VI-t futtatva pedig frissíthetjük az FPGA beállításait és a memória tartamát. A teljes projekt letölthető innen: NI-7856R-MemoryDemo.zip

Hozzászóllások