[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<N; i++) { sum += z[i] * c[i]; } y=sum; } ``` Vhodi in izhodi so deklarirani kot 10-bitna števila s fiksno decimalko v obsegu med -1 in 1. ```c #ifndef _FIR_H_ #define _FIR_H_ #include <ap_fixed.h> #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<string> csv; // odpri in preberi vhodno datoteko (CSV time;data) csv.load("c:/hls/vhod.csv", false, sw::csv_reader<string>::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<num; i++) { x = (DATA_T)stod(csv.data()[i][1]); // podatki iz 1. stolpca fir(x, y); // filtriraj in shrani izhod outfile << csv.data()[i][0] << ";" << y << endl; } outfile.close(); cout << i << " testnih vzorcev" << endl; return 0; } ``` Vhodna datoteka vsebuje 200 vzorcev frekvenčnega preleta sinusnega signala. Testni program zapisuje izhode v datoteko izhod.csv. Podatke iz CSV lahko uvozimo v program Excel in prikažemo v obliki grafikona. Pri uvažanju izberemo, da imajo podatki glavo, podpičje kot ločilo in decimalno piko za številske vrednosti. Moder grafikon predstavlja vhodni signal, rdeč pa izhodni filtriran signal. Odziv predstavlja nizko sito, ki zaduši amplitude signalov blizu mejne frekvence. ![](./hls/fir.png) Če spremenimo koeficiente na {0.0508,-0.1602,-0.1172,0.457,-0.1172,-0.1602,0.0508}, dobimo visoko sito. ![](./hls/fir2.png)