[LNIV Xilinx](index.html) # Oscilator na [Red Pitayi](https://www.redpitaya.com/) V digitalnem sistemu na Red Pitayi (classic) bomo zamenjali PID z modulom v katerem bo digitalni sinusni oscilator z nastavljivo frekvenco. ![](./img/RP_osc.png) ## Projekt za Vivado 2019 - Osnova je klasični projekt iz arhivskih datotek: [redpitaya-classic.zip](https://lniv.fe.uni-lj.si/courses/div/redpitaya-classic.zip), ki ga v Vivadu naložimo s skripto: ``` cd c:/proj/redpitaja source ./make_project.tcl ``` V projekt bomo vključili še opis sinusnega oscilatorja s sistemskim vmesnikom in ROM v katerem so zapisani vzorci sinusnega signala. - Na koncu glavne datoteke red_pitaya_top.sv nadomesti modul PID z modulom red_pitaya_osc in ga poveži na sistemsko vodilo ``` red_pitaya_osc i_sin ( .clk_i (adc_clk ), //ura .rstn_i (adc_rstn ), //reset, aktiven ob 0 .sin_o (sin_o ), //14-bitni sinusni izhod .addr_i (sys[3].addr ), //32-bitni naslov .wdata_i (sys[3].wdata), //32-bitni vhodni podatek .wen_i (sys[3].wen ), //omogoči vpis .ren_i (sys[3].ren ), //omogoči branje .rdata_o (sys[3].rdata), //32-bitni izhodni podatek .err_o (sys[3].err ), //javi napako .ack_o (sys[3].ack ) //potrdi prenos ); ``` - Sinusni izhodni signal deklariraj in poveži na en kanal izhodnega DAC, za test pa lahko tudi neposredno na en kanal osciloskopa, npr. .adc_a_i (sin_o) ``` wire [13:0] sin_o assign dac_a_sum = asg_dat[0] + sin_o; ``` ## Sinusni generator Generator sinusnega signala sestavljajo vmesnik, števec in ROM s tabelirano eno periodo sinusa. Sinusni signal dobimo iz pomnilnika ROM, ki ga naslavlja 24-bitni števec **cnt** (naslov pomnilnika je zgornjih 8 ali 10 bitov števca). Števec se ob uri povečuje za vrednost zapisano v registru. Manjša vrednost registra povzroči daljši čas štetja in posledično nižjo izhodno frekvenco. ![](./osc/osc-sch.png) Vmesnik omogoča zapisovanje in branje vrednosti registrov iz sistemskega vodila Red Pitaye. Naslovni prostor je razdeljen tako, da znoraj modula dekodiramo spodnjih 20 bitov naslova. Za nalogo lahko dodate registre s katerimi bi nastavljali še amplitudo in ofset zunanjega signala. ### Model in simulacija v jeziku Verilog Osnovni model sinusnega oscilatorja z registrom za nastavitev frekvence: [red_pitaya_osc.v](osc/red_pitaya_osc.v) Model pomnilnika ROM z 256 vzorci 10-bitnega sinusnega signala: [rom.v](osc/rom.v) ```Verilog always @(posedge clk_i) begin if (~rstn_i) begin register <= 32'h00000000; cnt <= 24'h000000; end else begin cnt <= cnt + register[23:0]; if (wen_i && (addr_i[19:0]==20'h10004)) begin register <= wdata_i; end end end assign rom_addr = cnt[23:16]; rom u0(.adr(rom_addr), .data(rom_data)); assign data_o = rom_data; ``` Vmesnik sestavlja logika za branje identifikacije modula in registra ter pisanje vrednosti v register. Naslov registra smo postavili na vrednost h10004, da ne bomo imeli konfliktov z aplikacijami na Red Pitayi, ki predvidevajo v tem naslovnem prostoru komponento PID (naslovi registrov te komponente so nižje). Kadar procesor bere kakšen drug naslov, bo dobil vrnjeno identifikacijsko vrednost FE002020. - Preizkusi delovanje sinusnega generatorja s testno strukturo [test_osc.v](osc/test_osc.v) v kateri nastavi register na vrednost 10000. Uporabi simulator orodja Vivado ali pa odprtokodni simulator [Icarus Verilog](https://bleyer.org/icarus/) s pregledovalnikom signalov **GTKWave**. Ukazi za prevajanje z orodjem Icarus in izvedbo simulacije: ``` iverilog -o test_osc test_osc.v red_pitaya_osc.v rom.v vvp test_osc ``` ### Model in simulacija v jeziku VHDL Opis sinusnega oscilatorja s sistemskim vmesnikom: [red_pitaya_osc.vhd](osc/red_pitaya_osc.vhd) Genrični ROM s 1024 vzorci 10-bitnega sinusnega signala: [rom.vhd](osc/rom.vhd) - Preizkusi delovanje sinusnega generatorja s testno strukturo [osc_tb.vhd](osc/osc_tb.vhd) v kateri nastavi register na vrednost 10000. Uporabi simulator orodja Vivado ali pa odprtokodni simulator [GHDL](http://ghdl.free.fr/) s pregledovalnikom signalov [GTKWave](http://gtkwave.sourceforge.net/). Ukazi za prevajanje z orodjem GHDL in izvedbo simulacije: ``` ghdl -a rom.vhd ghdl -a red_pitaya_osc.vhd ghdl -a osc_tb.vhd ghdl -r osc_tb --stop-time=2000ns --vcd=osc.vcd ``` Rezultat simulacije v programu GTKWave: ![](./osc/osc-wave.png) ## Test na Red Pitayi Po implementaciji digitalnega sistema z orodjem Vivado dobimo datoteko red_pitaya_top.bit, ki jo prenesemo na datotečni sistem Red Pitaye. Delovanje generatorja na razvojni plošči najlažje opazujemo z aplikacijo osciloskop. Najprej moramo aplikaciji povedati, da uporabi za programiranje FPGA našo datoteko. Nastavitev je zapisana v: */opt/redpitaya/www/apps/scopegenpro/fpga.conf*. Ko v spletnem brskalniku poženemo osciloskop, se bo naložil FPGA iz datoteke na katero se sklicuje fpga.conf. Prepričajmo se tako, da v konzoli preberemo identifikacijo: ``` monitor 0x40300000 ``` ki mora vrniti vrednost FE002020. Nato nastavimo inkrement števca sinusnega generatorja, npr.: ``` monitor 0x40310004 100 ``` in opazujemo izhodni signal: ![](./osc/scope-osc.png)