[LNIV Red Pitaya](index.html) # Grafični vmesnik osciloskopa Naprava STEMlab, slovenskega podjetja Red Pitaya, je odprtokodna razvojna platforma, ki v privzetem služi kot merilni instrument. Ena od funkcionalnosti merilne naprave je osciloskop, ki združuje zajem in pripravo podatkov za prikaz, s pomočjo ADC in SoC, in prikaz teh preko spletne aplikacije (spodnja slika). Ideja, ki bo opisana v naslednjih poglavjih, je narediti enostaven grafični vmesnik v FPGA, ki bo zmožen prikaza zajetih podatkov, podobno kot v spletni aplikaciji. <center><img src="./GUI_osc/img/osciloskop_spletna_aplikacija.png" width = "50%"> </center> ### Blokovna shema projekta Ker je cilj projekta narediti zgolj grafični vmesnik, načina zajema in priprave podatkov ni potrebno spreminjati. Za pripravo vzorčenih podatkov za izris, v privzetem projektu merilne naprave STEMlab, skrbi komponenta SCOPE, ki zajete podatke obeh kanalov shrani v BRAM enote. V privzetem projektu, procesni sistem te podatke prebira in pošilja spletni aplikaciji, kjer so izrisani. Pri teh procesih upošteva uporabnikovo konfiguracijo časovne skale, proženja ... V danem projektu so navedene stvari izvedene v programirljivi logiki. Vrhnji modul izdelane komponente predstavlja blok ***GUI_osc***. Generiranje grafike poteka na vrhnjem nivoju, podmoduli pa skrbijo za komunikacijo z razširitveno ploščo, preko katere poteka izris podatkov na LCD-zaslonu in konfiguracija grafičnega vmesnika. <img src="./GUI_osc/img/block_diagram_GUI.png" width = "50%"> ### Strojna oprema Kot je bilo že omenjeno, je poleg merilne naprave STEMlab, za izdelavo projekta potrebna razširitvena plošča, izdelana v laboratoriju za načrtovanje integriranih vezij. Na njej so nameščeni VGA-priključek, dva rotacijska enkoderja in štiri tipke. Za zmanjšanje potrebnih linij je branje tipk in enkoderjev izvedeno s PISO-registrom. Konfiguracijske funkcije ***GUI_osc*** se nahajajo na naslednjih enotah: <img src="./GUI_osc/img/razs_plosca_red_pitaya.png" width = "50%"> ### Izdelava projekta Ker je projekt nastal v sklopu diplomskega dela z naslovom "Načrtovanje digitalnih vezij z visokonivojsko sintezo", je generiranje grafike izvedeno z visokonivojsko sintezo. Za izdelavo projekta sta potrebna programska okolja Vitis HLS (v2022.2) in Vivado (v2022.2). #### Postopek izdelave: - Najprej prenesite arhiv ([VITIS_GUI.zip](GUI_osc/VITIS_GUIosc.zip)), kjer se nahaja visokonivojski model bloka GUI_osc. - Odprite Vitis HLS, ustvarite nov projekt in naredite sintezo visokonivojskega modela vezja (periodo nastavite na 20 ns). - Prenesite arhiv ([classic_project_GUIosc.zip](GUI_osc/classic_project_GUIosc.zip)), ki vsebuje modificiran projekt merilne naprave STEMlab. - Odprite Vivado v2022.2 in se v ukazni vrstici programa postavite v projektno mapo ***classic_project_GUIosc***. ``` cd "<path>/classic_project_GUIosc" ``` - V ukazni vrstici zaženite skripto ***make_project.tcl***. ``` source make_project.tcl ``` - V Vivadu odprite modul ***GUI_osc***, ter kopirajte dele sintetizirane vrhnje funkcije (***GUI_osc.vhd*** ) na predpisano mesto. - Preostale sintetizirane datoteke vključite s klikom na "Project manager -> Add sources". ### Visokonivojski model vezja Za boljše razumevanje in lažjo nadgradnjo/modifikacijo izdelanega modela, bodo na kratko predstavljeni odseki kode. Spreminjanje časovne baze je izvedeno s postopkom decimacije. Za izris podatkov so iz BRAM-a, enote SCOPE, prebrani zgolj podatki, ki se med seboj razlikujejo za decimacijski faktor 2^***hscale***. V spodnji kodi ***ack_rp*** predstavlja pomnilniški naslov BRAM enote, ***counter*** pa števec, ki se vsak urin cikel poveča za 1. ``` static ap_uint<2> hscale; static ap_uint<11> counter; *ack_rp = (ap_uint<14>) (counter << hscale); ``` Vhodne podatke je nato potrebno ustrezno vertikalno skalirati, da bodo te lahko prikazani na prikaznem oknu zaslona (380 x 320) in pri tem upoštevati še uporabnikovo vertikalno bazo, ki je nastavljena preko spremenljivk ***vscale_a*** in ***vscale_b***. ``` ap_fixed<8,8,AP_RND, AP_SAT> data_a, data_b; static ap_fixed<8,8,AP_RND, AP_SAT> prev_data_a, prev_data_b; data_a = (ap_fixed<8, 8, AP_RND, AP_SAT>) (*ack_data >> (6-vscale_a)); data_b = (ap_fixed<8, 8, AP_RND, AP_SAT>) (*ack_datb >> (6-vscale_b)); ``` Proženje je izvedeno tako, da se signala s tipke T(2) in rot. enkoderja R(1) primerjata s tipom prehoda med trenutno in prejšnjo vrednostjo vhodnih podatkov in trenutnim napetostnim nivojem. Če se te ujemajo, se prične zapisovanje v lokalne medpomnilnike. ``` static ap_int<8> trig_buff_a[WINDOW_LENGTH]; //trigger buffers for channels A and B static ap_int<8> trig_buff_b[WINDOW_LENGTH]; static ap_uint<10> wr_pr; //write index static ap_uint<1> ris_edge1, fall_edge1, ris_edge2, fall_edge2; static ap_uint<1> en_trig; //trigger successfulness indicator ... else if ((data_a > prev_data_a) && (ris_edge1) && (((prev_data_a < *w_rotac1) && (data_a >= *w_rotac1)) || ((prev_data_a <= *w_rotac1) && (data_a > *w_rotac1))) && wr_pr == 0) { trig_buff_a[wr_pr] = prev_data_a; trig_buff_b[wr_pr] = prev_data_b; wr_pr++; en_trig = 1; } ... ``` Zadnji korak je izris zajetih podatkov. Ko se horizontalen in vertikalen števec VGA vmesnika (***cx***, ***cy***) nahajata znotraj prikaznega okna, se za vsako y-koordinato preveri ali se ta nahaja med trenutno in prejšnjo vrednostjo vhodnega signala. Če se, potem je na izhod poslana izbrana RGB-vrednost. ``` ap_int<8> trig_data_a, trig_data_b; static ap_int<8> trig_prev_data_a, trig_prev_data_b; if (*en == 1){ if ((x_os >= 0) && (x_os <(WINDOW_LENGTH)) && (y_os <= 160) && (y_os >= -160)){ trig_data_a = trig_buff_a[x_os]; trig_data_b = trig_buff_b[x_os]; if (x_os == 0){ *rgb = 0; } else if (((y_os <= trig_data_a && y_os >= trig_prev_data_a) || (y_os >= trig_data_a && y_os <= trig_prev_data_a)) && (*w_channel == 1 || *w_channel == 3) && (en_trig)){ *rgb = 2; } ... ``` ### Prenos na razvojno ploščo in preizkus delovanja - Preko protokola SSH se povežite z razvojno ploščo STEMlab (ime: root, geslo: root). - Prenesite datoteko ***red_pitaya_top.bit*** v lokalno mapo na Red Pitayo. - Zapišite pot do ***red_pitaya_top.bit*** v datoteko, ki se nahaja v ```/opt/redpitaya/www/apps/scopegenpro/fpga.conf```. - Odprite spletno aplikacijo Red Pitaye in zaženite osciloskop. Časovno bazo nastavite med 20 ms/razdelek in 100 ms/razdelek (glej razdelek "Možnosti nadgradnje"). - Za lažje testiranje aktivirajte digitalno zanko, ki poveže izhode signalnega generatorja z vhodi osciloskopa. To naredite v terminalu, z ukazom: ``` monitor 0x4000000c 1 ``` #### Prikaz delovanja <img src="./GUI_osc/img/prikaz_delovanja.png" width = "100%"> ### Možnosti nadgradnje - Trenutno so zapisi nastavitev shranjeni v RGB-tabelah, kar omejuje število možnih nastavitev skaliranja (vsaki nastavitvi pripada ena tabela). Boljša možnost bi bila implementacija enote, ki bi samodejno generirala tabelo RGB-vrednosti iz podanih nastavitev. - Možnost vertikalnega/horizontalnega odmika. - Nastavitev sonde in HV/LV. - Privzet projekt, naprave STEMlab, uporablja dve obliki decimacije, in sicer, ena nastopi pri zapisovanje vzorčenih podatkov v BRAM, enote SCOPE, druga pa pri branju danih podatkov. Ker narejeni projekt poskrbi le za decimacijo ob branju shranjenih podatkov, mora biti časovna baza v aplikaciji nastavljena med 20 ms/razdelek in 100 ms/razdelek (v tem razponu deluje dana decimacija). Če se časovna baza v aplikaciji spremeni, bo enoti ***SCOPE*** dodeljen drugačen decimacijski faktor in nastavitve prikazane na zaslonu ne bodo več pravilne. Za boljše delovanje in več skalirnih možnosti bi lahko poskrbeli še za decimacijo ob zapisu v BRAM, podobno kot v privzetem projektu.