[LNIV Xilinx](index.html) | [Vitis HLS](hlsVitis.htm) | [model](hlsModel.htm) | simulacija | [sinteza](hlsSint.htm)
# Simulacija visokonivojskega modela
Pri simulaciji modela v jeziku C/C++ imamo na voljo fukcije za zajem, shranjevanje in analizo podatkov.
Simulacijo modela vezja za obdelavo signalov bomo predstavili na primeru digitalnega sita. Paket [fir.zip](hls/fir.zip)
vsebuje:
* funkcijo in zaglavno datoteko: fir.cpp, fir.h
* knjižnico za branje podatkov iz datoteke CSV: csv_reader.h
* in testno strukturo: fir_test.cpp
Pri izvedbi simulacije potrebujemo še datoteko z vhodnimi vzorci:
* [vhod.csv](hls/vhod.csv)
## Digitalno sito
Digitalno sito s končnim odzivom (FIR filter) izvaja konvolucijo nad vhodnimi vzorci. Glavna funkcija sprejme ob vsakem klicu nov vhodni vzorec in naredi konvolucijo z zadnjimi sedmimi vzorci (N==7), ki so shranjeni v notranji statični zbirki z[N]. Konvolucijski koeficienti so konstantne realne vrednosti v formatu fiksne decimalke.
Funkcija fir() vsebuje dve zanki: zanka z oznako *shift* pomakne nov vhodni podatek v zbirko vzorcev, zanka *mac* pa naredi
izračun konvolucije:
```c
#include "fir.h"
void fir(const DATA_T x, DATA_T &y)
{
static DATA_T z[N];
const COEF_T c[N] = {0.0041, 0.0766, 0.245, 0.346, 0.245, 0.0766, 0.0041};
SUM_T sum = 0;
shift: for (int i=N-1; i>0; i--) {
z[i] = z[i-1];
}
z[0] = x;
mac: for (int i=0; i
#define N 7
typedef ap_fixed<10,1> DATA_T;
typedef ap_fixed<10,1> COEF_T;
typedef ap_fixed<10,1,AP_RND,AP_SAT> SUM_T;
void fir(const DATA_T, DATA_T &);
#endif
}
```
## Testna struktura
V testno kodo za digitalno sito vključimo knjižnico *csv_reader.h*, ki omogoča branje podatkov iz
znakovne datoteke v formatu CSV (Comma-separated Values).
```c
#include "csv_reader.h"
#include "fir.h"
using namespace sw;
using namespace std;
int main()
{
DATA_T x, y;
int i, num=0;
cout << "Test Bench " << N << " odcepov ";
csv_reader csv; // odpri in preberi vhodno datoteko (CSV time;data)
csv.load("c:/hls/vhod.csv", false, sw::csv_reader::header_yes);
if(csv.error()) { cout << "CSV parse errors." << endl; }
else { num = csv.data().size(); }
ofstream outfile; // odpri izhodno datoteko
outfile.open ("c:/hls/izhod.csv");
outfile << "time;data\n";
// testna zanka
for(i=0; i