cRIO címkéhez tartozó bejegyzések

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

Egyszerű példa a Desktop Execution Node használatára

Az előző posztban mutattam egy egyszerű FPGA-ra írt programot. Ebben a bejegyzésben azt mutatom be, hogy az FPGA kódot hogyan tudjuk egyszerűen tesztelni a számítógépen, ráadásul anélkül, hogy azt le kellene fordítsuk. Megjegyzés: az FPGA interfész használatához célszerű ha van egy megfelelően konfigurált Build Specification, ami pl. az első fordításkor is automatikusan létrejön, de manuálisan is létrehozhatjuk.

Ahhoz, hogy az FPGA kód a PC-n fusson, a Project Explorer ablakában az FPGA target helyi menüjében ki kell válasszuk, hogy a kód a PC-n hajtódjon végre. Ezt követően a VI az FPGA helyett a PC-n fog futni.

FPGA konfigurálása, hogy a kód a PC-n fusson. Ugyanezt a beállítást az FPGA Target Properties Execution Mode lapján is elérhetjük.

FPGA konfigurálása, hogy a kód a PC-n fusson. Ugyanezt a beállítást az FPGA Target Properties Execution Mode lapján is elérhetjük.

A számítógépen futó kód alapesetben szimulált I/O változókkal fut, ami általában véletlenszerű jeleket jelent. Amennyiben mi akarjuk meghatározni ezen jelek értékét két fő megoldásunk van. A FPGA Target Properties Execution Mode lapján kiválaszthatjuk, hogy a szimuláció ne véletlenszerű adatokkal fusson, hanem egy saját magunk által elkészített VI szolgáltassa a bemenő jeleket és kezelje a kimenő jeleket. Erre a LabVIEW egy Template-et biztosít, a módszerről bővebben itt lehet olvasni.

A másik, sok esetben egyszerűbb módszer, az FPGA Desktop Execution Node (DEN) használata. Ezen csomópont használata esetén a PC megadott mennyiségű FPGA órajelet szimulál le, miközben felülírhatjuk az FPGA I/O változóit, valamint az FPGA előlapi be és kimeneteit is. Az aktuális példában a DEN-t úgy konfiguráltam, hogy 1 us-ot hajtson végre, így 1 MHz-es mintavételezéssel tudjuk vizsgálni az FPGA állapotát.

A Dectop Execution Node konfigurálása. A Terminal Configuration segítségével meghatározhatjuk, hogy mely I/O vagy előlapi változókhoz szeretnénk hozzáférni.

A Dectop Execution Node konfigurálása. A Terminal Configuration segítségével meghatározhatjuk, hogy mely I/O vagy előlapi változókhoz szeretnénk hozzáférni.

A DEN akár önmagában is jól használható az FPGA működésének szimulálására, ugyanakkor az esetek többségében a host-vi-al, az FPGA interfész használatával együtt szeretnénk tesztelni az alkalmazásunkat. Az ehhez szükséges, viszonylag egyszerű demó kód a következő ábrán látható:

Az FPGA kód szimulálása PC-n a Desctop Execution Node segítségével.

Az FPGA kód szimulálása PC-n a Desktop Execution Node segítségével.

A kódban lévő Running változó arra szolgál, hogy a FPGA interfész csak akkor kezdje el az FPGA kód vezérlését, hogy ha a szimuláció fut, ha pedig megállítjuk a szimulációt, álljon le a Host interface loop is. Lokális változók helyett azért használok property node-okat, hogy a hibavezetékek segítségével biztosíthassam a végrehajtás sorrendjét. Profibb megoldásként használhatunk funkcionális globális változókat vagy egyéb eszközöket, mint Queue vagy Notifier. A Simulation loop nagyjából 10 ms-onként hajtódik végre, 1 s alatt 100 us-nyi FPGA időt szimulál le. Ha a dt 10 us, akkor minden 10 szimulációs ciklusra kapunk egy-egy új mintavételt. Természetesen, hogy ha az FPGA viselkedését komolyabb vizsgálatoknak szeretnénk alávetni (pl. átviteli függvény mérése), akkor a bemutatott egyszerű példánál lényegesen komplexebb kódot kell létrehozni. Erre nagyon jó példa a következő beépített LabVIEW példa: Simulation Analog Singnals with the DEN.lvproj (keresőszavak: desktop execution). Megjegyzés: a program indulása némi időt vehet figyelembe (akár fél percet), türelmesen kell várni.

Az aktuális példa futás közben

Az aktuális példa futás közben

A minta projekt letölthető innen: NI-7856R-FilterDemo

Egyszerű példa a LabVIEW FPGA interfész használatára

Ebben a bejegyzésben egy egyszerű példaprogramot mutatok be, amely a LabVIEW FPGA interfészt használja. A megvalósított feladat egy egyszerű elsőfokú IIR szűrő, a kód pedig az NI USB-7856R-on fut. Az FPGA kódja a következő ábrán látható:

Az FPGA-n futó elsőfokú IIR szűrőt megvalósító kód

Az FPGA-n futó elsőfokú IIR szűrőt megvalósító kód

A bemenet az AI0 csatorna, a kimenet pedig az AO0 csatorna, az IIR szűrőt megvalósító képlet: y_n = b_0 x_n + b_1 x_{n-1}+a_1 y_{n-1}. A számolás fixpontos számokkal történik, a szorzás műveletek úgy vannak konfigurálva, hogy a számok mérete ne váljon kezelhetetlenül naggyá. A felhasznált számok szóhossza nincsenek optimalizálva méret szempontjából, egy végső alkalmazás esetén erre külön figyelmet illik fordítani. A ciklusidőt a Loop Timer állítja be, 10 us esetén 100 kHz-es mintavételezési frekvenciát érhetünk el (a maximális mintavételi frekvencia 1 MHz). A program futtatásához megfelelően be kell állítani a paramétereket, ezt követően tesztelhetjük is az eredményt egy oszcilloszkóp segítségével.

Az FPGA-n futó kód előlapja a PC-ről futtatva.

Az FPGA-n futó kód előlapja a PC-ről futtatva.

Oszcilloszkóppal mért jelalakok

Oszcilloszkóppal mért jelalakok

Gyors tesztelést leszámítva nem szoktuk az FPGA kód előlapját közvetlenül használni a kód konfigurálására, hanem a PC-n futó szoftver irányítja az FPGA kódot, miközben egy megfelelő felhasználói interfészt biztosít. Az aktuális esetben is a szűrő megvalósításához szükséges konstansokat sem az FPGA-n célszerű számolni, hanem a PC-n először kiszámoljuk, majd pedig az eredményekkel felkonfigurálhatjuk az FPGA-t. A művelet megvalósításához a LabVIEW FPGA interfészt használhatjuk. Az alábbi példában, azért, hogy a kód minél egyszerűbb legyen, nem végzem el a paraméterek kiszámolását.

Az FPGA PC-ről vagy cRIO-ról való vezérlésének műveletei az FPGA Interface palettán találhatók.

Az FPGA Interface paletta

Az FPGA Interface paletta

A számítógépen futó host VI

A számítógépen futó host VI

Ahhoz, hogy hozzáférjünk az FPGA-hoz, először meg kell nyitnunk egy referenciát. Ezt követően a Read/Write Control csomópont segítségével írhatjuk vagy olvashatjuk az FPGA VI előlapi elemeit. A Close FPGA VI reference-vel felszabadíthatjuk az erőforrásokat. Az Open FPGA VI Reference-t megfelelően fel kell konfigurálni, ekkor meghatározhatjuk azt is, hogy a referencia megnyitásakor el is induljon az FPGA.

Az Open FPGA VI Reference konfigurálása

Az Open FPGA VI Reference konfigurálása

Az elkészített projekt

Az elkészített projekt

Az FPGA kódot egyrészt kipróbálhatjuk magán az USB adatgyűjtőn, ugyanakkor lehetőségünk van arra is, hogy az FPGA működését a számítógépen szimuláljuk. Erre a következő posztban mutatok egy egyszerű példát.

Megjelent: Mérés és adatgyűjtés laboratóriumi jegyzet

A TÁMOP-4.1.2.A/1-11/1-2011-0104 pályázat keretében elkészített Mérés és adatgyűjtés laboratóriumi jegyzet megjelent a tankönyvtár oldalán. A jegyzetet itt lehet elérni: http://www.tankonyvtar.hu/hu/tartalom/tamop412A/2011_0104_SZTE-3_Meres_es_adatgyujtes/adatok.html 

A jegyzet témakörei:

  • A LabVIEW programozási környezet
  • Multiméterek és oszcilloszkópok használata
  • Műszerek vezérlése LabVIEW környezetből
  • Mérések végzése és mérési adatok feldolgozása
  • Szenzorok és távadók vizsgálata
  • Kommunikációs protokollok, távmérés
  • Valós idejű rendszerek programozása

A magyar nyelvű jegyzet mellett megjelent egy angol nyelvű kiegészítő is, elsősorban külföldi hallgatók számára, ez itt érhető el: http://www.tankonyvtar.hu/hu/tartalom/tamop412A/2011_0104_SZTE-4_Measurement_supplement/adatok.html

Virtuális műszerek és Szoftverdefiniált műszerek

Ahogy a technika fejlődött, számos műszert fejlesztettek ki különböző célokra (pl. multiméter, oszcilloszkóp, spektrumanalizátor, Lock-in erősítő); az idő telésével pedig ezek a műszerek egyre többet tudtak, egyre okosabbak lettek. Problémát jelentett ugyanakkor, hogy komplexebb mérések esetén az egyénnek számos műszert kellett egyszerre kezelni, valamint a mérés végeredménye is csak hosszas számolást követően született meg. E miatt merült fel az igény, hogy a műszereket kössük számítógépekhez, és a számítógépen futó program hangolja össze az egyedi műszerek működését, valamint számolja ki a felhasználó számára hasznos adatokat. Így tulajdonképp egy újfajta műszer jött létre, melynek működését elsősorban a számítógépen futó szoftver határozza meg. A szoftver cseréjével pedig ugyanazok a hardverelemek egészen más feladatra is alkalmassá tehetők. Az így létrehozott műszereket virtuális műszereknek hívjuk.

A virtuális műszerek egy új fizikai műszer igényét fogalmazták meg: az univerzális adatgyűjtőét, mely nem egy speciális feladatra van kitalálva, nincsenek is rajta kezelőszervek, hanem kizárólag számítógépről használhatók. Ugyanakkor, a könnyen fejleszthető és cserélhető szoftvernek köszönhetően, ugyanaz a hardver számos komplex mérési feladatra alkalmassá tehető. Az egyre inkább elterjedő moduláris műszerek pedig azt a lehetőséget is megteremtették, hogy könnyen személyre szabhassuk mérőrendszerünkben a bemenetek és kimenetek számát, típusát és tulajdonságait.

Egy hátránya viszont van ezeknek a műszereknek: mivel a vezérlő és feldolgozó szoftver döntő többsége a számítógépen fut, csak korlátozottan alkalmasak gyors reagálást igénylő komplex mérések és vezérlések lebonyolítására. Ehhez az szükséges, hogy a személyre szabható szoftver magán a műszerbe beágyazott feldolgozóegységen fusson. Az így létrehozott műszereket szoftverdefiniált műszereknek hívjuk (hard virtual instrumentation-ként is hivatkoznak rá). A feldolgozóegység lehet beágyazott számítógép is, de manapság egyre gyakoribb, hogy egy FPGA-n „futó” szoftver határozza meg a műszer tényleges viselkedését.

Utóbbira jó példa a NI USB-7856R adatgyűjtő, melyben egy Kintex-7 160T FPGA végzi a vezérlést. A NI PXIe-5170R újrakonfigurálható oszcilloszkóp esetén pedig nagy sebességű méréseket végezhetünk, pl. speciálisan az adott alkalmazásra szabott trigger feltételek között.

Rövid LabVIEW képzések

A CEFAIC pályázat keretein belül három rövid LabVIEW képzést indítunk. A képzések a LabVIEW programozás alapjait tekinti át, valamint bemutatják, hogyan lehet különböző adatgyűjtő eszközöket programozni. A kurzust az egyetemen dolgozó kollégáknak, valamint diákoknak ajánljuk.

Mindhárom képzés 2x3 órás, csütörtökönként 14:00 és 16:30 között, a helyszín pedig az Irinyi 116-os laboratórium.

A kurzusok:

  • Bevezetés a LabVIEW használatába, április 10. és 17.
  • NI adatgyűjtők programozása LabVIEW segítségével, április 24. és május 8.
  • Valós idejű (cRIO) rendszerek programozása, május 22. és 29.

A képzések ingyenesek, további részletek itt:
http://www.inf.u-szeged.hu/~mingesz/Education/CLV/