[LNIV Xilinx](index.html) | [Vitis HLS](hlsVitis.htm) | model | [simulacija](hlsSim.htm) | [sinteza](hlsSint.htm) # Model vezja za visokonivojsko sintezo Predstavili bomo opis in visokonivojsko sintezo modela vezja za geometrijsko transformacijo slike. ## Priključki vezja Priključki vezja so definirani v parametrih funkcije. Vmesnik določajo: - enostavni parametri (skalarni tip), ki predstavljajo vhode vezja, - izhodni parameter (return) je izhod vezja, s privzetim rokovalnim vmesnikom (ap_ctrl_hs), - zbirke predstavljajo pomnilniški vmesnik, kjer beremo oz. pišemo po en ali dva elementa naenkrat, - kazalci, ki jih samo beremo, so skalarni vhodi, - kazalci, v katere zapisujemo vrednosti, so izhodi s kontrolnim signalom (ap_vld), - kazalci, ki jih funkcija bere in zapisuje se razdelijo na vhodni in izhodni vmesnik s kontrolnim signalom. Vzemimo primer vezja za transformacijo koordinat, z vhodi x, y, transformacijsko matriko m in izhodoma fy, fy. Funkcija izvaja 2D matrično transformacijo, pri kateri je izhod določen s produktom vhodnega vektorja in matrike zapisane v zbirki štirih elementov m[4]. ```c #include "mm.h" void mm (VEC_T x, VEC_T y, VEC_T *fx, VEC_T *fy, M_T m[4]) { *fx = x*m[0]+y*m[1]; *fy = x*m[2]+y*m[3]; } ``` Sintetizirano vezje ima dvo-vratni pomnilniški vmesnik za branje koeficientov matrike. Takšen vmesnik omogoča hkratno branje dveh koeficientov in potrebuje vsaj dva cikla za izračun rezultata. Matriko s štirimi koeficienti lahko z direktivo **ARRAY_PARTITION** razdelimo na štiri ločene elemente, ki jih lahko v vezju hkrati beremo. Slika prikazuje priključke sintetiziranega vezja v obeh izvedbah. ![](./hls/mm.png) ##Podatkovni tipi v modelu vezja Podatkovni tip spremenljivk definiramo v zaglavni datoteki. Primer deklaracije celoštevilskega tipa **int** za koordinate in realnih vrednosti **float** za koeficiente matrike. ```C #ifndef _MM_H_ #define _MM_H_ typedef int VEC_T; typedef float M_T; //typedef ap_int<8> VEC_T; //typedef ap_fixed<8,2> M_T; void mm (VEC_T x, VEC_T y, VEC_T *fx, VEC_T *fy, M_T m[4]); #endif ``` Izbira podatkovnega tipa ima zelo velik vpliv na kompleksnost vezja (velikost in zakasnitve). Operacije z realnimi števili s plavajočo vejico zahtevajo kompleksno vezje, še posebej zapis v standardnem formatu IEEE 754. V orodju HLS lahko uporabljamo realna števila s fiksno decimalko **ap_fixed**, kjer pri deklaraciji določimo število bitov in mest pred decimalno vejico. Tabela predstavlja rezultate sinteze algoritma z različnimi podatkovnimi tipi: | VEC_T, MM_T | latenca | interval | DSP | LUT | FF | | ---------- | ----------- | -------- | ------ | ----- | | int, int | 50 ns | 6 | 12 | 343 | 922 | | int, float | 170 ns | 18 | 16 | 3435 | 1516 | | int, ap_fixed<16,2> | 50 ns | 6 | 8 | 747 | 1162 | | ap_int<16>, ap_fixed<16,2> | 60 ns | 7 | 4 | 392 | 201 | | ap_int<8>, ap_fixed<8,2> | 30 ns | 4 | 0 | 409 | 144 | Z direktivami vplivamo na potek in rezultat sinteze funkcije. Tabela predstavlja rezultate vezja s podatkovnimi tipi ap_int<8> in ap_fixed<8,2> ter dvema direktivama ARRAY_PARTITION in PIPELINE za cevovodno izvedbo vezja. | Direktive | latenca | interval | DSP | LUT | FF | | ---------- | ----------- | -------- | ------ | ----- | | ARRAY_PARTITION | 10 ns | 2 | 0 | 370 | 106 | | PIPELINE | 10 ns | 1 | 0 | 358 | 106 | ### Fiksna decimalka Podatkovni tip s fiksno decimalko je deklariran v knjižnici **ap_fixed** in ga lahko uporabljamo le v modelih vezja v jeziku C++. Ob deklaraciji navedemo število vseh bitov za zapis vrednosti in število bitov pred decimalno vejico. Primer: podatkovni tip **ap_fixed<4,1>** zavzame naslednje pozitivne in negativne realne vrednosti: | 0 | 0.125 | 0.25 | 0.375 | 0.5 | 0.625 | 0.75 | 0.875 | -- | -- | -- | -- | -- | -- |-- |-- |-- |-- | | 0.000 | 0.001 | 0.010 | 0.011 | 0.100 | 0.101 | 0.110 | 0.111 Negativne vrednosti so definirane v dvojiškem komplementu: | -0.125 | -0.25 | -0.375 | -0.5 | -0.625 | -0.75 | -0.875 | -1 | -- | -- | -- | -- | -- | -- |-- |-- |-- |-- | | 1.111 | 1.110 | 1.101 | 1.100 | 1.011 | 1.010 | 1.001 | 1.000 Če algoritem obdeluje le pozitivne vrednosti, deklariramo nepreznačen tip s fiksno decimalko, npr: **ap_ufixed<4,1>**. Za celoštevilske vrednosti poljubne dolžine pa uporabimo podatkovni tip **ap_int** ali **ap_uint**, kjer podamo število bitov do maksimalno 1024. S spremenljivkami poljubne dolžine so definirane osnovne računske operacije, kjer je za rezultat v splošnem rezervirano toliko bitov, kot je potrebno, da ne pride do preliva (npr. število bitov produkta je vsota števila bitov množencev). Pri podatkovnem tipu s fiksno decimalko lahko ob deklaraciji določimo način nasičenja privzetega preliva in zaokroževnaja. ## Klic funkcije v zanki Dodajmo funkcijo, ki izvaja geometrijsko transformacijo točk iz vhodnega pomnilnika p[NN*NN], ki naj vsebuje 1024 točk (NN=32). V funkciji naj bo zanka, ki za vsako koordinato (x,y) iz pomnilnika izračuna transformirano koordinato (fx, fy), nato pa prenese podatek iz pomnilnika p v pomnilnik q. Če je transformirana koordinata izven območja (0,0)-[NN,NN], naj nastavi pomnilnik q na 0. ```C void transform (DAT_T p[NN*NN], DAT_T q[NN*NN], M_T m[4]) { VEC_T x, y, fx, fy; int i; int pi; for (y=0; y<NN; y++) for (x=0; x<NN; x++) { mm(x, y, &fx, &fy, m); i = (int)(y,x.range(4,0)); pi = (int)(fy,fx.range(4,0)); if (pi>=0 && pi<NN*NN) q[i]= p[pi]; else q[i] = 0; } } ``` Rezultat sinteze vezja: | Funkcija | latenca | interval | DSP | LUT | FF | | ---------- | ----------- | -------- | ------ | ----- | | transform() | 10290 ns | 1030 | 0 | 538 | 269 |