Sadržaj:

ZYBO OV7670 kamera s kontrolom pomicanja/naginjanja: 39 koraka (sa slikama)
ZYBO OV7670 kamera s kontrolom pomicanja/naginjanja: 39 koraka (sa slikama)

Video: ZYBO OV7670 kamera s kontrolom pomicanja/naginjanja: 39 koraka (sa slikama)

Video: ZYBO OV7670 kamera s kontrolom pomicanja/naginjanja: 39 koraka (sa slikama)
Video: OV7670 through FPGA to VGA monitor 2024, Srpanj
Anonim
Image
Image
ZYBO OV7670 kamera s kontrolom pomicanja/naginjanja
ZYBO OV7670 kamera s kontrolom pomicanja/naginjanja

Počnite od prvog koraka za detalje o stvaranju dvoosnog servo PWM kontrolera.

Počnite od masivnog blok dijagrama (korak 19) za cijeli projekt.

Camera + Pan/tilt setup koji smo koristili:

PmodCON3 iz tvrtke Digilent korišten je za povezivanje servomotora.

Korak 1: Izrada PWM modula- izvorna datoteka

Korak 2: Izgradnja PWM modula- Vivado postavljanje

Izgradnja PWM modula- Vivado postavljanje
Izgradnja PWM modula- Vivado postavljanje

Prvo preuzmite Vivado Design Suite s web stranice Xilinx. Instalirajte sav paket dizajna, uključujući Vivado Software Development Kit (SDK). Ovaj projekt koristi verziju 2017.2.

U međuvremenu bi Digilent Adept 2 trebao biti instaliran i kao upravljački program Zybo ploče.

Korak 3: Izgradnja PWM modula- Izradite datoteku projekta

Izgradnja PWM modula- Stvorite projektnu datoteku
Izgradnja PWM modula- Stvorite projektnu datoteku

Prije nego stvorite datoteku projekta, provjerite jeste li već pravilno instalirali datoteku Zybo kao vodič ovdje:

Vivado verzija 2015.1 i novije instalacije datoteka ploče

Otvorite Vivado 2017.2. Na Brzom početku kliknite Stvori projekt -> Dalje -> Naziv projekta (Ovdje imenujte naziv svog projekta) -> Vrsta projekta. Na Vrsta projekta odaberite RTL projekt i označite na "Nemoj navesti izvore u ovom trenutku". Zatim za zadani dio odaberite “Boards” i “Zybo” kao naziv za prikaz. Zatim kliknite Završi za početak projekta.

Korak 4: Izgradnja PWM modula- Dizajn bloka i postavljanje datoteke ograničenja (I)

Izgradnja PWM modula- Dizajn bloka i postavljanje datoteke ograničenja (I)
Izgradnja PWM modula- Dizajn bloka i postavljanje datoteke ograničenja (I)

Na Flow Navigatoru kliknite “” Create Block Design”, zatim pritisnite OK. kliknite znak "+" za dodavanje potrebnih IP adresa. Dodati:

  • Jedan ZYNQ7 sustav za obradu Dva AXI mjerača vremena
  • Dva AXI mjerača vremena

Korak 5: Izgradnja PWM modula- Dizajn bloka i postavljanje datoteke ograničenja (II)

Izgradnja PWM modula- Dizajn bloka i postavljanje datoteke ograničenja (II)
Izgradnja PWM modula- Dizajn bloka i postavljanje datoteke ograničenja (II)

Nakon dodavanja IP adresa, pokrenite automatizaciju blokova i automatizaciju veze. Nakon što je automatizacija dovršena, u bloku “axi_timer_0” desnom tipkom miša kliknite pwm0 -> Make External. Vanjski pin pwm0 imenujte kao pwm_Xaxis. Također, ponovite gornji postupak na bloku “axi_timer_1” i imenujte vanjski pin pwm0 kao pwm_Zaxis.

Korak 6: Izgradnja PWM modula- Dizajn bloka i postavljanje datoteke ograničenja (III)

Izgradnja PWM modula- Dizajn bloka i postavljanje datoteke ograničenja (III)
Izgradnja PWM modula- Dizajn bloka i postavljanje datoteke ograničenja (III)

Uočite da svaki put kad završimo Block Design u Vivadu, moramo stvoriti HDL Wrapper. Budući da će to biti modul najviše razine za svaki projekt.

Korak 7: Izrada PWM modula- Dizajn bloka i postavljanje datoteke ograničenja (IV)

Izgradnja PWM modula- Dizajn bloka i postavljanje datoteke ograničenja (IV)
Izgradnja PWM modula- Dizajn bloka i postavljanje datoteke ograničenja (IV)

Sada moramo postaviti našu datoteku ograničenja za dodjeljivanje pinova spojenih na naš blok dijagram. Zatvorite prozor Dizajn blokova, na kartici Izvori, “Dodaj izvore”-> Dodajte ili stvorite ograničenja-> dodajte Zybo-Master.xdc kao naše datoteke ograničenja.

Korak 8: Izgradnja PWM modula- Dizajn bloka i postavljanje datoteke ograničenja (V)

Izgradnja PWM modula- Dizajn bloka i postavljanje datoteke ograničenja (V)
Izgradnja PWM modula- Dizajn bloka i postavljanje datoteke ograničenja (V)

Otvorite datoteku ograničenja Zybo-Master.xdc iz mape Ograničenja, dekommentirajte portove koje želimo navesti kao izlazne signale i preimenujte “get_ports {XXXX}”, što XXXX označava vanjski pin imenovan u blok dijagramu. Postavka datoteke ograničenja prikazana je na slici.

Korak 9: Izrada PWM modula- instalacija hardvera

Izgradnja PWM modula- Instalacija hardvera
Izgradnja PWM modula- Instalacija hardvera

Spojite servo motore na Pmod CON3. TowerPro SG90 je model servo motora koji smo koristili u ovom projektu. Za žice servo motora, narančasta žica predstavlja PWM signal, spojen na SIG pin u Pmod CON3. Crvena žica Vcc je žica za napajanje spojena na pin VS u Pmod CON3. Konačno, smeđa žica Gnd je uzemljena žica spojena na GND pin. Zatim umetnite Pmod CON3 u gornji red JD priključka na Zybo ploči.

Korak 10: Izgradnja PWM modula- Generirajte Bitstream i pokrenite SDK

1. Na kartici Project Navigator pokrenite Generate BitStream.

2. Izvoz hardvera: Datoteka> Izvoz> Izvoz hardvera-> označite "uključi bitstream"-> U redu 3. Pokrenite SDK: Datoteka-> Pokreni SDK.

Korak 11: Izgradnja PWM modula- Izradite novu aplikaciju u Xilinx SDK-u

Izgradnja PWM modula- Izradite novu aplikaciju u Xilinx SDK-u
Izgradnja PWM modula- Izradite novu aplikaciju u Xilinx SDK-u

Izradite novu aplikaciju:

Datoteka> Novo> Aplikacijski projekt -> Unesite naziv svog projekta -> Završi

Pod Project Explorerom trebale bi postojati tri mape.

U ovom slučaju, “design_1_wrapper_hw_platform_0” je mapa koju je Vivado prethodno izvezla. Axis_2_PWM_SDK_bsp je mapa paketa podrške za ploču. A Axis_2_PWM_SDK je naša glavna mapa projekta u SDK -u. Datoteku "helloworld.c" možete vidjeti u mapi "src" na Axis_2_PWM_SDK, gdje je "helloworld.c" glavna datoteka.

Korak 12: Izrada PWM modula- Pregled Project Explorera (I)

Izgradnja PWM modula- Pregled Project Explorera (I)
Izgradnja PWM modula- Pregled Project Explorera (I)

Provjerimo neke datoteke pod Project Explorerom. Prvo, u mapi “design_1_wrapper_hw_platform_0” otvorite “system.hdf”. Ova datoteka prikazuje mapu adresa za procesor ps7_cortex9 i IP blokove prisutne u našem dizajnu.

Korak 13: Izrada PWM modula- Pregled Project Explorera (II)

Izgradnja PWM modula- Pregled Project Explorera (II)
Izgradnja PWM modula- Pregled Project Explorera (II)

Zatim provjerite datoteke "include" i "libsrc" u mapi "Axis_2_PWM_SDK_bsp". Knjižnične datoteke ovdje nam omogućuju interakciju s hardverskim perifernim uređajima bez "sviranja" registra.

Korak 14: Izrada PWM modula- Pregled Project Explorera (III)

Izgradnja PWM modula- Pregled Project Explorera (III)
Izgradnja PWM modula- Pregled Project Explorera (III)

Putem BSP dokumentacije xtmrctr.h se nalazi kao Xilinx Timer Control Library vezana uz AXI Timer. Obično bismo ovdje mogli pronaći željenu PWM funkciju. Međutim, ako pročitate dokumentaciju “tmrctr_v4_3”, to pokazuje da upravljački program trenutno ne podržava PWM rad uređaja. Zbog nedostatka PWM funkcije, moramo dovršiti našu PWM funkciju uz pomoć xtmrctr.h i AXI Timer v2.0 LogiCORE IP Vodiča za proizvode.

Korak 15: Izgradnja PWM modula- zaključavanje PWM funkcije (I)

Izgradnja PWM modula- završna funkcija PWM (I)
Izgradnja PWM modula- završna funkcija PWM (I)

Natrag na glavnu datoteku “helloworld.c”, uključite sljedeće datoteke zaglavlja:

Korak 16: Izgradnja PWM modula- Završna PWM funkcija (II)

Izgradnja PWM modula- završna funkcija PWM (II)
Izgradnja PWM modula- završna funkcija PWM (II)

Definirajte osnovne adrese dva AXI TImera kroz "xparameters.h".

Korak 17: Izgradnja PWM modula- Završna PWM funkcija (III)

Izgradnja PWM modula- završna funkcija PWM (III)
Izgradnja PWM modula- završna funkcija PWM (III)

Izgradite željenu PWM funkciju.

Duty_val: pretvara vrijednost stupnja u radni ciklus. PWM_Freq_Duty: postavlja željenu frekvenciju i radni ciklus za generiranje PWM -a. Treba odrediti i vrijeme sata.

PWM_START: dodijelite adresu registra PWM -a i počnite generirati PWM.

PWM_STOP: dodijelite adresu registra PWM -a i zaustavite generiranje PWM -a.

Ostatak demo koda prikazan je u "helloworld.c" pod "Axis_2_PWM_SDK"

Korak 18: Izgradnja PWM modula- Neka radi

1. Programirajte FPGA putem SDK -a

  • Spojite Zybo Board putem USB priključka na računalo.
  • Xilinx Alati -> Program FPGA

2. Pokrenite program

Pritisnite ikonu "Pokreni" i padajući izbornik -> Pokreni kao -> Pokreni na hardveru

3. SDK terminal

  • Otvorite terminal SDK -> Spoji na serijski port -> OK
  • Pokrenite program. Ako se demo kôd uspješno pokrene, trebali biste vidjeti "Inicijalizacija je dovršena!" na terminalu SDK.

Korak 19: Streaming video obrada na Digilent ZYBO s OV7670

Kompletna arhivska datoteka u prilogu.

Korak 20: Potpuni blok dijagram

Cjeloviti blok dijagram
Cjeloviti blok dijagram

Ovo prikazuje potpuni dijagram svih veza i IP blokova u projektu

Korak 21: Spojite OV7670 na ZYBO

Spojite OV7670 na ZYBO
Spojite OV7670 na ZYBO

Kreirajte vezu za povezivanje modula ov7670 sa ZYBO Pmods

Podaci Pmod je Pmod D

Kontrolni Pmod je Pmod C

Dodatno, povežite PmodCON3 i servo upravljače kako je navedeno u prvoj polovici ovog vodiča

Korak 22: Izradite dizajn bloka

Izradite dizajn bloka
Izradite dizajn bloka

U Flow Navigatoru kliknite "Create Block Design", zatim pritisnite OK.

Korak 23: Dodajte VHDL datoteke za OV7670 upravljanje kamerom i snimanje

Dodajte VHDL datoteke priložene ovom koraku u projekt

Korak 24: Dodajte datoteku ograničenja

Dodajte priloženu datoteku ograničenja u svoj projekt.

Korak 25: Dodajte IP Repo za HLS IP

Dodajte IP Repo za HLS IP
Dodajte IP Repo za HLS IP

Uzmite priloženu Zip datoteku i raspakirajte je u novu mapu pod istim nazivom u novom direktoriju (mapi) pod nazivom "HLS_repo".

Dodajte IP spremište u svoj projekt tako što ćete otići u IP katalog i desnom tipkom miša odabrati "Dodaj spremište …"

Idite u direktorij "HLS_repo" i odaberite ga.

Izborno: Izradite HLS blok za video obradu sami!

Korak 26: Dodajte module i IP

Dodajte module i IP
Dodajte module i IP
Dodajte module i IP
Dodajte module i IP

Dodajte module ov7670_axi_stream_capture, debounce i ov7670_controller u blok dijagram desnim klikom na pozadinu i odabirom "Dodaj modul …"

Slično, dodajte IP -ove:

  • HLS_Video_Track
  • Zapisivanje međuspremnika video okvira
  • Očitavanje međuspremnika video okvira
  • Upravljač video mjerenja vremena
  • AXI4-stream za video izlaz
  • 3 "kriške"
  • Konstantno
  • 2 AXI mjerača vremena

Korak 27: Postavke IP konfiguracije

Postavke IP konfiguracije
Postavke IP konfiguracije
Postavke IP konfiguracije
Postavke IP konfiguracije
Postavke IP konfiguracije
Postavke IP konfiguracije

Kao što je prikazano na slikama

Korak 28: Dodajte i konfigurirajte PS IP blok

Dodajte i konfigurirajte PS IP blok
Dodajte i konfigurirajte PS IP blok
Dodajte i konfigurirajte PS IP blok
Dodajte i konfigurirajte PS IP blok

Blok dijagramu dodajte ZYNQ7 procesni sustav

uredite konfiguraciju:

  • PS-PL konfiguracija
    • HP

      • Omogući S HP 0
      • Omogući S HP 1
  • Konfiguracija sata
    • PL satovi od tkanine

      • FCLK_0 na 100MHz
      • FCLK_1 na 25MHz (OutputClock)
      • FLCK_2 na 35 MHz (<= 50 MHz) (CameraClock)

Korak 29: Dio 1. Izgradnja PWM modula za servo motore

Iznesite axi_timer_0 pwm0 na novi izlazni priključak pwm_Xaxis

Iznesite axi_timer_1 pwm0 na novi izlazni priključak pwm_Zaxis

Korak 30: Bočne veze video ulaza (aclk istaknuto)

Bočne veze video ulaza (aclk istaknuto)
Bočne veze video ulaza (aclk istaknuto)

Pravilno spojite IP blokove na strani video ulaza

(* ove veze treba stvoriti odabirom odgovarajućih opcija tijekom automatizacije veze) "aclk" iz axi_stream_capture ide na:

  • ap_clk na video frame buffer write
  • ap_clk na bloku za obradu video streama HLS
  • *aclk na AXI IP -u pametnog povezivanja iz međuspremnika video okvira Zapišite u S_AXI_HP0
  • *aclk koji odgovara kanalima AXI Interconnect IP -a za S_AXI kanale HLS bloka za video obradu i međuspremnik video okvira upisuje S_AXI_HP0_ACLK na PS blok

Signal videotoka jednostavno je serijski spojen iz bloka snimanja na memorijsko sučelje Zynq.

  • Videozapis ide od bloka snimanja do bloka za obradu HLS -a.
  • Obrađeni video zapis iz HLS bloka ide u blok za pisanje međuspremnika okvira.
  • *Blok za pisanje međuspremnika okvira spaja se na sučelje HP0 na bloku Zynq PS.
  • Signal m_axis_tuser s izlaza bloka hvatanja ručno se povezuje na ulazni signal video_in_TUSER na bloku za obradu HLS -a i signal ap_start na istom bloku.

Signal TUSER (tuser) koristi protokol AXI video toka za označavanje početka okvira video zapisa. AP_Start govori HLS bloku da počne s obradom. Stoga koristimo tuser za pokretanje HLS bloka za obradu svakog kadra dolazi. Kad povezujete pojedinačni signal sabirnice i odvajate ga na ovaj način, potrebno ga je spojiti i na uobičajenu završnu točku ostatka sabirnice. Vivado pretpostavlja da ako ručno povezujete signal želite prekinuti vezu s kojom bi se obično spojio.

Konfiguracijske postavke IP blokova:

Zapisivanje međuspremnika video okvira:

Video formati: RGB8

1 uzorak po satu Maksimalni broj stupaca: 1280 (> = 640) Maksimalni red: 960 (> = 480) Maksimalna širina podataka: 8

Korak 31: Spajanje na OV7670

Priključci na OV7670
Priključci na OV7670

Na bloku ov7670_axi_stream_capture

  • Neka svi ulazi budu vanjski (desni klik na pin i odaberite iz izbornika ili lijevi klik-> ctrl+T)
  • Ostavite imena takva kakva jesu

Na bloku ov7670_controller

  • Učinite sve izlazne blokove vanjskim
  • Preimenujte port config_finished u led0
  • spojite clk na CameraClock (<= 50MHz) (FCLK_2)

Na bloku debounce

  • spojite ulaz button1 na vanjski ulazni port zvan btn0
  • spojite out1 na liniju za ponovno slanje na IP bloku ov7670_controller
  • spojite ulaz button2 na vanjski ulazni port zvan btn3
  • spojite izlaz out2n na ulaz ext_reset_in na IP -u za resetiranje procesorskog sustava za domenu sata snimanja video zapisa. (*To bi moglo biti potrebno učiniti nakon generiranja tog IP -a*)
  • spojite clk na CameraClock (<= 50MHz) (FCLK_2)

Korak 32: Veze na vanjskoj strani videa

Priključci na vanjskoj strani videa
Priključci na vanjskoj strani videa
Priključci na vanjskoj strani videa
Priključci na vanjskoj strani videa
Priključci na vanjskoj strani videa
Priključci na vanjskoj strani videa
Priključci na vanjskoj strani videa
Priključci na vanjskoj strani videa

Priključci za blokove Video Timing Controller (VTC), AXI4-Stream to Video Out i kriške

  • Koristite sat od 25 MHz (FCLK_1) za vid_io_out_clk i VTC clk
  • Koristite sat od 100 MHz (FCLK_0) za pristup na AXI4-Stream za video izlaz
  • vtiming_out to vtiming_in
  • Video Frame Buffer Read m_axis_video ide na AXI4-Stream na Video Out video_in
  • vtg_ce ide na gen_clken
  • Vežite VTC clken, aclken, vid_io_out_ce za Constant dout [0: 0]
  • Iznesite vid_hsync i vid_vsync na vanjske izlazne portove vga_hs i vga_vs. (nije na slici)

Kriške:

  • Kriške treba postaviti kako je prikazano na priloženim slikama
    • preimenujte blokove u slice_red, slice_green i slice_blue
    • rasponi kriški postavljanja kako je prikazano na slikama prema nazivu bloka
    • spojite svaki izlaz kriške na izlaz vanjskog priključka kao što je prikazano na slici.
  • vid_data [23: 0] povezuje se s ulazima za svaku krišku (Din [23: 0])

Korak 33: Pokrenite blokadu i automatizaciju veze

Pokrenite Automatizaciju blokiranja i povezivanja
Pokrenite Automatizaciju blokiranja i povezivanja
Pokrenite automatizaciju blokiranja i povezivanja
Pokrenite automatizaciju blokiranja i povezivanja
Pokrenite Automatizaciju blokiranja i povezivanja
Pokrenite Automatizaciju blokiranja i povezivanja

Pokrenite Block Automation za povezivanje stvari iz ZYNQ7 PS bloka. Kao što je prikazano na slici.

Pokrenite automatizaciju veze za stvaranje svih IP -ova za međusobno povezivanje. Obratite posebnu pozornost na sve opcije na svakoj slici.

Na bloku debounce, spojite out2n na domenu sata za snimanje video zapisa Ponovno postavljanje procesorskog sustava ext_reset_in ulaz.

Korak 34: Generirajte HDL omot

Generirajte HDL omot
Generirajte HDL omot

Generirajte HDL omot za svoj blok dizajn.

Postavite ga kao gornji modul.

Korak 35: Generirajte Bitstream, izvezite hardver u SDK, pokrenite SDK iz Vivada

Uključite bitstream u izvoz.

Generiranje prijenosa bitova može potrajati jako dugo.

Zatim pokrenite SDK

Korak 36: SDK (bez FreeRTOS -a)

SDK (nema FreeRTOS -a)
SDK (nema FreeRTOS -a)

Ova verzija radi sve bez korištenja FreeRTOS -a, lijepo kondenzirajući kôd.

Napravite samostalni BSP na temelju hardverskog dizajna. Zadane opcije trebale bi biti u redu. Provjerite jesu li generirani izvori BSP -a.

Izradite aplikaciju kao što je prikazano na slici. (prazna aplikacija)

Izbrišite automatski generirani glavni i uvezite priložene datoteke.

Korak 37: Implementacija FreeRTOS -a

Implementacija FreeRTOS -a
Implementacija FreeRTOS -a

Ova verzija koristi FreeRTOS. Napravite FreeRTOS901 BSP na temelju hardverskog dizajna. Zadane opcije trebale bi biti u redu. Provjerite jesu li generirani izvori BSP -a.

Izradite aplikaciju kao što je prikazano na slici. (prazna aplikacija)

Izbrišite automatski generirani glavni i uvezite priložene datoteke.

Korak 38: Upute za uporabu

Ovaj je projekt pomalo nezgodno za pokretanje. Slijedite korake redom.

Pazite da vaš ZYBO ništa ne učitava sam kad se uključi. To znači da LED dioda Done ne bi trebala svijetliti. Jedan od načina za to je postavljanje kratkospojnika izvora pokretanja na JTAG.

Otvorite projekt (FreeRTOS ili ne) koji želite programirati iz SDK -a

  1. Uključite svoj ZYBO. LED dioda Done ne bi trebala svijetliti.
  2. Programirajte FPGA s bit datotekom. LED dioda Gotovo bi trebala zasvijetliti. Led0 ne bi trebao svijetliti.
  3. Pokrenite kôd (ako to radite, ne zaboravite proći početnu točku prekida).

U ovom trenutku trebali biste dobiti izlaz na svom VGA zaslonu.

Za ponovno pokretanje (ako greške ili što već): brzo dodirnite gumb PS-SRST ili isključite ZYBO, a zatim ga ponovo uključite. Nastavite od koraka 2.

Zaustavljanje procesora pomoću programa za ispravljanje pogrešaka uzrokovat će da fotoaparat zadrži položaj umjesto da se pomakne. Video stream će se svejedno nastaviti.

Korak 39: Reference i veze

Referentni vodiči i dokumentacija za Xilinx:

  • PG044 - AXI -Stream za video izlaz
  • PG278 - Video Frame Buffer Read/Write

Ostali linkovi:

  • Lauri blog - VDMA ulaz
  • Lauri blog - OV7670 na VGA izlaz pomoću BRAM -a
  • Hamsterworks wiki, Mike Fields, izvorni izvor koda OV7670
  • Tehnički list prikazuje osnovne specifikacije vremena

Preporučeni: