[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=0 && pi