Robi bejegyzései

ICNF 2017

Megjelent az első felhívás a 2017-es ICNF (International Conference on Noise and Fluctuations) konferenciára. A konferencia június 20 és 23 között lesz megtartva Vilnius-ban. Az absztraktokat január 22-éig kell beküldeni. A konferencia legfontosabb témái:

  • Zajok, fluktuációk és sztochasztikus folyamatok elmélete
  • Zajok szilárdtestekben, elektronikus eszközökben, optoelektronikus eszközökben
  • Zaj a kommunikációban
  • Zaj modellezése és szimulációja
  • Mérési módszerek
  • A zaj mint diagnosztikai eszköz
  • Akusztikus zaj

A konferenciáról többet a konferencia honlapján lehet olvasni: http://www.icnf2017.ff.vu.lt/

Ajánló: Dangerous Prototypes

Ha általában érdekel az elektronika, akkor egy nagyon hasznos blog a Dangerous Prototypes. Egyrészt vannak benne egyszerű áramkörök, mindenféle do it yourself projektek (pl. 3D nyomtató, egyszerű műszerek, stb.), egyszerűen megvásárolható modulok leírása, használatuk, ugyanakkor elméletibb jellegű anyagok is vannak (pl. akkumulátorok működése, disszipáció tervezése, stb.).

Új cikk: bankkártyák biztonságának növelése a KLJN kommunikáció segítségével

Kish László és társai írtak egy új és érdekes cikket a KLJN alkalmazására. A cikkben részletesen bemutatják, hogy hogyan lehetne a bankkártya és az ATM közötti kommunikációt biztonságosabbá tenni a KLJN alkalmazásával. Az alkalmazásnak mindenképp előnye, hogy mivel a kártya és az ATM elektronikája közel van egymáshoz, a sávszélesség, és így az átviteli sebesség is igen komoly lehet. A cikk jelenleg az arxive preprint szerveren érhető el, bírálata jelenleg folyamatban van.

A cikk teljes címe: "Unconditionally secure credit/debit card chip scheme and physical unclonable function"

WRO verseny eredménye

A WRO egy nemzetközi robotikai verseny, ahol az Advanced Robotics Challenge szekció elsősorban egyetemistáknak szól. A verseny keretein belül egy bowlingozó robotot kellett elkészíteni, a robot elkészítéséhez szükséges TETRIX robot kit-et és a MyRIO vezérlőt a NI kölcsönözte a csapatok részére.

A verseny során számos kihívással és technikai problémával kellett megküzdeni, mindenkép tanúságos volt. Szegedről négy csapat is indult a magyarországi fordulón, a kutatócsoporthoz kötődő MiBMaH a 14. lett.

Egy WRO robot

Egy WRO robot

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.

Egyedi LabVIEW subVI ikonok készítése

Ha saját subVI-t készítünk, célszerű annak az ikonját is megszerkeszteni, mégpedig úgy, hogy annak formája minél jobban tükrözze a végrehajtott funkciót. Ha a VI jobb felső sarkára az ikonra duplán kattintunk (vagy a helyi menüből kiválasztjuk az Edit Icon … opciót), megnyílik az ikonszerkesztő. Ebben egy hagyományos képszerkesztő programhoz hasonlóan tudjuk szerkeszteni az ikon kinézetét. Néhány extra opció azért elérhető. Egyrészt a Layer fülön különböző rétegeket definiálhatunk, illetve ki-be kapcsolhatunk rétegeket. Tudunk különböző előre definiált alakzatokat is használni és elhelyezni a Glyphs fülön. Tudunk egyszerűen többsoros szöveget írni az Icon Text fülön. A Templates fülön pedig kiválaszthatunk előre elkészített mintákat. A Template-eket valamint a Glyphs-eket egyszerűen tudjuk bővíteni, ha új fájlokat helyezünk el a megfelelő könyvtárakba. A Tools menü List Glyps and Icon Templates menüje segítségével kilistázhatjuk az aktuális fájlokat, valamint azt is, hogy a számítógépen ezeket mely könyvtárakban találhatjuk meg. Az Edit menü Show Terminal menüjével bekapcsolhatjuk a terminálok helyét, ezzel láthatjuk, hogy a vezetékek hova fognak befutni.

Az alábbi példában egy egyszerű várakozást végrehajtó VI-t mutatok be. A megvalósított funkció az előző posthoz kapcsolódik, és lényegében az Express Time Delay funkcióját valósítja meg. Annyiban jobb a bemutatott VI, hogy nem lebegőpontos számokkal dolgozik (amit az Express VI átszámol ms-ba), hanem eleve ms-ban kéri a kívánt várakozás idejét.

Várakozást megvalósító VI diagramja

Várakozást megvalósító VI diagramja

Várakozást megvalósító VI ikonja

Várakozást megvalósító VI ikonja

subVI felhasználása

subVI felhasználása

Ahogy a fenti képen látszik, a saját magunk által készített VI ki tudja váltani az Express VI feladatát, azonban mérete miatt megzavarja a vezetékezést. Szerencsére ezen segíthetünk, a LabVIEW-ban nem szükséges, hogy a VI a megadott négyzet méretű legyen. Ehhez töröljük ki az eredeti ikon szélét, majd rajzoljunk egy olyan alakot, ami megfelel a kívánalmainknak. A VI széle (ahogy az ikonszerkesztő is mutatja), átlátszó lesz. Célszerű még a vezetékek bekötését is átrendezni, hogy a legjobban tudjuk felhasználni az elkészített subVI-t. Az elkészült VI az alábbi képeken látható.

Egyedi méretű ikon szerkesztése

Egyedi méretű ikon szerkesztése

Egyedi méretű subVI felhasználása

Egyedi méretű subVI felhasználása

Késleltetések a LabVIEW-ban

LabVIEW program írása közben sokszor szükség van arra, hogy bizonyos műveletek végrehajtása közé valamennyi várakozást iktassunk be. Erre a legegyszerűbb módszer az, hogy ha a Flat sequence struktúrát használjuk fel. A következő példában a műszer digitális kimenetén változtatjuk meg a bit-ek állását egy megadott idő után (megjegyzés: mivel nem valós idejű rendszert programozunk, a váltás ideje nem lesz determinisztikus). Az azt követő példában pedig az előlapon lévő LED kijelző-n hozunk létre egy impulzust.

Időzítések Flat Sequence segítségével

Időzítések Flat Sequence segítségével

Előlapi kijelzés időzítése Flat Sequence segítségével

Előlapi kijelzés időzítése Flat Sequence segítségével

A megadott példákkal az a probléma, hogy azok nem követik a LabVIEW adatfolyam programozási elvét (data flow programming), vagyis nem az adatok rendelkezésre állása időzíti a program végrehajtását. A problémát az okozza, hogy a várakozó rutin (mely eléggé „ősi”) nem rendelkezik a szokásos Error In és Error out vezetékekkel, melyekkel könnyen megoldható lenne a sorrendiség biztosítása. Megoldásként használhatjuk az Express Time Delay rutint, mely elsőre elég bumfordinak tűnik, de van ikonnézete is, amikor már egész használható. (Megjegyzés: ms helyett másodpercben kéri a várakozási időt).

Express Time Delay

Express Time Delay

Az Express vi-t felhasználva máris elkészíthetjük az előző példák sequence nélküli verzióját. Az előlapi kijelző elérésénél még azt kell módosítsuk, hogy a lokális változók helyett property node segítségével módosítsuk a kijelző értékét, mely ugyanúgy rendelkezik Error In és Error Out vezetékkel mint a többi sorba fűzhető VI.

Időzítés Express Time Delay segítségével

Időzítés Express Time Delay segítségével

Példa property node-ok használatára

Példa property node-ok használatára