2016. február hónap bejegyzései

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.