[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.
### 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.
### 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:
### 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 "/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
### 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.