Innholdsfortegnelse:

ZYBO OV7670 kamera med panorering/vippekontroll: 39 trinn (med bilder)
ZYBO OV7670 kamera med panorering/vippekontroll: 39 trinn (med bilder)

Video: ZYBO OV7670 kamera med panorering/vippekontroll: 39 trinn (med bilder)

Video: ZYBO OV7670 kamera med panorering/vippekontroll: 39 trinn (med bilder)
Video: Camera Tracking 2024, November
Anonim
Image
Image
ZYBO OV7670 kamera med pan/tilt -kontroll
ZYBO OV7670 kamera med pan/tilt -kontroll

Start med trinn ett for detaljer om hvordan du bare lager en 2-akset servo PWM-kontroller.

Start med det massive blokkdiagrammet (trinn 19) for hele prosjektet.

Kamera + Pan/tilt -oppsett vi brukte:

PmodCON3 fra Digilent ble brukt til å koble servoene.

Trinn 1: Bygg en PWM-modul- kildefil

Trinn 2: Bygg en PWM-modul- Vivado-oppsett

Bygg en PWM-modul- Vivado-oppsett
Bygg en PWM-modul- Vivado-oppsett

Last ned først Vivado Design Suite From Xilinx nettsted. Installer hele designpakken, inkludert Vivado Software Development Kit (SDK). Dette prosjektet bruker 2017.2 -versjonen.

I mellomtiden bør Digilent Adept 2 også installeres som en Zybo -kortdriver.

Trinn 3: Bygg en PWM-modul- Lag en prosjektfil

Bygg en PWM-modul- Lag en prosjektfil
Bygg en PWM-modul- Lag en prosjektfil

Før du oppretter en prosjektfil, bør du forsikre deg om at du allerede har installert Zybo -filen som opplæringen her:

Vivado versjon 2015.1 og senere brettfilinstallasjon

Åpne Vivado 2017.2. Ved hurtigstart klikker du på Opprett prosjekt -> Neste -> Prosjektnavn (Gi prosjektnavnet ditt navn her) -> Prosjekttype. Velg Prosjekttype ved å velge RTL Project og merk av for "Ikke spesifiser kilder for øyeblikket". Velg deretter "Boards" og "Zybo" som visningsnavn for standarddelen. Klikk deretter Fullfør for å starte prosjektet.

Trinn 4: Bygg en PWM-modul- Blokkdesign og begrensningsfilinnstilling (I)

Bygg en PWM-modul- Blokkdesign og filinnstilling for begrensninger (I)
Bygg en PWM-modul- Blokkdesign og filinnstilling for begrensninger (I)

I Flow Navigator klikker du på “” Create Block Design”, og trykker deretter på OK. klikk på "+" -tegnet for å legge til nødvendige IP -er. Legge til:

  • Ett ZYNQ7 -behandlingssystem To AXI -timer
  • To AXI -timer

Trinn 5: Bygg en PWM-modul- Blokkdesign og filinnstilling for begrensninger (II)

Bygg en PWM-modul- Blokkdesign og filinnstilling for begrensninger (II)
Bygg en PWM-modul- Blokkdesign og filinnstilling for begrensninger (II)

Etter å ha lagt til IP -er, Kjør blokkautomatisering og tilkoblingsautomatisering. Når automatiseringen er fullført, høyreklikker du på blokken “axi_timer_0” på pwm0 -> Make External. Gi den eksterne pwm0 -pinnen navnet pwm_Xaxis. Gjenta også prosessen ovenfor på blokken "axi_timer_1" og navngi pwm0 ekstern pin som pwm_Zaxis.

Trinn 6: Bygg en PWM-modul- Blokkdesign og begrensningsfilinnstilling (III)

Bygg en PWM-modul- Blokkdesign og begrensningsfilinnstilling (III)
Bygg en PWM-modul- Blokkdesign og begrensningsfilinnstilling (III)

Legg merke til at hver gang vi fullfører Block Design i Vivado, må vi lage en HDL Wrapper. Siden det vil være modulen på toppnivå for hvert prosjekt.

Trinn 7: Bygg en PWM-modul- Blokkdesign og filinnstilling for begrensninger (IV)

Bygg en PWM-modul- Blokkdesign og filinnstilling for begrensninger (IV)
Bygg en PWM-modul- Blokkdesign og filinnstilling for begrensninger (IV)

Nå må vi sette opp vår begrensningsfil for å tildele pins som er koblet til blokkdiagrammet vårt. Lukk vinduet Blokkdesign, på kategorien Kilder, "Legg til kilder"-> Legg til eller opprett begrensninger-> legg til Zybo-Master.xdc som begrensningsfiler.

Trinn 8: Bygg en PWM-modul- Blokkdesign og filinnstilling for begrensninger (V)

Bygg en PWM-modul- Blokkdesign og filinnstilling for begrensninger (V)
Bygg en PWM-modul- Blokkdesign og filinnstilling for begrensninger (V)

Åpne begrensningsfilen Zybo-Master.xdc fra Constraints-mappen, kommenter portene vi vil spesifisere som utgangssignaler og gi nytt navn til "get_ports {XXXX}", som XXXX angir den eksterne pinnen som er navngitt i blokkdiagrammet. Innstillingen for begrensningsfil vises på figuren.

Trinn 9: Bygg en PWM-modul- maskinvareinstallasjon

Bygg en PWM-modul- Maskinvareinstallasjon
Bygg en PWM-modul- Maskinvareinstallasjon

Koble servomotorene til Pmod CON3. TowerPro SG90 er servomotormodellen vi brukte i dette prosjektet. For servomotortrådene representerer den oransje ledningen PWM -signalet, koblet til SIG -pinnen i Pmod CON3. Den røde ledningen Vcc er en strømledning koblet til VS -pinnen i Pmod CON3. Til slutt er den brune ledningen Gnd en jordet ledning som er koblet til GND -pinnen. Sett deretter inn Pmod CON3 til den øvre raden av JD -porten i Zybo -kortet.

Trinn 10: Bygg en PWM-modul- Generer Bitstream og start SDK

1. Kjør Generer BitStream i kategorien Project Navigator.

2. Export hardware: File> Export> Export Hardware-> mark on "include bitstream"-> OK 3. Lansering SDK: File-> Launch SDK.

Trinn 11: Bygg en PWM-modul- Lag et nytt program i Xilinx SDK

Bygg en PWM-modul- Lag en ny applikasjon i Xilinx SDK
Bygg en PWM-modul- Lag en ny applikasjon i Xilinx SDK

Opprett en ny applikasjon:

Fil> Ny> Applikasjonsprosjekt -> Skriv inn navnet på prosjektet ditt -> Fullfør

Under Project Explorer skal det være tre mapper.

I dette tilfellet er “design_1_wrapper_hw_platform_0” mappen som tidligere ble eksportert av Vivado. Axis_2_PWM_SDK_bsp er mappens støttepakke. Og Axis_2_PWM_SDK er hovedprosjektmappen vår i SDK. Du kan se “helloworld.c” -filen under “src” -mappen i Axis_2_PWM_SDK, der “helloworld.c” er hovedfilen.

Trinn 12: Bygg en PWM-modul- Oversikt over Project Explorer (I)

Bygg en PWM-modul- Oversikt over Project Explorer (I)
Bygg en PWM-modul- Oversikt over Project Explorer (I)

La oss sjekke noen filer under Project Explorer. Først, i mappen "design_1_wrapper_hw_platform_0", åpner du "system.hdf". Denne filen viser adressekartet for prosessor ps7_cortex9 og IP -blokkene som er tilstede i vårt design.

Trinn 13: Bygg en PWM-modul- Oversikt over Project Explorer (II)

Bygg en PWM-modul- Oversikt over Project Explorer (II)
Bygg en PWM-modul- Oversikt over Project Explorer (II)

Sjekk deretter filen "inkludere" og "libsrc" under "Axis_2_PWM_SDK_bsp" -mappen. Biblioteksfiler her gjør at vi kan samhandle med eksterne enheter uten å "spille" registre.

Trinn 14: Bygg en PWM-modul- Oversikt over Project Explorer (III)

Bygg en PWM-modul- Oversikt over Project Explorer (III)
Bygg en PWM-modul- Oversikt over Project Explorer (III)

Gjennom BSP -dokumentasjonen finnes xtmrctr.h som et Xilinx Timer Control Library relatert til AXI Timer. Vanligvis kan vi finne ønsket PWM -funksjon her. Hvis du imidlertid leser dokumentasjonen "tmrctr_v4_3", viser det at driveren for øyeblikket ikke støtter PWM -driften av enheten. På grunn av mangelen på PWM -funksjon, må vi avslutte vår PWM -funksjon ved hjelp av xtmrctr.h og AXI Timer v2.0 LogiCORE IP Product Guide.

Trinn 15: Bygg en PWM-modul- Slutt opp PWM-funksjonen (I)

Bygg en PWM-modul- Slutt opp PWM-funksjonen (I)
Bygg en PWM-modul- Slutt opp PWM-funksjonen (I)

Tilbake til hovedfilen "helloworld.c", inkluderer følgende overskriftsfiler:

Trinn 16: Bygg en PWM-modul- Slutt opp PWM-funksjonen (II)

Bygg en PWM-modul- Slutt opp PWM-funksjonen (II)
Bygg en PWM-modul- Slutt opp PWM-funksjonen (II)

Definer basisadressene til to AXI TImer gjennom “xparameters.h”.

Trinn 17: Bygg en PWM-modul- Slutt opp PWM-funksjonen (III)

Bygg en PWM-modul- Slutt opp PWM-funksjonen (III)
Bygg en PWM-modul- Slutt opp PWM-funksjonen (III)

Bygg ønsket PWM -funksjon.

Duty_val: konverterer gradverdien til duty cycle. PWM_Freq_Duty: angi ønsket frekvens og driftssyklus for å generere PWM. Klokkeperiode bør også tilordnes.

PWM_START: tilordne PWM -registeradressen og begynn å generere PWM.

PWM_STOP: tilordne PWM -registeradressen og slutte å generere PWM.

Resten av demokoden vises i “helloworld.c” under “Axis_2_PWM_SDK”

Trinn 18: Bygg en PWM-modul- Få den til å kjøre

1. Programmer FPGA gjennom SDK

  • Koble Zybo Board via USB -port til PC.
  • Xilinx Tools -> Program FPGA

2. Kjør programmet

Klikk på "Kjør" -ikonet, og rul ned menyen -> Kjør som -> Start på maskinvare

3. SDK -terminal

  • Åpne SDK -terminalen -> Koble til seriell port -> OK
  • Kjør programmet. Hvis demokoden kjøres vellykket, bør du se "Initialisering utført!" på SDK -terminalen.

Trinn 19: Streaming av videobehandling på Digilent ZYBO med OV7670

Komplett arkivfil vedlagt.

Trinn 20: Fullfør blokkdiagram

Komplett blokkdiagram
Komplett blokkdiagram

Dette viser det komplette diagrammet over alle tilkoblinger og IP -blokker i prosjektet

Trinn 21: Koble OV7670 til ZYBO

Koble OV7670 til ZYBO
Koble OV7670 til ZYBO

Opprett en tilkobling for å koble ov7670 -modulen til ZYBO Pmods

Data Pmod er Pmod D

Kontroll Pmod er Pmod C

I tillegg kobler du til PmodCON3 og servoer som spesifisert i første halvdel av denne opplæringen

Trinn 22: Lag blokkdesign

Lag blokkdesign
Lag blokkdesign

I Flow Navigator klikker du på "Create Block Design", og trykker deretter på OK.

Trinn 23: Legg til VHDL -filer for OV7670 kamerakontroll og fangst

Legg til VHDL -filene som er vedlagt dette trinnet i prosjektet

Trinn 24: Legg til begrensningsfil

Legg til den vedlagte begrensningsfilen i prosjektet.

Trinn 25: Legg til IP Repo for HLS IP

Legg til IP Repo for HLS IP
Legg til IP Repo for HLS IP

Ta Zip -filen vedlagt og pakk den ut i en ny mappe med samme navn i en ny katalog (mappe) kalt "HLS_repo".

Legg til et IP-depot i prosjektet ditt ved å gå til IP-katalogen og høyreklikk på "Legg til depot …"

Naviger til "HLS_repo" -katalogen og velg den.

Valgfritt: Lag HLS -videobehandlingsblokken for deg selv!

Trinn 26: Legg til moduler og IP

Legg til moduler og IP
Legg til moduler og IP
Legg til moduler og IP
Legg til moduler og IP

Legg til modulene ov7670_axi_stream_capture, debounce og ov7670_controller i blokkdiagrammet ved å høyreklikke på bakgrunnen og velge "Legg til modul …"

På samme måte kan du legge til IP -adressene:

  • HLS_Video_Track
  • Videoramme buffer buffer
  • Videoramme -buffer lest
  • Video Timing -kontroller
  • AXI4-Stream til Video Out
  • 3 av "Slice"
  • Konstant
  • 2 av AXI Timer

Trinn 27: Innstillinger for IP -konfigurasjon

IP -konfigurasjonsinnstillinger
IP -konfigurasjonsinnstillinger
IP -konfigurasjonsinnstillinger
IP -konfigurasjonsinnstillinger
IP -konfigurasjonsinnstillinger
IP -konfigurasjonsinnstillinger

Som vist på bildene

Trinn 28: Legg til og konfigurer PS IP Block

Legg til og konfigurer PS IP -blokk
Legg til og konfigurer PS IP -blokk
Legg til og konfigurer PS IP -blokk
Legg til og konfigurer PS IP -blokk

Legg til ZYNQ7 -behandlingssystemet i blokkdiagrammet

rediger konfigurasjonen:

  • PS-PL-konfigurasjon

    • HP

      • Aktiver S HP 0
      • Aktiver S HP 1
  • Klokkekonfigurasjon

    • PL klokker

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

Trinn 29: Del 1. Bygge en PWM -modul for servomotorer

Ta fram axi_timer_0 pwm0 til ny utgangsport pwm_Xaxis

Ta fram axi_timer_1 pwm0 til den nye utgangsporten pwm_Zaxis

Trinn 30: Sidetilkoblinger for videoinngang (aclk fremhevet)

Videoinngangssidekoblinger (aclk fremhevet)
Videoinngangssidekoblinger (aclk fremhevet)

Koble videoinngangssidens IP -blokker riktig

(* disse tilkoblingene bør opprettes ved å velge de riktige alternativene under tilkoblingsautomatisering) "aclk" fra axi_stream_capture går til:

  • ap_clk på videoramme buffer skrive
  • ap_clk på HLS -videostrømbehandlingsblokk
  • *aclk på AXI smartconnect IP fra videoramebufferen Skriv til S_AXI_HP0
  • *aclk som tilsvarer kanalene til AXI Interconnect IP for S_AXI -kanalene i HLS -videobearbeidingsblokken og videoramebufferen, skriver S_AXI_HP0_ACLK på PS -blokken

Videostrømssignalet er ganske enkelt koblet i serie fra fangstblokken til Zynq -minnegrensesnittet.

  • Video går fra opptaksblokk til HLS -behandlingsblokk.
  • Den behandlede videoen fra HLS -blokken går til rammebuffer -skriveblokken.
  • *Rammebuffer -skriveblokken kobles til HP0 -grensesnittet på Zynq PS -blokken.
  • M_axis_tuser -signalet fra utgangen fra fangstblokken kobles manuelt til både video_in_TUSER -inngangssignalet på HLS -behandlingsblokken og ap_start -signalet på samme blokk.

TUSER (tuser) -signalet brukes av AXI -videostrømprotokollen for å indikere starten på en ramme i videoen. AP_Start forteller HLS -blokken å starte behandlingen. Vi bruker dermed tuser for å utløse HLS -blokken for å behandle hver ramme slik den kommer inn. Når du kobler til et enkelt signal fra en buss og deler det av på denne måten, er det nødvendig å også koble det til det normale avslutningspunktet for resten av bussen. Vivado antar at hvis du kobler signalet manuelt at du vil koble fra det det normalt ville koble til.

Konfigurasjonsinnstillinger for IP -blokker:

Videoramme buffer skriver:

Videoformater: RGB8

1 prøve per klokke Maks kolonner: 1280 (> = 640) Maks rader: 960 (> = 480) Maks databredde: 8

Trinn 31: Tilkoblinger til OV7670

Tilkoblinger til OV7670
Tilkoblinger til OV7670

På ov7670_axi_stream_capture -blokken

  • Gjør alle inngangene eksterne (høyreklikk på en pinne og velg fra menyen, eller klikk med venstre-> ctrl+T)
  • La navnene være som de er

På ov7670_kontrollerblokken

  • Gjør alle blokkutgangene eksterne
  • Gi nytt navn til config_finished -porten til led0
  • koble clk til CameraClock (<= 50MHz) (FCLK_2)

På debounce -blokken

  • koble knapp 1 -inngangen til en ekstern inngangsport som kalles btn0
  • koble out1 til linjen på nytt på ov7670_controller IP -blokk
  • koble knapp 2 -inngangen til en ekstern inngangsport som kalles btn3
  • koble out2n til ext_reset_in -inngangen på prosessorsystemets tilbakestillings -IP for videodata -klokkedomenet. (*Dette må kanskje gjøres etter at IP er generert*)
  • koble clk til CameraClock (<= 50MHz) (FCLK_2)

Trinn 32: Tilkoblinger på Video Out Side

Tilkoblinger på Video Out Side
Tilkoblinger på Video Out Side
Tilkoblinger på video utside
Tilkoblinger på video utside
Tilkoblinger på video utside
Tilkoblinger på video utside
Tilkoblinger på video utside
Tilkoblinger på video utside

Tilkoblinger for blokker Video Timing Controller (VTC), AXI4-Stream til Video Out, og skiver

  • Bruk 25MHz klokke (FCLK_1) for vid_io_out_clk og VTC clk
  • Bruk 100MHz-klokke (FCLK_0) for aclk på AXI4-Stream to Video Out
  • vtiming_out til vtiming_in
  • Video Frame Buffer Les m_axis_video går til AXI4-Stream til Video Out video_in
  • vtg_ce går til gen_clken
  • Knyt VTC clken, aclken, vid_io_out_ce til Constant dout [0: 0]
  • Ta med vid_hsync og vid_vsync til henholdsvis eksterne utgangsport vga_hs og vga_vs. (ikke bildet)

Skiver:

  • Skiver bør settes opp som vist på vedlagte bilder

    • gi blokkene nytt navn til slice_red, slice_green og slice_blue
    • oppsettskiveområder som vist på bildene etter navnet på blokken
    • koble hver skiveutgang til en ekstern portutgang som vist på bildet.
  • vid_data [23: 0] kobles til inngangene for hvert stykke (Din [23: 0])

Trinn 33: Kjør Block and Connection Automation

Kjør blokkerings- og tilkoblingsautomatisering
Kjør blokkerings- og tilkoblingsautomatisering
Kjør Block and Connection Automation
Kjør Block and Connection Automation
Kjør blokkerings- og tilkoblingsautomatisering
Kjør blokkerings- og tilkoblingsautomatisering

Kjør Block Automation for å koble tingene fra ZYNQ7 PS -blokken. Som vist på bildet.

Kjør tilkoblingsautomatisering for å opprette all sammenkoblings -IP. Vær nøye med alle alternativene i hvert bilde.

På debounce -blokken kobler du out2n til videodata klokkedomenet Processor System Reset ext_reset_in input.

Trinn 34: Generer HDL Wrapper

Generer HDL Wrapper
Generer HDL Wrapper

Generer HDL Wrapper for blokkdesignet ditt.

Sett den som den øverste modulen.

Trinn 35: Generer Bitstream, eksporter maskinvare til SDK, start SDK fra Vivado

Sørg for å inkludere bitstream i eksporten.

Generering av bitstrøm kan ta veldig lang tid.

Start deretter SDK

Trinn 36: SDK (ingen FreeRTOS)

SDK (ingen FreeRTOS)
SDK (ingen FreeRTOS)

Denne versjonen gjør alt uten å bruke FreeRTOS, og kondenserer koden pent.

Lag en frittstående BSP basert på maskinvaredesignet. Standardalternativene skal være fine. Sørg for at BSP -kilder er generert.

Lag en app som vist på bildet. (tom søknad)

Slett den autogenererte hovedmenyen og importer de vedlagte filene.

Trinn 37: FreeRTOS -implementering

FreeRTOS Implementering
FreeRTOS Implementering

Denne versjonen bruker FreeRTOS. Lag en FreeRTOS901 BSP basert på maskinvaredesignet. Standardalternativene skal være fine. Sørg for at BSP -kilder er generert.

Lag en app som vist på bildet. (tom søknad)

Slett den autogenererte hovedmenyen og importer de vedlagte filene.

Trinn 38: Bruksanvisning

Dette prosjektet er litt vanskelig å komme i gang. Følg trinnene i rekkefølge.

Sørg for at ZYBO ikke laster noe selv når den slås på. Dette betyr at Done -lampen ikke skal lyse. En måte å gjøre dette på er å sette oppstartskildehopperen til JTAG.

Åpne prosjektet (FreeRTOS eller ikke) du vil programmere fra SDK

  1. Slå på din ZYBO. Done LED skal ikke lyse.
  2. Programmer FPGA med bitfilen. Done -lampen skal lyse. Led0 skal ikke lyse.
  3. Kjør koden (husk å gå forbi startbruddspunktet hvis du gjør det).

På dette tidspunktet bør du få utgang på VGA -skjermen.

For å starte på nytt (hvis det er feil eller hva som helst): Trykk raskt på PS-SRST-knappen eller slå av ZYBO og deretter på igjen. Fortsett fra trinn 2.

Hvis du stopper prosessoren med feilsøkingsprogrammet, vil kameraet holde posisjon i stedet for å bevege seg. Videostrømmen fortsetter uansett.

Trinn 39: Referanser og lenker

Xilinx referanseveiledninger og dokumentasjon:

  • PG044 - AXI -Stream to Video Out
  • PG278 - Videoramme -buffer Les/skriv

Andre lenker:

  • Lauris blogg - VDMA -inngang
  • Lauris blogg - OV7670 til VGA -utgang ved hjelp av BRAM
  • Hamsterworks wiki, av Mike Fields, den opprinnelige kilden til OV7670 -koden
  • Dataark som viser grunnleggende timingspesifikasjoner

Anbefalt: