FPGA címkéhez tartozó bejegyzések

Nyertes GINOP 2.2.1 pályázat

Jó hír, hogy nyert az evoproval közösen beadott „Újszerű ipari integrált irányítási szoftver keretrendszer kutatása és alkalmazása kísérleti fizikai nagyberendezésekre” című pályázatunk. A pályázat keretein belül a kutatócsoportunk elsősorban kísérleti nagyberendezésekhez (Big Physics) fog HIL tesztrendszereket valamint LabVIEW-TANGO interfészt fejleszteni.

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.

FPGA és ARM processzor egy pite áráért?

A Raspberry PI egy igen kedvelt beágyazott rendszer mind amatőr körökben, mind az oktatásban, de akár ipari rendszerekben is használható. Ugyanakkor korlátai miatt, önmagában nehéz tudományos rendszerekben használni. Többek között nincsenek rajta analóg be és kimenetek, valamint valós idejű vezérléseket és méréseket is körülményes rajta megoldani. Nemrég jelent meg egy új közösségi finanszírozású projekt, a snickerdoodle.

A snickerdoodle egy Zync 2010-as egylapkás rendszert (SoC) tartalmaz, mely két Cortex-A9 magot tartalmaz Atrix-7 FPGA-val egybeépítve. Az ARM magok alkalmasak az operációs rendszerek futtatására valamint az összetettebb adatfeldolgozásra, míg az FPGA lehetővé tesz gyors, valós idejű párhuzamos vezérlést és adatfeldolgozást. A panel 100, az FPGA-ról vezérelhető GPIO mellett 12 bit-es ADC és DAC vonalakat is tartalmaz. A snickerdoodle black pedig a komolyabb képességű Zynq-7020-as lapkát tartalmazza.

A snickerdoodle képe

A snickerdoodle képe

Érdekesség: az National Instruments System on Module (SOM) rendszere is egy Zync-7020-ra épül. Lényeges különbség az ár (kb. 200 000 Ft/modul), ugyanakkor az NI megoldása kényelmesen programozható LabVIEW-ban, e mellett várhatóan a két modul megbízhatósága sem összehasonlítható (nyilván a SOM javára).

NI SOM

NI System on Module

Kezdő lépések a NI USB-7856R programozásában

Ahhoz, hogy az NI USB-7856R eszközt programozzuk, mindenképp szükség lesz egy LabVIEW projektre. Egyrészt fel lehet használni a Create Projekt párbeszédablakban a Templates/Desctop/LabVIEW FPGA Projekt template-et, ugyanakkor nem sokkal körülményesebb (sőt, talán még egyszerűbb is), hogy ha egy üres projektből (Blank Projekt) indulunk ki. Mivel a mérőeszköz közvetlenül, USB kapcsolaton keresztül, kapcsolódik a számítógéphez, ezért a My Computer-hez kell hozzáadjuk a helyi menü New/Target and Devices... menü segítségével.

Az FPGA target hozzáadása a projekthez

Az FPGA target hozzáadása a projekthez

Ha az eszköz csatlakoztatva van a számítógéphez, akkor az Existing target or device segítségével megtalálhatjuk és kiválaszthatjuk, egyébként a New target or device menü segítségével kiválaszthatjuk egy listából.

Az aktuális műszer kiválasztása

Az aktuális műszer kiválasztása

A műszer bemeneteit és kimenetei, a DAQmx driverrel szemben, a Project Explorer window-ban érhetők el (IO változóként). A szükséges IO elemeket az FPGA targetre kattintva a helyi menü New/FPGA I/O menüje segítségével választhatjuk ki.

VI-ok létrehozásánál figyelnünk kell, hogy az adott kódot hol is szeretnénk futtatni. Amennyiben a kód a My Computer-hez van hozzárendelve, akkor a kód a számítógépen fog futni. Ahhoz, hogy az FPGA-t programozzuk, a VI-t az FPGA Target csomópont alá kell hozzáadni a helyi menü New/VI parancsa segítségével. A kód elkészítése után a VI a hagyományos módon futtatható. A LabVIEW először legenerálja a fordításhoz szükséges ideiglenes fájlokat, majd pedig elindul a fordító, mely véges idő után elkészíti az FPGA-n futó bit-fájlt. A fájl automatikusan letöltődik, majd az FPGA elkezdi a kód végrehajtását. A kódot futás közben felügyelhetjük a PC-ről továbbra is elérhető vi előlapja segítségével.

Az aktuális program futtatása

Az aktuális program futtatása

Megjegyzések:

  • Az FPGAn a LabVIEW műveleteknek csak egy részhalmaza érhető el, e mellett a szokásostól kissé eltérő programozási stratégiákat érdemes követni (ezekről később még lesz szó).
  • A fordítószerver indulásáig néha kicsit várni kell, a fordítás maga pedig hosszas időt vehet igénybe (rövid programok esetén általában legalább 5 perc, bonyolultabb kódok esetén akár órákig is tarthat a fordítás).
  • Fordítás közben kaphatunk fordítási hibát, pl. azért mert túl sok erőforrást szeretnénk felhasználni, vagy azért, mert valamely műveletet az FPGA nem tudná a kívánt időtartam alatt elvégezni. Utóbbi könnyel előfordulhat, amennyiben nem figyelünk oda a felhasznált adattípusok nagyságára, pl. fixpontos műveletek esetén a szóhosszúság hajlamos egyre nagyobb és nagyobb lenni.

Számolás fixpontos számokkal

A programozás során legelterjedtebb számformátumok az egész számok, valamint a lebegőpontos számok. Utóbbiak előnye, hogy nem csak egész számokat tudnak ábrázolni, így komoly szerepük van jelfeldolgozási feladatok közben. Hátrányuk viszont, hogy a velük végzett műveletek komoly erőforrásokat igényelnek, e mellett számos platform nem, vagy csak nagyon korlátozottan támogatja felhasználásukat. Éppen ezét, amennyiben beágyazott rendszereken szeretnénk jeleket feldolgozni, találkozni fogunk a fixpontos számok fogalmával.

 

Lebegőpontos és fixpontos számok összehasonlítása

Lebegőpontos és fixpontos számok összehasonlítása

A fixpontos számok egy egészrészt valamint egy törtrészt tartalmaznak. A szám deklarálásakor dönthetjük el, hogy mekkora az egész rész és a törtrész bithossza. A két rész összege tipikusan 8, 16, 32 vagy 64 bit lehet, azonban vannak olyan platformok (pl. FPGA), melyek tetszőleges bithosszt támogatnak.

Fixpontos számok esetén a számokat a feldolgozó egység (processzor, FPGA) egész számként kezeli a számokat, és csak a fordító (valamint a programozó) foglalkozik azzal, hogy éppen hol van a tizedes pont. Ennek köszönhetően a fixpontos számokkal végzett számolások nagyságrendekkel kevesebb időt és/vagy erőforrást igényelnek, mint a lebegőpontos számok.

A NI FPGA alapú eszközei, bár korlátozottan támogatják a lebegőpontos számokat (egyszeres pontosságúakat), jelfeldolgozási célokra fixpontos számokat célszerű használni. LabVIEW esetén a fixpontos számokat a következő paraméterekkel tudjuk felkonfigurálni:

  • Word length: teljes szóhosszúság (egészrész + törtrész)
  • Integer word length: egészrész hossza
  • Signd/unsigned: előjeles vagy előjel nélküli szám (a negatív számok kettes komplemens alakban vannak tárolva)
  • Include overflow status: a fixpontos szám egy extra biten tárolni fogja, hogy történt-e túlcsordulás a számolások közben

A megadott paraméterek alapján a LabVIEW kiszámolja, hogy mi az ábrázolható számtartomány (Minimum, Maximum), valamint az aktuális felbontás (Delta). FPGA analóg bemenetek és kimenetek tipikusan a <±,20,5> adattípust használják, ami egy előjeles 20 bit-es fixpontos számot jelöl, melynek egészrésze 5 bit-es. Ezzel az adattípussal a ±10 V-os mérési tartomány kényelmesen lefedhető 30 µV felbontással.

Fixpontos adattípus konfigurálása a Properties menü segítségével

Fixpontos adattípus konfigurálása a Properties menü segítségével

Fixpontos számokon végzett műveletek közben az alapműveleteket végző node-ok automatikusan adaptálják magukat a forrás adatokhoz, szükség esetén bővítve a végeredmény méretét, hogy ne történhessen túlcsordulás. Amennyiben ez a végeredmény nem felel meg számunkra, pl. nem akarjuk tovább növelni az adatméretet, akkor azt manuálisan is tudjuk konfigurálni, megadva a kívánt formátumot, a kerekítés módját, valamint, hogy túlcsordulás esetén mi legyen az alapértelmezett viselkedés. Amennyiben nem az alapértelmezett formátumot választjuk, a művelet végén egy kék pötty jelöli a típuskonverziót. Megjegyzés: ha egy művelet végén egy piros pötty jelenik meg, az azt jelöli, hogy az eredmény túllépné a 64 bit-et, így a LabVIEW egy automatikus típuskonverziót kénytelen végrehajtani.

A műveletek eredményének konfigurálása (adattípus, kerekítés és szaturációs mód)

A műveletek eredményének konfigurálása (adattípus, kerekítés és szaturációs mód)

Amikor fixpontos számokat konvertálunk egész számokká, két fő funkcióra lehet szükségünk. Az egyik, amikor a fixpontos szám egészre kerekített értékére vagyunk kíváncsiak. Ez a konverzió történhet automatikusan, implicit castolással, vagy expliciten, a Numeric/Conversion paletta segítségével. Ugyanakkor sokszor az összes olyan bitre kíváncsiak vagyunk, melyek a fixpontos számot alkották, a végeredményt egész szám alakjában szeretnénk feldolgozni. Erre a feladatra a Numeric/Fixed point/Fixed Point to Integer Cast funkciót használhatjuk. A művelet fordítottját valósítja meg az Integer to Fixed Point Cast funkció. Utóbbit konfigurálhatjuk manuálisan, a Properties menü segítségével, vagy a függvény középső bemenetére adott „minta” segítségével.

A megfelelő erőforrás-felhasználás szempontjából célszerű a fixpontos adattípusokat a lehető legkisebb nagyságon tartani. Ellenkező esetben a számolások FPGA esetén túlzottan sok FPGA felületet fognak igényelni, megnő a fordítási idő, illetve, szélsőséges esetén le sem fordul a kód.

Irodalom:

NI USB-7856R

A tanszék a REVLAB pályázat keretén belül szerzett be egy NI USB-7856R multifunkciós USB valós idejű adatgyűjtőt. A projektben elsősorban valós idejű vezérlési, jelfeldolgozási és jelgenerálási feladatokat valósítunk meg az eszköz segítségével. E mellett az eszköz tudományos kutatási és oktatási feladatokban is fel lesz használva, többek között két futó szakdolgozat is felhasználja ezt az eszközt.

NI USB-7856R

Az adatgyűjtő magja egy Kintex 7 160T FPGA, mely LabVIEW-ból közvetlenül programozható az NI FPGA modul segítségével. Ennek köszönhetően az eszközre egyszerűen lehet definiálni nagy teljesítményű szoftverdefiniált műszereket. Az eszközt USB-n keresztül közvetlenül a számítógéphez tudjuk kötni, a FPGA és a PC közötti adatátvitelt DMA csatornák biztosítják. A program feltöltését követően az eszköz korlátozottan, a PC használata nélkül is működtethető.

Az eszköz legfontosabb tulajdonságai:

  • 8 db 1 MHz-es 16 bit-es analóg bemenet, 4 különböző mérési tartománnyal, szimultán mintavételezés
  • 8 db 1 MHz-es 16 bit-es analóg kimenet
  • 32 db 80 MHz-es digitális I/O vonal
  • 16 db 10 MHz-es digitális I/O vonal
  • 202 800 Flip-Flop, 101 400 LUT, 11 700 Kib RAM, 600 DSP egység
  • 40, 80, 120, 160 vagy 200 MHz órajel
  • 3 DMA csatorna

A műszer két VHDCI csatlakozóval rendelkezik, melyekről az NI SCB-68A és NI SCB-68 HSDIO csatlakozóblokkokra vezethetjük az analóg és digitális jeleket. (Érdekesség: az SCB-68A csatlakozóblokkra rajzolt kiosztás nem felel meg a műszer által jelzett kiosztásnak, a helyes elrendezést a „Where Can I Find NI SCB-68A Quick Reference Labels?” oldalon lehet elérni.)

A készülék ára a csatlakozókkal együtt kb. 2 MFt. Ez nyilvánvalóan nem kevés, csak akkor célszerű egy ilyen eszköz beszerzése, hogy ha valaki valóban ki is használja a képességeit, pl. a nagy számú és gyors analóg és digitális I/O vonalakat, valamint a beépített FPGA programozhatóságát.

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.