Realtime Video Processing Studiegebied Industriële Wetenschappen en Technologie Opleiding Elektronica-ICT Afstudeerrichting Elektronica
Academiejaar 2006-2007
Eindwerk
Jelmer Callant Pieter Huyghe
Voorwoord Een thesis maak je niet alleen...
In eerste instantie willen wij de Provinciale Industriële Hogeschool (PIH) bedanken om deze thesis mogelijk te maken. Het labo en de nodige apparatuur waren ten allen tijde beschikbaar, zodat we ook buiten de gereserveerde uren aan de slag konden.
We houden er aan ing. Johan Beke, onze interne promotor, te danken. Met zijn knowhow en ervaring vonden we de juiste weg binnen dit eindwerk. Hij was steeds beschikbaar en heeft voor heel wat problemen een oplossing helpen zoeken.
Als laatste willen we graag onze vrienden en ouders bedanken. Onze ouders hebben het mogelijk gemaakt deze extra opleiding te kunnen volgen na het behalen van ons bachelordiploma. Met morele en financiële steun hebben ze een sterke bijdrage geleverd aan onze studies.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
I
Lijst van afkortingen ADC AGC AM CPU CRT CVBS DA DAC DCR DIN DVI EAV EDK FM FPGA IDENT INSEL ISE ITU MPU NTSC OCM OPB PAL PLB RGB SAV SCL SDA SDP SECAM SoC SVGA TRS UART VDEC VGA VIR XGA YAA YCrCb YSH
Analog to Digital Convertor Automatic Gain Control Amplitude Modulatie Central Processing Unit Cathode Ray Tube Colour Vision Blanking Synchronisation Digital to Analog Digital to Analog Convertor Device Control Register bus Deutsches Institut für Normung Digital Visual Interface End of Active Video Embedded Development Kit Frequentie Modulatie Field Programmable Gate Array IDENTificatie INgang SELectie Integrated Software Environment International Telecommunications Union Micro Processor Unit National Television Standards Committee On-Chip Memory Controller On-Chip Peripheral Bus Phase Alternating Line Processor Local Bus Red Green Blue Start of Active Video Serial Clock Serial DAta Standard Definition Processor SEquentiel Couleur A Mémoire System on Chip Super Video Graphics Array Timing Reference Symbol Universal Asynchronous Receiver Transmitter Video DECoder Video Graphics Array Vertical Interval Reference eXtended Graphics Array Luma Decimation Filter Luma / Chrominance red /Chrominance blue Luma SHaping filters
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
II
Lijst van figuren Figuur 1: Virtex-II PRO Development Bord .......................................................................... 3 Figuur 2: Blokschema connecties FPGA ................................................................................. 3 Figuur 3: Interne opbouw Virtex-II PRO ............................................................................... 4 Figuur 4: Blokschema DA converter ....................................................................................... 5 Figuur 5: Nominale output-levels ........................................................................................... 6 Figuur 6: VGA connector (female)…… ................................................................................. 8 Figuur 7: DB-9 connector (male) …..................................................................................... 11 Figuur 8: DB-25 Connector (female) ................................................................................... 11 Figuur 9: VDEC1 video decoder bord .................................................................................. 12 Figuur 10: VDEC1 Circuit Diagram .................................................................................... 13 Figuur 11: Blokschema ADV7183B ..................................................................................... 14 Figuur 12: Input multiplexing .............................................................................................. 15 Figuur 13: Standard Definition Processor (SDP) .................................................................. 17 Figuur 14: Gegevensoverdracht I²C ...................................................................................... 22 Figuur 15: S-video plug ….. ................................................................................................. 23 Figuur 16: Component kabels .............................................................................................. 23 Figuur 17: Zwartwit monochroom videosignaal.................................................................... 24 Figuur 18: Lijn- en rasterblanking......................................................................................... 26 Figuur 19: Lijn- en rastersyncpuls ......................................................................................... 26 Figuur 20: Egalisatiepulsen ................................................................................................... 27 Figuur 21: Effect integrerend en differentiërend netwerk ...................................................... 28 Figuur 22: Voor- en na- egalisatiepulsen ............................................................................... 29 Figuur 23: Beeldsignaal zonder gelijkstroomherstelling ......................................................... 30 Figuur 24: Eenvoudige gelijkstroomherstelling ..................................................................... 31 Figuur 25: Klemming op de 'achterstoep' ............................................................................. 31 Figuur 26: Vóór en ná sleuteling ........................................................................................... 32 Figuur 27: Differentiatiefout................................................................................................. 32 Figuur 28: Kleurperceptie ..................................................................................................... 33 Figuur 29: Burstsignaal ......................................................................................................... 37 Figuur 30: Verspreiding PAL, NTSC en SECAM................................................................. 38 Figuur 31: Lijnsynchronisatie ............................................................................................... 41 Figuur 32: Rastersynchronisatie ............................................................................................ 42 Figuur 33: Videosample Data ............................................................................................... 45 Figuur 34: 4:2:2-formaat ...................................................................................................... 48 Figuur 35: 4:4:4-formaat ...................................................................................................... 48 Figuur 36: Conversie 4:2:2 naar 4:4:4 ................................................................................... 49 Figuur 37: Blokschema code ................................................................................................. 50 Figuur 38: Simulatie pipe_line_delay .................................................................................... 52 Figuur 39: Data flow state machine ...................................................................................... 54 Figuur 40: Simulatie Neg_edge_detect ................................................................................. 55 Figuur 41: Simulatie If_decode ............................................................................................. 59 Figuur 42: Simulatie Vp422_444_dup ................................................................................. 64 Figuur 43: Simulatie YCrCb2RGB ....................................................................................... 68 Jelmer Callant | Pieter Huyghe
Realtime Video Processing
III
Figuur 44: Simulatie special_vga_timing_generation ............................................................ 80 Figuur 45: Oorspronkelijke luminatie ….. ............................................................................ 93 Figuur 46: Aangepaste luminantie………............................................................................. 93 Figuur 47: Implementeren in ISE ......................................................................................... 93 Figuur 48: Instellen timing constraints ................................................................................. 94
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
IV
Lijst van tabellen Tabel 1: Output voltage coding .............................................................................................. 7 Tabel 2: Pinout VGA connector…….. ................................................................................... 8 Tabel 3: Signaalniveau RS-232 ............................................................................................. 11 Tabel 4: Pinout S-video…… ................................................................................................ 23 Tabel 5: Coëfficiënten uit de ooggevoeligheidscurve ............................................................. 34 Tabel 6: Basiskarakteristieken PAL en NTSC ....................................................................... 40 Tabel 7: Lijnsynchronisatie bij PAL en NTSC ...................................................................... 41 Tabel 8: Rastersynchronisatie bij PAL en NTSC................................................................... 42 Tabel 9: Field blanking definitie PAL, NTSC ....................................................................... 43 Tabel 10: Timing-referentiesignalen ..................................................................................... 46 Tabel 11: Controlebits .......................................................................................................... 47
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
V
Inhoudsopgave 1 2
Inleiding ......................................................................................................................... 1 Virtex II pro development systeem .................................................................................. 2 2.1 Algemene omschrijving ........................................................................................... 2 2.2 Extern ..................................................................................................................... 2 2.3 Functionele opbouw van een SoC ........................................................................... 4 2.4 DA converter (3818KRC) ...................................................................................... 5 2.4.1 Blokschema..................................................................................................... 5 2.4.2 Digitale input ................................................................................................. 6 2.4.3 Output ........................................................................................................... 6 2.5 VGA output ........................................................................................................... 7 2.6 RS-232 ................................................................................................................... 9 3 VDEC1 video decoder bord ......................................................................................... 12 3.1 Functionele omschrijving ...................................................................................... 12 3.2 Multiformat SDTV Video Decoder (ADV7183B)................................................ 14 3.2.1 Blokschema................................................................................................... 14 3.2.2 Analoge front-end ......................................................................................... 15 3.2.3 Algemene status registers ............................................................................... 16 3.2.4 Standard Definition Processor (SDP)............................................................ 17 3.2.5 SD luma path ............................................................................................... 17 3.2.6 SD chroma path ........................................................................................... 18 3.2.7 Sync processing ............................................................................................. 18 3.2.8 General setup ................................................................................................ 19 3.2.9 Color controls ............................................................................................... 19 3.2.10 Luma filter .................................................................................................... 19 3.2.10.1 Luma Antialias Filter (YAA).................................................................. 20 3.2.10.2 Luma Shaping Filters (YSH) ................................................................. 20 3.2.10.3 Digital resampling filter ........................................................................ 20 3.2.11 Chroma filter. ............................................................................................... 20 3.2.12 MPU port description................................................................................... 21 3.3 Aansluitingen ........................................................................................................ 22 3.3.1 Composite video ........................................................................................... 22 3.3.2 S-video.......................................................................................................... 22 3.3.3 Component video ......................................................................................... 23 4 Analoge video ............................................................................................................... 24 4.1 Zwartwit videosignaal ........................................................................................... 24 4.1.1 Samenstelling ................................................................................................ 24 4.1.2 Resolutie ....................................................................................................... 24 4.1.3 Verticale en horizontale onderdrukking of blanking ...................................... 25 4.1.4 Synchronisatie en egalisatie ........................................................................... 26 4.1.5 Gelijkstroomherstelling ................................................................................. 30 4.1.5.1 Eenvoudige gelijkstroomherstelling ........................................................... 31 4.1.5.2 Gesleutelde klemming op de ‘achterstoep’................................................. 31
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
VI
4.1.6 Tijdsconstante van het koppelnetwerk .......................................................... 32 4.2 Kleur videosignaal ................................................................................................. 33 4.2.1 Kleurperceptie............................................................................................... 33 4.2.2 Luminantie ................................................................................................... 34 4.2.3 Kleurverzadiging ........................................................................................... 35 4.2.4 Kleursynchronisatie....................................................................................... 36 4.3 PAL, NTSC .......................................................................................................... 38 4.3.1 PAL .............................................................................................................. 38 4.3.2 NTSC ........................................................................................................... 39 4.3.3 PAL en NTSC, eigenschappen ...................................................................... 40 4.3.3.1 Basiskarakteristieken ................................................................................. 40 4.3.3.2 Lijnsynchronisatie ..................................................................................... 41 4.3.3.3 Rastersynchronisatie.................................................................................. 42 5 Digitale video ............................................................................................................... 43 5.1 Coderingseigenschappen ....................................................................................... 43 5.2 Video formaat ....................................................................................................... 43 5.3 Structuur van het interfacesignaal ......................................................................... 44 5.4 Video timing referentie codes (SAV, EAV) ........................................................... 46 5.5 Datawoorden gedurende de blanking. ................................................................... 47 5.6 Formaat 4:2:2 naar 4:4:4 ...................................................................................... 47 5.6.1 Formaat 4:2:2 ............................................................................................... 47 5.6.2 Formaat 4:4:4 ............................................................................................... 48 5.6.3 Conversie 4:2:2 naar 4:4:4 ........................................................................... 49 6 Blokschema................................................................................................................... 50 7 Blokken ........................................................................................................................ 51 7.1 Pipe line delay ....................................................................................................... 51 7.1.1 Code ............................................................................................................. 51 7.1.2 Uitleg............................................................................................................ 52 7.1.3 Simulatie....................................................................................................... 52 7.2 Neg_edge_detect .................................................................................................. 53 7.2.1 Code ............................................................................................................. 53 7.2.2 Uitleg............................................................................................................ 54 7.2.3 Simulatie....................................................................................................... 55 7.3 If_decode .............................................................................................................. 56 7.3.1 Code ............................................................................................................. 56 7.3.2 Simulatie....................................................................................................... 59 7.4 Vp422_444_dup .................................................................................................. 60 7.4.1 code .............................................................................................................. 60 7.4.2 Uitleg............................................................................................................ 63 7.4.3 Simulatie....................................................................................................... 64 7.5 YCrCb2RGB ........................................................................................................ 65 7.5.1 Code ............................................................................................................. 65 7.5.2 Simulatie....................................................................................................... 68 7.6 Line_buffer ........................................................................................................... 69 7.6.1 Code ............................................................................................................. 69
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
VII
7.6.2 Uitleg............................................................................................................ 73 7.6.3 Simulatie....................................................................................................... 73 7.7 Special_svga_timing_generation ........................................................................... 74 7.7.1 Code ............................................................................................................. 74 7.7.2 Uitleg............................................................................................................ 79 7.7.3 Simulatie....................................................................................................... 80 7.8 Video Capture ...................................................................................................... 81 7.8.1 Code ............................................................................................................. 81 7.8.2 Uitleg............................................................................................................ 87 8 Problemen en aanpak .................................................................................................... 88 8.1 Conversie van Verilog naar VHDL ....................................................................... 88 8.1.1 Voorbeeld 1 .................................................................................................. 88 8.1.1.1 Verilog ...................................................................................................... 88 8.1.1.2 VHDL ...................................................................................................... 88 8.1.2 Voorbeeld 2 .................................................................................................. 89 8.1.2.1 Verilog ...................................................................................................... 89 8.1.2.2 VHDL ...................................................................................................... 89 8.2 Processen .............................................................................................................. 90 8.3 Digitale video ....................................................................................................... 90 8.4 Implementatie van de VHDL-files ........................................................................ 91 8.5 Signed versus Unsigned ........................................................................................ 91 8.5.1 Verilog .......................................................................................................... 91 8.5.2 VHDL .......................................................................................................... 91 8.6 Horizontale en verticale synchronisatie ................................................................. 92 9 Eventuele verdere stappen ............................................................................................. 95 9.1 Aanpassing files ..................................................................................................... 95 9.2 Extra frames .......................................................................................................... 95 10 Besluit....................................................................................................................... 97
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
VIII
1 Inleiding Het realtime verwerken van videobeelden vereist snelle digitale hardware om alle data op tijd te kunnen verwerken en de nieuwe signalen te genereren. Videosignalen met een microprocessor verwerken is geen goede keuze omdat een CPU meestal te traag is om de videodatastroom realtime te verwerken. In een eerste stap wordt het analoge videosignaal, met behulp van een decoderchip, omgezet naar een digitaal signaal. Dit digitaal signaal bestaat uit de 3 datastromen rood, groen, blauw en de sync-signalen. Met behulp van een System on Chip, opgebouwd met een snelle en krachtige FPGA, wordt de digitale videodata verwerkt en uiteindelijk via een DAC (digital to analog convertor) terug naar een analoog signaal omgezet.
Er wordt gebruik gemaakt van een “video decoder bord” van Digilent Inc dat kan aangesloten worden op de XUP borden, met de bedoeling een PAL videosignaal om te zetten naar een VGA signaal en weer te geven op een computerscherm. Om alles vlot te sturen kiezen we voor een System On Chip design met PowerPC.
We kiezen er voor hoofdstuk 2 en 3 te wijden aan de hardware die we gebruiken. Dit zijn het Virtex-II PRO en het VDEC1 bord. In hoofdstuk 4 en 5 worden respectievelijk analoge en digitale video besproken en worden de belangrijkste verschillen tussen PAL en NTSC uit de doeken gedaan. De daarop volgende hoofdstukken handelen over de uitwerking van het eindwerk zelf. Welke code is er geschreven? Hoe zien de simulaties er uit? Wat werd daaruit geconcludeerd en hoe werd het eindwerk verder aangepakt?
Om de precieze werking van de code te begrijpen wordt er aangeraden het blokschema uit hoofdstuk 6 of uit de bijlage (cd-rom) er bij te nemen.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
1
2 Virtex II pro development systeem
2.1 Algemene omschrijving Het Virtex-II Pro development systeem is gebaseerd op de Virtex-II Pro FPGA met twee geïntegreerde IBM hardcore CPU’s. De Virtex-II Pro FPGA is een krachtig, veelzijdig en relatief goedkoop systeem dat speciaal ontwikkeld werd voor het digitale luik in het curriculum van een ingenieur. Het bord bevat bovendien verschillende interfaces, wat het multifunctioneel maakt op elektronicagebied.
Het XUP development bord kan voor elk onderzoeksniveau gebruikt worden, van basis opdrachten tot geavanceerde onderzoeksprojecten. Door de kracht van de Virtex-II Pro kan het bord zowel als digitale designtrainer, microprocessor of voor het ontwikkelen van complexe digitale systemen dienen. Omdat er zich verscheidene connectoren op het bord bevinden, kan er altijd worden uitgebreid met prototype borden. In functie van dit eindwerk rond realtime video processing is dit het VDEC1 bord.
2.2 Extern In figuur1 is het XUP development bord afgebeeld en in figuur 2 is blokschematisch weergegeven wat er zoal verbonden is met de FPGA. In dit blokschema, krijgt men een goed inzicht in de opbouw van het bord. Zo zijn de verschillende connecties te zien met de VirtexII Pro. Dit bevat onder andere de voeding, klok signalen en de verschillende I/O’s. Voor de realisatie van het eindwerk is gebruik gemaakt van volgende onderdelen :
expansion header
RS232
XSGA Video Output
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
2
Aan de expansion header is het VDEC bord aangesloten, dat verder in deze thesis onder de loep wordt genomen.
Figuur 1: Virtex-II PRO Development Bord
Figuur 2: Blokschema connecties FPGA
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
3
2.3 Functionele opbouw van een SoC
Figuur 3: Interne opbouw Virtex-II PRO
Figuur 3 toont hoe de SoC intern is opgebouwd bij een Virtex II Pro FPGA van Xilinx. In totaal bevinden er zich twee Power-PC’s in de FPGA. Dit zijn hardcore “CPU’s”. Men kan echter ook kiezen voor de Microblaze. Dit is een softwarematige uitvoering en neemt dan ook resources in van de FPGA .
Indien je de mogelijkheid hebt, is het beter om te kiezen voor een Power-PC, omdat deze veel krachtiger en sneller werken. Ze staan in voor het uitvoeren van de software die hier geschreven wordt in de C-taal. De Power PC staat in verbinding met de PLB bus en op zijn beurt aan de OPB bus via de bus brigde.
De PLB bus is een full duplex 32-bits bus. De OPB-bus is half duplex, maar omvat ook 32 bits. Men kan stellen dat de PLB bus de snelle bus is en dat hier dan ook geheugen controllers, ethernet of andere snelle apparaten zullen aan gekoppeld worden.
De OPB bus wordt meer gebruikt om een eigen gemaakte peripheral aan te koppelen. De ‘tragere’ apparaten maken ook gebruik van die bus. Jelmer Callant | Pieter Huyghe
Realtime Video Processing
4
De bus bridge staat in voor de connectie tussen de twee verschillende bussen, zodat er een onderlinge communicatie mogelijk is. Op het einde van iedere bus is er een arbiter die ervoor zorgt dat er geen conflicten ontstaan op de bus en dat er maar één master “spreekt”.
Tenslotte is er ook de DCR bus, deze wordt gebruikt om alles te kunnen instellen bij de initialisatie, omdat er bij het opstarten nog geen communicatie mogelijk is tussen de PLB en de OPB bus (Bus Bridge en arbiters moeten worden ingesteld). Via deze bus is controle over de verschillende onderdelen van de Virtex II-Pro mogelijk.
2.4 DA converter (3818KRC) Het FMS3818 IC is een drievoudige DA converter, die gebruikt wordt bij de verwerking van PC beelden en videosignaal conversie ( RGB, YCrCb, Composite, Y, C), waar snelheid van uiterst belang is.
Ook het Virtex-II Pro bord bevat zo’n video DAC die de digitale signalen terug omzet naar analoge.
2.4.1 Blokschema
Figuur 4: Blokschema DA converter
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
5
2.4.2 Digitale input De inkomende RGB data wordt geregistreerd op de stijgende flank van de klok. Analoge outputs volgen de stijgende flank van de klok na een delay, tDO.
2.4.3 Output SYNC en BLANK inputs controleren het uitgangsniveau van de D/A converters gedurende
het terugslaginterval van een CRT. Wanneer de SYNC laag gebracht wordt, wordt de stroombron, die de sync puls op de IOG uitgang superponeert, uitgeschakeld. SYNC en pixel data worden op de stijgende flank van de klok geregistreerd. SYNC overschrijft geen enkele data en mag enkel gebruikt worden gedurende het blanking interval. Wanneer de BLANK laag is, wordt de pixel data input genegeerd en worden de D/A converter uitgangen op het blanking niveau geplaatst. BLANK gebeurt op de stijgende flank van de klok.
Figuur 5: Nominale output-levels
Iedere D/A output is een stroombron van VDDA. Deze wordt dan ook in een stroomeenheid uitgedrukt. De RGB transformatie van data naar stroom gaat als volgt:
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
6
Tabel 1: Output voltage coding
2.5 VGA output VGA ofwel Video Graphics Array is een standaard voor het weergeven van beelden op een computermonitor. De VGA standaard werd ontwikkeld door IBM, werd voor het eerst op de markt gebracht in 1987 en is door de jaren heen uitgegroeid als dé standaard voor het aansturen van computerschermen. De term VGA wordt vaak gebruik om te verwijzen naar een resolutie van 640 x 480, ongeacht de hardware die gebruikt wordt om het beeld te produceren. Het kan ook verwijzen naar de 15 pins D-type connector, die nog steeds heel frequent gebruikt wordt om analoge videosignalen in heel wat resoluties te transporteren, niettegenstaande er heel wat nieuwe standaarden zijn bijgekomen (SVGA, XGA, etc…).
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
7
Figuur 6: VGA connector (female)
Pin 1:
Red video
Pin 2:
Green video
Pin 3:
Blue video
Pin 4:
Not connected
Pin 5:
Ground (HSync)
Pin 6:
Red return
Pin 7:
Green return
Pin 8:
Blue return
Pin 9:
+5V(DDC)
Pin 10:
Ground (VSync, DDC)
Pin 11:
Not connected
Pin 12:
I²C data
Pin 13:
Horizontal sync
Pin 14:
Vertical sync
Pin 15:
I²C clock
Tabel 2: Pinout VGA connector
VGA werd officieel vervangen door de XGA norm van IBM, maar in feite kan men stellen dat het vervangen werd door SVGA, een norm die ontwikkeld werd door verschillende andere fabrikanten.
Het principe van VGA aansturing is gebaseerd op analoge aansturing met behulp van gescheiden kleuren. Deze drie kleuren, rood, groen en blauw (RGB) worden apart over een lijn gestuurd en de horizontale en verticale uitlijning wordt door de horizontale en verticale synchronisatie aangestuurd.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
8
2.6 RS-232 De RS-232-C standaard werd in 1969 uitgebracht door de Electronic Industries Alliance.
Seriële transmissie houdt in dat data bit per bit wordt verzonden over een enkele communicatielijn. Daarentegen heeft parallelle transmissie nood aan op zijn minst evenveel lijnen als er bits worden verzonden (voor een woord van 8 bits zijn op zijn minst 8 lijnen nodig). Seriële transmissie wordt eerder gebruikt voor communicatie over lange afstanden, terwijl
parallelle
transmissie
gebruikt
wordt
voor
korte
afstanden
waar
hoge
transmissiesnelheden nodig zijn.
Oorspronkelijk was een groot voordeel van seriële transmissie dat het ideaal was om op telefoonlijnen gebruikt te worden. De seriële data kon door een modem geconverteerd worden, op een telefoonlijn geplaatst worden en door een andere modem terug naar seriële data omgezet worden.
Communicatie volgens de RS-232 standaard is een asynchrone seriële communicatie methode. Asynchroon wil zeggen dat de informatie op ieder willekeurig moment kan verzonden worden, waarbij de taak van de ontvanger is te detecteren wanneer de data begint of eindigt. Het voordeel van asynchrone communicatie ten opzichte van synchrone communicatie is dat asynchrone communicatie goedkoper is om te implementeren. Er zijn namelijk minder lijnen nodig in een kabel. Het grote nadeel is dat de ontvanger op het verkeerde moment kan beginnen met ontvangen, waardoor er opnieuw een synchronisatie moet gebeuren en dit uiteraard extra tijd in beslag neemt.
De standaard omschrijft zoals eerder vermeld een communicatiemethode waarbij informatie bit voor bit wordt verstuurd over een fysiek kanaal. De informatie moet opgedeeld zijn in datawoorden. De lengte van een datawoord kan variëren. Voor een goede overdracht worden extra bits toegevoegd om synchronisatie- en foutdetectie mogelijk te maken. Op PC’s kan je een lengte tussen 5 en 8 bits instellen. Het is heel belangrijk dat zowel de zender als de
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
9
ontvanger ingesteld staan op hetzelfde aantal databits. Anders kan de binnenkomende informatie fout worden geïnterpreteerd , of zelfs helemaal niet worden herkend.
Om op elk moment te kunnen starten met een datatransfer, moet de ontvanger kunnen detecteren welke bit de eerst te ontvangen bit van een woord is. Daarom wordt elk datawoord vooraf gegaan door een signaleringsbit of startbit. Deze bit is altijd herkenbaar aan het actief lage signaalniveau, omdat de lijn in actief hoge status is als er geen communicatie gebeurt. Direct na de startbit worden de databits verzonden.
Om transmissiefouten te kunnen detecteren, kan aan het einde van een datawoord een pariteitbit gegenereerd worden. De zender berekent de waarde van die bit aan de hand van de verzonden informatie. De ontvanger voert dezelfde berekening uit en controleert dan of zijn ontvangen bit overeen komt met de berekende waarde. We kunnen spreken van zowel even als oneven pariteit.
Wanneer de ontvanger een startbit gemist heeft, omdat er bijvoorbeeld ruis op de lijn aanwezig was, start de ontvangst met de eerstvolgende databit die actief laag is. Hierdoor wordt echter verkeerde data ontvangen. Om hersynchronisatie mogelijk te maken, heeft men het begrip ‘framing’ geïntroduceerd. Framing wil zeggen dat de databits en de pariteitbit worden omringd door start- en stopbits. De tijdsperiode tussen de start- en stopbits is constant en wordt bepaald door de baudrate en het aantal data- en pariteitsbits. De start- en de stopbit herken je respectievelijk aan hun actief laag en actief hoog niveau. Stel nu dat de ontvanger een andere waarde detecteert dan ‘1’ op het moment dat hij de stopbit had moeten ontvangen, dan wordt er gedetecteerd dat er een framing error plaatsvond en wordt er een foutconditie in de UART gezet. Uiteindelijk wordt er dan geprobeerd om opnieuw binnenkomende bits te synchroniseren.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
10
Het signaalniveau ziet er als volgt uit:
Niveau
Zender
Ontvanger
Grenswaarden (V)
Grenswaarden (V)
Space status (0)
+5 … +15
+3 … +25
Mark status (1)
-5 … -15
-3 … -25
Ongedefinieerd
-
-3 … +3
Tabel 3: Signaalniveau RS-232
De RS-232 connector werd oorspronkelijk ontworpen om 25 pinnen te gebruiken. Bij die indeling was er onder meer ruimte gemaakt voor een secundair serieel RS-232 communicatiekanaal. In de praktijk wordt er echter meestal slechts één communicatiekanaal met bijhorende handshake lijnen gebruikt. Op PC’s is de DB9 versie populairder geworden. Pintoewijzing van beide types connectoren zie je op onderstaande figuren.
Figuur 7: DB-9 connector (male)
Figuur 8: DB-25 Connector (female)
We gebruiken de RS232 verbinding louter voor het selecteren van het soort ingangssignaal dat we willen gebruiken.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
11
3 VDEC1 video decoder bord
3.1 Functionele omschrijving Het video decoder bord is opgebouwd rond de ADV7183B video decoder chip van Analog Devices. Het kan NTSC, PAL en SECAM video signalen digitaliseren. De chip detecteert automatisch standaard analoge televisiesignalen en digitaliseert die met drie 54MHz 10-bit ADC’s. De output data kan naar een aangesloten bord verzonden worden in een 8- of 16- bit YCrCb formaat.
Het VDEC1 bord bevat alle nodige circuits, waaronder stabiele, goed gefilterde spanningsvoorziening, 75-ohm inputs, een stabiele 27 MHz klok, verschillende video input connectors en input beveiligingsnetwerken.
Het bord kan aangesloten worden op de speciale high-speed data connector van het XUP Virtex-II PRO development bord.
Figuur 9: VDEC1 video decoder bord
Bovenstaande figuur is het VDEC1 bord. Onderaan merken we de high-speed data connector, bovenaan de verschillende ingangen ( composiet, RGB en S-video) die verder in deze thesis zullen besproken worden.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
12
Op onderstaande figuur is het blokschema van het VDEC1 bord weergegeven. Centraal staat het blokschema van de ADV7183B.
Figuur 10: VDEC1 Circuit Diagram
Het bord wordt in functie van ons eindwerk gebruikt om analoge video te digitaliseren, zodat die video verwerkt en terug analoog naar buiten gestuurd kan worden. Het lijkt ons essentieel in de volgende hoofdstukken wat aandacht te besteden aan het ADV7183B IC.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
13
3.2 Multiformat SDTV Video Decoder (ADV7183B)
3.2.1 Blokschema
Figuur 11: Blokschema ADV7183B
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
14
3.2.2 Analoge front-end De ADV7138B analoge front end bestaat uit drie 10 bit ADC’s die het analoge video signaal digitaliseren vooraleer het verder verwerkt kan worden. De analoge front-end gebruikt verschillende kanalen voor iedere ADC om een uitstekende werking te kunnen garanderen bij toepassingen met gemixte signalen. De front-end bevat een 12-kanaals input multiplexer, die toelaat dat er meerdere videosignalen door de ADV7183B verwerkt worden. De ADC’s zijn zó geconfigureerd dat ze kunnen werken in 4x oversampling mode.
Op onderstaande figuur zien we de algemene structuur van de input multiplexing die in het IC voorzien is. De signalen worden op een zodanige manier gemultiplext, zodat er geen overspraak mogelijk is.
Figuur 12: Input multiplexing
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
15
Zoals we op de figuur kunnen zien, kunnen de analoge input multiplexers zowel door functionele registers (INSEL) als manueel gecontroleerd worden. Door INSEL [3:0] te gebruiken is de opstelling van de multiplexers vereenvoudigd en wordt de crosstalk tussen de kanalen geminimaliseerd door de input kanalen op voorhand toe te wijzen.
De INSEL bits staan de gebruiker toe zowel het input kanaal als het input formaat te selecteren. De INSEL[3:0] dient niet alleen om de analoge input multiplexing te schakelen, maar het configureert ook de SDP core om de CVBS (Comp), S-video (Y/C), of component (YCbCr) formaten te verwerken.
Het is mogelijk om de instellingen via I²C te overschrijven.
3.2.3 Algemene status registers Er zijn vier registers die samenvattende informatie vrijgeven over de video decoder. Het IDENT register, laat de gebruiker toe de revisie code van de ADV7183B te identificeren. De andere drie registers bevatten status bits, aangaande de werking van het IC.
Er zijn ook AD_RESULT[2:0] bits, wat staat voor autodetection result. Deze bits stellen het resultaat voor wat het autodetectieblok rapporteerde.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
16
3.2.4 Standard Definition Processor (SDP)
Figuur 13: Standard Definition Processor (SDP)
Het SDP blok kan omgaan met standaard definitie video in CVBS, Y/C, en YCrCb formaten. Het kan opgedeeld worden in een luminantie- en een chrominantiepad. Als de input video van het composiet type is (CVBS), dan worden beide procespaden gevoed met de CVBS input.
3.2.5 SD luma path Het input signaal wordt door de volgende blokken verwerkt:
Digital Fine Clamp: gebruikt heel precies algoritme om het videosignaal te clampen.
Luma Filter Block: bevat een decimale luma filter (YAA) met een vaste responsie en shaping filters (YSH) die een selecteerbare responsie hebben.
Gain Control: De automatische versterkingscontrole (AGC) kan in verschillende modes werken.
Luma Resample: om zowel lijnlengte fouten als dynamische lijnsveranderingen te corrigeren wordt de data digitaal bemonsterd.
Luma 2D comb: zorgt voor luma/chroma scheiding
AV code insertion: hier wordt de gedecodeerde luma bij de chroma gevoegd.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
17
3.2.6 SD chroma path Het input signaal wordt door de volgende blokken verwerkt:
Digital Fine Clamp: gebruikt een heel precies algoritme om het videosignaal te clampen.
Chroma demodulation: genereert een kleurdraaggolf voor eender welk gemoduleerd chroma schema. Het blok voert een AM demodulatie uit voor PAL en NTSC en een FM demodulatie voor SECAM.
Chroma Filter Block: bevat een decimale chroma filter (CAA) met een vaste responsie en shaping filters (CSH) die een selecteerbare responsie hebben.
Gain control: automatische versterkingscontrole kan werken in verschillende modes (gebaseerd op de amplitude van de kleurdraaggolven, op de diepte van de horizontale syncpuls op het lumakanaal, of vaste, manuele versterking).
Chroma Resample: de chroma data wordt digitaal herbemonsterd, om perfect te lopen met de luma data. De herbemonstering gebeurt om statische en dynamische lijnlengtefouten van het inkomende videosignaal te corrigeren.
Chroma 2D Comb: zorgt voor kwaliteitsvolle scheiding van luma en chroma, wanneer het ingangssignaal CVBS is.
AV code insertion: hier wordt de gedecodeerde luma bij de chroma gevoegd.
3.2.7 Sync processing De ADV7183B haalt de synchronisatiesignalen uit de videogegevensstroom. Bij dit IC is er nog geen ondersteuning voor externe horizontale of verticale synchronisatiesignalen. Het extraheren van die signalen is geoptimaliseerd om niet perfecte videobronnen, zoals een VCR met videokoppen, te ondersteunen. Het daadwerkelijk gebruikte algoritme wendt een ruwe detectie, gebaseerd op overschrijden van een bepaalde drempelwaarde aan, gevolgd door een meer gedetailleerde detectie, gebruik makend van een adaptief interpolatie algoritme. De ruwe synchronisatie informatie wordt
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
18
gestuurd naar een blok die de lijnlengte meet en voorspelt. Die output wordt gebruikt om het bemonsteringsgedeelte te sturen om zeker te zijn dat de ADV7138B 720 actieve pixels per lijn uitstuurt.
Het synchronisatieblok in het IC omvat ook de volgende blokken:
Vsync processor: dit blok zorgt voor een extra filtering van de gedetecteerde verticale synchronisatiesignalen om deze te optimaliseren.
Hsync processor: is ontworpen om inkomende horizontale synchronisatiesignalen die vervuild zijn door ruis te filteren.
3.2.8 General setup De video standaard selectie staat sowieso op autodetectie ingesteld. De resultaten van de autodetectie kunnen uit de status registers gelezen worden.
3.2.9 Color controls Deze registers staan de gebruiker toe om de weergave van een beeld in te stellen. Deze controle is onafhankelijk van eender welke andere controle. De controle van de helderheid is bijvoorbeeld onafhankelijk van het vastklemmen van het beeld, ook al hebben beide instellingen een invloed op de DC levels.
3.2.10 Luma filter De Luma filter bestaat eigenlijk uit drie filter sets: de luma antialias filter, de luma shaping filter en de digitale herbemonsteringsfilter. Het dataformaat op dit punt is CVBS voor de CVBS input of enkel luma voor Y/Cen YCrCb inputformaten.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
19
3.2.10.1 Luma Antialias Filter (YAA) De ADV7183B chip ontvangt video met een frequentie van 27 MHz. DE ITU-R BT.601 standaard adviseert een sample frequentie van 13,5 MHz. Dit filter voorkomt aliasing door de luma signalen te filteren met een lineaire laagdoorlaatfilter.
3.2.10.2 Luma Shaping Filters (YSH) Het shaping filter blok is een programmeerbare laagdoorlaatfilter die kan gebruikt worden om de bandbreedte van het luma signaal te beperken. Door de bandbreedte van het lumasignaal te beperken kan de kwaliteit van het beeld, vooral bij video waar heel veel hoogfrequente ruis aanwezig is, aanzienlijk verbeteren.
3.2.10.3 Digital resampling filter Deze filter is een set van laagdoorlaat filters. Dit blok wordt gebruikt om opnieuw bemonstering toe te staan van het videosignaal om parameters, zoals de tijdsbasis van een videolijn te veranderen. Dit is echter door het systeem ingesteld en vraagt geen interventie van de gebruiker.
3.2.11 Chroma filter. De chroma filter bestaat eigenlijk uit drie filter sets: de chroma antialias filter, de chroma shaping filter en het digitale herbemonsteringsfilter. Het dataformaat op dit punt is CVBS voor de CVBS input of enkel luma voor Y/Cen YCrCb inputformaten.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
20
3.2.12 MPU port description Het IC ondersteunt een 2-draads seriële interface (I²C compatibel). Twee inputs, de seriële data (SDA) en een seriële klok (SCLK), wisselen informatie uit tussen het IC en de I²C controller. De I²C poort staat toe om de gebruiker de decoder te configureren en uit te lezen.
Het IC heeft twee slave adressen waarin zowel gelezen als geschreven kan worden.
Om het apparaat via de bus aan te sturen moet er een bepaald protocol gevolgd worden. Allereerst moet de master een datastroom intitialiseren door een startconditie in te stellen, die gedefinieerd wordt door een overgang van hoog naar laag op de SDA lijn, terwijl de klok hoog blijft (zie figuur 14). Dit geeft aan dat er een adres- of een datastroom zal volgen. Alle randapparaten antwoorden op die startconditie en schuiven 8 bits (7-bit adres + R/W bit). Het apparaat die het verzonden adres herkent, antwoordt door de datalijn laag te zetten gedurende de negende klokpuls. Deze bit kennen we als de acknowledge bit. Alle andere apparaten herkenden het adres niet en blijven stand-by.
De R/W bit legt de richting van de data vast. Een logische ‘0’ als minst beduidende bit van de eerste byte wil zeggen dat de master informatie zal schrijven. Een logische ‘1’ wil zeggen dat de master informatie van de periferie zal lezen.
Een gegevensoverdracht eindigt altijd door middel van een stop conditie.
De gebruiker heeft toegang tot ieder subadres, zonder dat alle registers moeten geüpdatet worden.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
21
Figuur 14: Gegevensoverdracht I²C
De registers kan je terugvinden in bijlage van deze thesis.
3.3 Aansluitingen We kunnen drie soorten video aansluiten op het VDEC bord. Deze worden in de onderstaande hoofdstukken besproken.
3.3.1 Composite video Meestal komt composite video onder een standaard formaat zoals NTSC, PAL of SECAM voor. Het bestaat uit drie bronsignalen: Y, U en V (of Y, I en Q). Y stelt de helderheid of de luminantie voor en bevat synchronisatiepulsen, zodat het op zich al voorgesteld kan worden als een monochroom beeld. U en V (of I en Q) dragen de kleurinformatie. Deze worden eerst gemixt met twee kleurdraaggolven in orthogonale fase om de chrominantie te vormen.
Composiet video wordt gebruikt bij broadcast kleurentelevisie en is ‘downward’ compatible met zwart-wit TV.
3.3.2 S-video S-video, ook wel Separate video is een norm om videosignalen te transporteren, waarvan de kwaliteit ten opzichte van zijn voorgangers aanzienlijk verbeterd is. S-video bereikt die betere kwaliteit door de kleurinformatie over een aparte geleider te versturen. Men maakt gebruik van
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
22
een vierpolige Mini-DIN plug. Het videosignaal met de luminantie- en synchronisatieinformatie wordt over een tweede geleider gestuurd. Als resultaat is er minder crosstalk tussen de kleurinformatie en de cruciale grijswaarde informatie (visuele perceptie). Omdat de mens gevoeliger is voor grijswaarde veranderingen dan voor kleurveranderingen wordt bij S-video het signaal op die manier gesplitst. Beide signalen worden afgesloten met 75 Ohm en hebben een aparte massa-aansluiting. Ook de beide coaxiale verbindingen in de gebruikte kabel moeten een impedantie van 75 Ohm hebben.
Onderstaande figuur toont een S-video plug.
Figuur 15: S-video plug
Contact
Naam
1
GND
2
GND
3
Y
4
C
Tabel 4: Pinout S-video
3.3.3 Component video Studio’s maken gebruik van high-end video systemen. Deze systemen maken gebruik van drie gescheiden videosignalen voor rode, groene en blauwe beeldvlakken. Voor elk willekeurig kleur ontbindingsschema heeft component video de beste kleur reproductie. Er is namelijk geen crosstalk tussen de drie verschillende kanalen zoals in composite- en S-video. Component video vereist echter een grotere bandbreedte en heel erg goede synchronisatie tussen de drie componenten.
Figuur 16: Component kabels
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
23
4 Analoge video
4.1 Zwartwit videosignaal
4.1.1 Samenstelling Een zwartwit monochroom videosignaal verdeelt zijn amplitude tussen de beeldinformatie (luminantie) en de synchronisatie (horizontale en verticale afbuiging van de ontvanger moeten synchroon zijn met de zender).
Deze verdeling ziet er als volgt uit:
Figuur 17: Zwartwit monochroom videosignaal
4.1.2 Resolutie In de standaard werd gekozen voor een 4:3 beeldformaat. Het aantal beeldlijnen waarmee een TV-beeld wordt weergegeven, is bepaald door volgende overwegingen:
Het menselijk oog is slechts in staat om twee parallelle lijnen (één witte + één zwarte) als afzonderlijke lijnen te onderscheiden als ze, vanuit het oog bekeken, een hoek vormen die meer is dan ongeveer 1,5’. Liggen de lijnen dichter bij elkaar, dan worden ze door de beperkte resolutie van het oog als één vlak met een gemiddelde intensiteit waargenomen. Zeer fijne details kunnen dus vanaf een bepaalde afstand niet meer waargenomen worden.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
24
Een tweede factor die de resolutie van een TV-beeld bepaalt is de kijkafstand (E). Uit proeven is gebleken dat er voor TV-beelden een optimale waarnemingsafstand bestaat die ongeveer vijf maal de beeldhoogte is.
De mogelijkheid was er om beeldbuizen te maken met een rechthoekig scherm met B/H = 4:3 wat als een aanvaardbaar compromis tussen gezichtsveld en constructieve mogelijkheden van een beeldbuis werd aangezien.
Met bovenstaande gegevens kunnen we een aantal dingen afleiden:
De hoekresolutie α0 van het oog is 1,5’ = 0,4 mrad
α 0 = tg (α 0 ) =
Z=
H /Z waaruit volgt dat E
1 1 1 H ∗ = ∗ = 500 E tg (α 0 ) 5 0,4.10− 3
In Europa heeft men gekozen voor 575 ‘zichtbare’ lijnen per beeld. Hierbij moeten nog een aantal ‘onzichtbare’ lijnen bijgeteld worden om de nodige tijd te voorzien voor de vertikale terugslag van de afbuiging, zodat we aan een totaal komen van 625 lijnen per beeldcyclus.
4.1.3 Verticale en horizontale onderdrukking of blanking Voor de lijn- en rasterterugslag is er enige tijd nodig. De lijnblanking, waar er zwart uitgestuurd wordt gedurende 12 μs per 64 μs lijntijd en de rasterblanking, waar er zwart uitgestuurd wordt gedurende 25 lijntijden per 20 ms rastertijd. Dit wil zeggen dat er gedurende 26% van de tijd geen beeldinformatie uitgezonden wordt.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
25
Figuur 18: Lijn- en rasterblanking
4.1.4 Synchronisatie en egalisatie Om de verticale en de horizontale afbuiging te kunnen synchroniseren met de video werden aan de zenderzijde twee synchronisatiesignalen aan het luminantie-signaal toegevoegd als ‘ultrazwart’-impulsen.
Figuur 19: Lijn- en rastersyncpuls
Het begin van iedere lijn wordt aangegeven door een goed gedefinieerde spanningsstoot (lijnsyncpuls) en het begin van ieder raster door een langer durende rastersyncpuls. In onderstaande figuur is een principiële vorm van de verticale syncpuls gegeven voor het oneven en het even raster. Deze voorstelling is echter een grove benadering van de exacte samenstelling en vorm van de syncpulsen.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
26
Vermits de afscheiding van de rasterimpulsen door integratie met een RC-netwerkje gebeurt, blijkt dat de beginlading van de condensator voor beide rasters verschilt, waardoor de rasters neiging hebben om naar elkaar toe te schuiven. Om dit te vermijden, egaliseert men zowel de toestand onmiddellijk vóór als ná de rasterimpulsen door toevoegen van voor- en naegalisatie-impulsen. Dit zijn impulsen met een duur gelijk aan de helft van de normale lijnsyncpulsen en met een dubbele frequentie. Men noemt ze pré- en post-egalisatie impulsen. De volledige synchronisatie-informatie noemt met het “composiet-syncsignaal”.
Figuur 20: Egalisatiepulsen
De horizontale en de verticale syncpulsen moeten van elkaar gescheiden kunnen worden Dit gebeurt op een heel eenvoudige manier. De lijnsyncpulsen zijn veel smaller dan de rastersyncpulsen. Door het signaal aan een differentiator en een integrator te leggen kan dit verschil gedetecteerd worden.
De differentiator zet de smalle lijnsyncpulsen om in positieve en negatieve naaldimpulsjes. De smalle positieve naaldimpulsen treden op bij de voorflank van het syncsignaal. Ze worden gebruikt voor het synchroniseren van de oscillator voor de horizontale afbuiging.
De rastersyncpulsen worden uit het composietsyncsignaal gewonnen door een integrator. De RC-tijdsconstante is zo gekozen dat de smalle lijnsyncpulsen niet in staat zijn om de condensator tot een voldoende hoge spanning op te laden opdat de comparator zou aanspreken. Dit gebeurt wel door de opeenvolgende vijf brede rastersyncpulsen.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
27
Figuur 21: Effect integrerend en differentiërend netwerk
Bij het oneven raster is de verticale syncpuls voorafgegaan door een volle lijntijd. Dit betekent dat de integratorcondensator dus praktisch volledig ontladen is als de integratie van de vijf brede V-syncimpulsen begint. Na een tijd wordt het comparatorniveau bereikt die de terugslag van de verticale afbuiging inluidt.
Bij het even raster is de verticale syncpuls voorafgegaan door een halve lijntijd. De integratorcondensator zal dus nog niet volledig ontladen zijn als de integratie van de vijf brede V-impulsen begint. Dit betekent dus dat in het oneven raster het comparatorniveau iets vroeger bereikt wordt dan in het even raster en dat de verticale terugslag dus iets te vroeg begint. Dit betekent dat de twee geïnterlinieerde rasters niet goed in elkaar vervlochten zijn, en wel zo dat het even raster iets teveel naar onder geschoven is.
Om dit probleem op te lossen wordt de beeldsyncpuls voorzien van een aantal voor- en naegalisatie impulsen. Door de voor-egalisatie impulsen zal de integratorcondensator voor beide rasters praktisch op dezelfde beginspanning staan bij het begin van de vijf brede V-syncpulsen. Het integratieproces van de vijf brede V-syncpulsen zal dus hetzelfde tijdsverloop hebben in de beide rasters en beide rasterhelften zullen dus ook exact even lang duren (212,5 lijntijden). We bekomen dus een perfect geïnterlinieerd beeld.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
28
Door de na-egalisatie-impulsen zal het ontlaadproces bij beide rasters ook op dezelfde manier gebeuren, wat bij de eerste generatie TV’s ook noodzakelijk was voor de goede werking van de verticale synchronisatie. Voor de moderne TV-techniek hebben deze geen belang meer voor de goede interliniëring, maar men is ze in de TV-norm blijven behouden omdat heel wat IC’s via telling van de sync-impulsjes bepaalde impulsvormen genereren tijdens het verticale interval (lengte van de verticale sync-impuls).
Figuur 22: Voor- en na- egalisatiepulsen
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
29
4.1.5 Gelijkstroomherstelling Gelijkstroomherstelling of herstelling van het zwart-niveau betekent in de ontvanger het zwartniveau terugvinden van het beeldsignaal na AC-koppeling.
Zonder gelijkstroomherstelling komen we tot de volgende vaststelling:
Figuur 23: Beeldsignaal zonder gelijkstroomherstelling
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
30
4.1.5.1 Eenvoudige gelijkstroomherstelling Gelijkstroomherstelling kan eenvoudig gebeuren door klemming op het sync-niveau (parallelgelijkrichting).
Figuur 24: Eenvoudige gelijkstroomherstelling
4.1.5.2 Gesleutelde klemming op de ‘achterstoep’ Gelijkstroomherstelling kan eveneens gebeuren door klemming op het zwart-niveau.
Figuur 25: Klemming op de 'achterstoep'
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
31
Figuur 26: Vóór en ná sleuteling
4.1.6 Tijdsconstante van het koppelnetwerk Nemen we een te kleine tijdsconstante, dan hebben we een differentiatie-fout. Nemen we een te grote tijdsconstante, dan hebben we een grote en volumineuze capaciteit.
Figuur 27: Differentiatiefout
Iedere 64μs wordt de gelijkstroomwaarde hersteld, waarbij een differentiatiefout van 1% aanvaardbaar is. Wetende dat de karakteristieke impedantie van een videosysteem 75Ω is, bekomen we een waarde van C > 85μF.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
32
4.2 Kleur videosignaal
4.2.1 Kleurperceptie Wanneer licht op een oppervlakte schijnt, kan het gereflecteerd, geabsorbeerd of doorgelaten worden. De kleur die we zien wordt gedefinieerd door de interactie van het gereflecteerde lichtspectrum met receptoren van ons oog. De receptoren die instaan voor het herkennen van kleuren zijn de kegeltjes.
Omdat er drie verschillende types zijn van receptoren, kunnen alle kleuren die we kunnen zien beschreven worden door coördinaten in een 3D kleurenruimte, welke de relatieve stimulatie van iedere kegel voorstelt. Die coördinaten worden tristimuli waarden genoemd. De tristimuli waarden zijn de sterktes van iedere primaire kleur die gebruikt wordt om één bepaalde kleur te vormen.
Figuur 28: Kleurperceptie
Een tweede factor waar we rekening moeten mee houden is onze ooggevoeligheid. De ooggevoeligheid is afhankelijk van de golflengte van het invallend licht en kan door een curve voorgesteld worden. Ons oog is niet voor iedere kleur even gevoelig. Zo werd ooit vastgesteld dat indien alle spectraalkleuren met dezelfde intensiteit aanwezig zouden zijn, het oog de kleuren uit het geel-groene gebied het helderst waarneemt, terwijl kleuren uit het violette en blauwe gebied donkerder lijken.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
33
4.2.2 Luminantie Om nu uit een kleursignaal informatie te winnen over de helderheid zullen de primaire kleursignalen R, G en B in een bepaalde verhouding moeten worden opgeteld. Het luminantiesignaal kunnen we dus als volgt schrijven:
Y = a× R + b×G + c× B
De coëfficiënten kunnen uit de ooggevoeligheidscurve bepaald worden. Oorspronkelijk diende men rekening te houden dat de fosfors van een kleurentelevisie door een elektronenstraal aan het oplichten gebracht werden bij de volgende golflengten:
Golflengte [Nm]
Helderheidsindruk
Blauw
470
0.17
Groen
535
0.92
Rood
610
0.47
Tabel 5: Coëfficiënten uit de ooggevoeligheidscurve
In die verhoudingen kunnen we stellen dat het niet genormaliseerde helderheidssignaal gelijk is aan
Y ' = 0,47 × R + 0,92 × G + 0,17 × B
De bijdrage van de verschillende primaire kleuren in het helderheidssignaal is dus:
0,47 = 30% 1,57 0,92 = 59% groenbijdrage = 1,57 0,17 blauwbijdrage = = 11% 1,57 roodbijdrage =
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
34
Genormaliseerd kunnen we dus schrijven:
Y = 0,30 × R + 0,59 × G + 0,11 × B
4.2.3 Kleurverzadiging Rood differentiesignaal
R − Y = R − 0,3 × R − 0,95 × G − 0,11 × B = 0,7 × R − 0,59 × G − 0,11 × B
Blauw differentiesignaal
B − Y = B − 0,3 × R − 0,95 × G − 0,11 × B = 0,3 × R − 0,59 × G − 0,89 × B
Groen differentiesignaal
G − Y = G − 0,3 × R − 0,95 × G − 0,11 × B = 0,41 × R − 0,41 × G − 0,11 × B
Praktisch worden alleen de kleurverschilsignalen (R-Y) en (B-Y), en het Y-signaal uitgestuurd. Indien (R-Y) en (B-Y) in hun werkelijke grootte worden uitgestuurd, dan wordt de beelddraaggolf overgemoduleerd. Daarom worden deze signalen t.o.v. het Y-signaal verkleind in de volgende verhoudingen:
U = 0,493 × ( B − Y ) V = 0,877 × ( R − Y )
De kleureninformatie die zich in een composiet video signaal bevindt, wordt volgens de ITUR BT656 standaard gedecodeerd naar de Y, Cb, Cr kleurenruimte. Om kleurbeelden op een PC scherm te brengen, wordt de gebruikelijke RGB kleurenruimte gebruikt. In deze kleurenruimte wordt iedere pixel beschreven door een 8-bit waarde van z’n rode, groene en
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
35
blauwe componenten. Om de YCrCb kleurenruimte om te zetten kunnen we gebruik maken van een eenvoudige conversieformule.
R = 1.164 × (Y − 16) + 1.596 × (Cr − 128) G = 1.164 × (Y − 16) − 0.392 × (Cb − 128) − 0.813 × (Cr − 128) B = 1.164 × (Y − 16) + 2.017 × (Cb − 128)
4.2.4 Kleursynchronisatie Omdat de kleurdraaggolf storingen verwekt bij de beeldweergave en dit vooral bij zwart-wit ontvangers wordt deze onderdrukt. De kleurhulpdraaggolf van 4.43MHz interfereert met de klankmiddenfrequentdrager van 5.5 MHz en vormt een constant stoorpatroon onder de vorm van moiré van 1.07MHz.
Om in de ontvanger de U en V signalen uit het chrominantiesignaal te scheiden, is de kleurdraaggolf nodig. Deze moet in de ontvanger opgewekt worden. Hierbij moet het faseverschil tussen de kleurverschilsignalen en de draaggolf hetzelfde zijn in de zender als in de ontvanger.
Daarom wordt een impulstrein bestaande uit een 10-tal perioden van de kleurdraaggolf op de achterstoep van de lijnsynchronisatieimpuls ingeplant. Deze impuls, ook wel burst, bezit een tijdsduur van ongeveer 2μs en een top tot top waarde van 25% van het totale signaal.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
36
Figuur 29: Burstsignaal
Het burstsignaal synchroniseert de locale oscillator in de ontvanger in fase en in frequentie. Op deze manier kunnen de oorspronkelijke modulatiesignalen U en V uit elkaar gescheiden worden.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
37
4.3 PAL, NTSC
4.3.1 PAL PAL (Phase Alternating Line) is de Europese standaard die wordt gebruikt voor analoge kleurentelevisie-uitzendingen. Het werd ontwikkeld door Walter Bruch in Telefunken, Duitsland. Het formaat zag in 1963 het licht en werd voor het eerst gebruikt in GrootBrittannië en Duitsland in 1967.
Figuur 30: Verspreiding PAL, NTSC en SECAM
Een PAL-televisiebeeld bestaat in Europa uit 576 zichtbare lijnen plus een aantal onzichtbare lijnen, in totaal 625 lijnen per beeld. Er worden 25 van deze beelden per seconde opgebouwd, de lijnfrequentie wordt daarmee 15625 Hz.
De
kleurinformatie
wordt
meegestuurd
als
twee
kleurverschilsignalen
die
in
kwadratuurmodulatie op een hulpdraaggolf zijn gemoduleerd. Op die manier blijft het signaal compatibel met zwartwit televisies. Dergelijke signalen zijn echter niet goed te decoderen als de kleurendraaggolf in de ontvanger ook maar iets in fase verschilt. Dit wordt in PAL opgelost door de fase van het signaal na iedere beeldlijn om te keren en deze met de vorige beeldlijn te vergelijken. Op die manier is er geen fasefout meer, maar hooguit een kleine kleurverzadigingsfout.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
38
PAL beelden zijn geïnterlinieerde beelden. Elk beeld bestaat uit twee halfbeelden of fields die om de beurt worden weergegeven (oneven en even beeldlijnen). Dit zorgt voor een schijnbare 50Hz-beeldfrequentie die rustiger is voor het oog. De 100Hz-techniek die nu nog wordt toegepast, werkt met een buffer waarin het gehele beeld wordt opgeslagen en waarvan de informatie met dubbele snelheid op de beeldbuis wordt weergegeven.
De PAL standaard definieert ook hoe het geluid en de kleurinformatie boven de intensiteitsinformatie worden gemoduleerd.
Sinds het einde van de jaren '70 worden enkele van de bovenste (onzichtbare) lijnen ingezet voor het transport van tekstinformatie, de zogenaamde teletekst.
4.3.2 NTSC NTSC (National Television Standards Committee) wordt voornamelijk in Noord- en ZuidAmerika en Japan gebruikt. Het werd in 1954 geïntroduceerd. De afkorting NTSC wordt voor de grap ook wel Never Twice the Same Colour genoemd, dit omwille van de tekortkomingen in de kleurweergave van het systeem.
De basiswerking van een NTSC en een PAL systeem is vrij gelijkaardig. Beiden maken gebruik van twee kleurverschilsignalen die in kwadratuurmodulatie op een draaggolf zijn gemoduleerd. Het NTSC signaal wordt meestal gecombineerd met de M televisiestandaard, dat wil zeggen: 525 lijnen (waarvan 480 zichtbaar), geïnterlinieerd, 29.97 beelden per seconde en de kleurdraaggolf op 3,58 MHz. Dit geheel wordt ook wel NTSC-M genoemd.
In de digitale wereld betekent NTSC een beeldformaat van 720 x 480 beeldpunten en 29,97 beelden per seconde.
Zoals eerder vermeld, leidt een fout in de fase van de kleurdraaggolf tot een verandering van de weergegeven kleuren. Vooral bij de ontvangst door de vrije ruimte, waarin de looptijd tussen
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
39
zender en ontvanger kan variëren, treden fasefouten op die niet automatisch kunnen worden gecorrigeerd. Vaak kan men de kleur handmatig bijstellen met een tint of hue controller. Nieuwere apparatuur heeft een ingebouwde kleurcorrectie die werkt op een aantal vaste kleuren die in beeldlijn 19 (onzichtbaar) van ieder frame worden uitgezonden: zwart, 50% grijs en huidskleur. Dit principe heet Vertical Interval Reference (VIR).
4.3.3 PAL en NTSC, eigenschappen
4.3.3.1 Basiskarakteristieken Karakteristiek
PAL(B,G)
NTSC (M)
Aantal lijnen per beeld (frame)
625
525
Rasterfrequentie, nominale waarde [raster/s] 50
59,94
Lijnfrequentie fH
15625±0,0001% 15734,264±0,0003%
Aangenomen gamma van het beeldtoestel
2,8
2,2
Nominale video bandbreedte [MHz]
5
4,2
Tabel 6: Basiskarakteristieken PAL en NTSC
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
40
4.3.3.2 Lijnsynchronisatie
Figuur 31: Lijnsynchronisatie
Symbool Karakteristiek
PAL(B,G) NTSC (M)
1
Blanking niveau
0
0
2
Piek wit niveau
100
100
3
Synchronisatieniveau
-43
-40
4
Verschil tussen zwart en blanking niveau
0
7,5±2,5
5
Piek-tot-piek waarde van de burst
43±5
40±4
6
Piek niveau inclusief chrominantie signaal
133
120
H
Nominale lijn periode [μs]
64
63,5555
a
Lijn-blanking interval [μs]
12±0,3
10,9±0,2
b
[μs]
10,5
9,2±10,3
c
Voorstoep [μs]
1,5±0,3
1,27±2,22
d
Synchronisatiepuls [μs]
4,7±0,2
4,7+0,1
e
Stijgtijd van de lijn-blanking puls [μs]
0,3±0,1
≤0,48
f
Stijgtijd van de lijn-synchronisatiepuls [μs] 0,2±0,1
≤0,25
g
Start van de sub-carrier burst [μs]
5,6±0,1
5,3
h
Duur van de sub-carrier burst [μs]
2,25±0,23
2,23 tot 3,11
Tabel 7: Lijnsynchronisatie bij PAL en NTSC
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
41
4.3.3.3 Rastersynchronisatie
Figuur 32: Rastersynchronisatie
Symbool Karakteristiek
PAL
NTSC
v
Raster periode [ms]
20
16,6833
j
Raster-blanking interval
25 H + a (19 tot 21)H + a
j’
Stijgtijd van de raster-blanking puls [μs]
0,3±0,1
≤6,35
k
Interval tussen de voorflank van het
3±2
1,5±0,1
2,5 H
3H
2,5 H
3H
2,5 H
3H
raster-blanking interval en de voorflank van de eerste egalisatiepuls [μs] l
Duur van de eerste sequentie van egalisatiepulsen
m
Duur van de sequentie van egalisatiepulsen
n
Duur van de tweede sequentie van egalisatiepulsen
p
Duur van de egalisatiepulsen [μs]
2,35±0,1 2,3±0,1
q
Duur van de raster synchronisatiepulsen [μs]
27,3
r
Interval tussen raster synchronisatiepulsen [μs] 4,7±0,2
4,7±0,1
s
Stijgtijd van de synchronisatie en
≤0,25
0,2±0,1
27,1
egalisatiepulsen [μs] Tabel 8: Rastersynchronisatie bij PAL en NTSC
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
42
5 Digitale video
5.1 Coderingseigenschappen De video data is overeenkomstig met de ITU-R BT.601 standaard en met de field-blanking definitie uit onderstaande tabel.
V-digital field blanking Field 1
Field 2
F-digital field identification Field 1 Field 2
625 (PAL)
525 (NTSC)
Start (V = 1) Finish (V = 0) Start (V = 1) Finish (V = 0)
Line 624
Line 1
Line 23
Line 20
Line 311
Line 264
Line 336
Line 283
F=0 F=1
Line 1 Line 313
Line 4 Line 266
Tabel 9: Field blanking definitie PAL, NTSC
De signalen F en V veranderen hun status synchroon met het einde van de video timing referentie code aan het begin van de digitale lijn.
De definitie van de nummers van de lijnen is terug te vinden in ITU-R BT 470.
Ontwerpers moeten er van op de hoogte zijn dat de overgang van ‘1’ naar ‘0’ van de V-bit niet noodzakelijk op lijn 20 (283) moet gebeuren.
5.2 Video formaat De datawoorden waarin de 8 meest beduidende bits allemaal op 1 of allemaal op 0 gezet worden, zijn gereserveerd voor data identificatie. Er mogen slechts 254 van de 256 mogelijke 8-bit woorden (of 1016 van de 1024 mogelijke 10-bit woorden) gebruikt worden om een
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
43
bepaalde waarde voor te stellen. Bij de 1024 mogelijke 10-bit woorden zijn er dus 8 woorden gereserveerd voor data identificatie : 11111111XX, 00000000XX (waarbij X = 0,1).
De video data woorden worden onder de vorm van een 27Mwords/s multiplex in volgende volgorde verzonden:
CB, Y, CR, Y, CB, Y, CR, etc
De volgorde van CB, Y, CR verwijst naar luminantie- en kleurverschilsignalen die bij elkaar horen, het volgende woord, Y, beantwoordt aan het volgende luminantie sample.
5.3 Structuur van het interfacesignaal Op onderstaande figuur is te zien hoe de videosample data in de datastroom van de interface gebakken zit. De sample identificatie gebeurt in overeenkomst met de identificatie in ITU-R BT 601A. De samples tussen haakjes zijn voor als er 625 (PAL) in plaats van 525 lijnen (NTSC) zijn.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
44
Last sample of digital active line
Luminance data, Y
Sample data for OH instant
736
718 719 720 721
(732)
First sample of digital active line
857
(863)
0
1
2
360
368 ( 366 )
0
1
Chrominance data, CB
359
360
368 ( 366 )
0
1
CB 359 Y 718 CR 359 Y 719 CB 360 Y 720 CR 360 Y 721
Replaced by digital blanking data
Replaced by timing reference signal
CB 0 Y0 CR 0 Y1
CB 359 Y 718 CR 359 Y 719
Replaced by timing reference signal
Y 855(861) CB 428(431) Y 856(862) CR 428(431) Y 857(863) CB 0 Y0 CR 0 Y1
359
CB 368(366) Y 736(732) CR 368(366)
Chrominance data, CR
Start of active video
End of active video Timing reference signals
Figuur 33: Videosample Data
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
45
5.4 Video timing referentie codes (SAV, EAV) Er zijn twee timing-referentiesignalen, één aan het begin van iedere video datablok en één op het einde van ieder blok. Ze heten respectievelijk SAV (start of active video) en EAV (end of active video).
Ieder timing-referentiesignaal bestaat uit een volgorde van vier woorden, zoals beschreven in volgend formaat: FF 00 00 XY (de waardes worden uitgedrukt volgens de hexadecimale notatie). De FF 00 waarde is gereserveerd voor het gebruik van timing referentiesignalen. De eerste drie woorden zijn een vast voorvoegsel. Het vierde woord omvat informatie die de identificatie van het tweede veld, de status van de field blanking en da status van de line blanking definieert. Het gebruik van de timing-referentiesignalen is omschreven in onderstaande tabel.
Data bit number 9 (MSB) 8 7 6 5 4 3 2 1 (Note 2) 0
First (FF) 1 1 1 1 1 1 1 1 1 1
word Second word Third word Fourth word (00) (00) (XY) 0 0 1 0 0 F 0 0 V 0 0 H 0 0 P3 0 0 P2 0 0 P1 0 0 P0 0 0 0 0 0 0
Tabel 10: Timing-referentiesignalen
Opmerking 1 – De waardes zijn deze die aanbevolen worden voor 10-bit interfaces.
Opmerking 2 – For compatibility with existing 8-bit interfaces, the values of bits D1 and D0 are not defined.
F = ‘0’ gedurende het eerste veld, ‘1’ gedurende veld 2.
V = overal ‘0’, ‘1’ gedurende de field blanking.
H = ‘0’ in SAV, ‘1’ in EAV
P0, P1, P2, P3: protectiebits (zie onderstaande tabel)
MSB: Most Significant Bit
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
46
Tabel 9 definieert de status van de V en de F bits. Onderstaande tabel 11 geeft een mooi overzicht van alle ingestelde bits in hun respectievelijke veld.
Tabel 11: Controlebits
De statussen van P0, P1, P2 en P3 zijn afhankelijk van de status van F, V en H. De protectiebits zorgen er voor dat 1-bit fouten gecorrigeerd worden en 2-bit fouten gedetecteerd kunnen worden.
5.5 Datawoorden gedurende de blanking. De datawoorden die gedurende de digitale blanking intervallen voorkomen, die niet gebruikt worden voor de timing referentiecode of voor aanvullende data, worden gevuld met 80.0h, 10.0h, 80.0h, 10.0h etc.. Dit komt overeen met de blanking level van de CB, Y, CR, Y signalen en wordt volgens die overeenkomst in de gemultiplexte data geplaatst.
5.6 Formaat 4:2:2 naar 4:4:4
5.6.1 Formaat 4:2:2 Binnen dit formaat zijn de Cb- en Cr-matrices in de verticale richting gelijk aan de Y-matrix, in de horizontale richting zijn ze echter de helft. De y-matrix heeft een even aantal samples. Een voorbeeld hiervan zie je in onderstaande figuur.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
47
Figuur 34: 4:2:2-formaat
5.6.2 Formaat 4:4:4 In dit formaat hebben de Cb- en Cr-matrices hetzelfde formaat als die van de Y-matrix. Figuur 35 toont een schematische weergave van de opbouw van een signaal in 4:4:4–formaat.
Figuur 35: 4:4:4-formaat
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
48
5.6.3 Conversie 4:2:2 naar 4:4:4 Voor iedere sample moet er gezorgd worden dat die Y, Cr en Cb informatie bevat. De omzetting van 4:2:2 naar 4:4:4 bestaat er in de data van de vorige Cb- en Cr-sample te onthouden en die bij de Y-samples te zetten die geen CB- en Cr-informatie bevatten. Op die manier hebben zullen er altijd twee samples zijn die gekopieerde Cr- en Cb-data bevatten, wat niet erg is, omdat die toch dicht bij elkaar staan. Op onderstaande figuur is weergegeven wat er precies gebeurt.
Figuur 36: Conversie 4:2:2 naar 4:4:4
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
49
6 Blokschema
Figuur 37: Blokschema code
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
50
7 Blokken
7.1 Pipe line delay
7.1.1 Code
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; library UNISIM; use UNISIM.VComponents.all; entity pipe_line_delay is Port ( clk : in STD_LOGIC; rst : in STD_LOGIC; hsync_in : in STD_LOGIC; vsync_in : in STD_LOGIC; blank_in : in STD_LOGIC; comp_sync_in : in STD_LOGIC; hsync_out : out STD_LOGIC; vsync_out : out STD_LOGIC; blank_out : out STD_LOGIC; comp_sync_out : out STD_LOGIC); end pipe_line_delay; architecture signal pipe0 signal pipe1 signal pipe2 signal pipe3 signal pipe4
Behavioral of pipe_line_delay is : std_logic_vector (3 downto 0); : std_logic_vector (3 downto 0); : std_logic_vector (3 downto 0); : std_logic_vector (3 downto 0); : std_logic_vector (3 downto 0);
begin process (clk,rst) begin if rising_edge(clk) then if (rst = '1') then pipe0 <= "0000"; pipe1 <= "0000"; pipe2 <= "0000"; pipe3 <= "0000"; pipe4 <= "0000"; else pipe0(0) <= hsync_in; pipe0(1) <= vsync_in; pipe0(2) <= blank_in; pipe0(3) <= comp_sync_in; pipe1 pipe2 pipe3 pipe4 end if; end if; end process;
Jelmer Callant | Pieter Huyghe
<= <= <= <=
pipe0; pipe1; pipe2; pipe3;
Realtime Video Processing
51
hsync_out <= pipe4(0); vsync_out <= pipe4(1); blank_out <= pipe4(2); comp_sync_out <= pipe4(3); end Behavioral;
7.1.2 Uitleg Deze VHDL-code zorgt ervoor dat de vier ingangen een vertraging hebben van vier klokpulsen. Dit kan men heel simpel uitvoeren door vijf registers aan te maken en de verschillende ingangen in het eerste register in te laden. Als men dit register in het volgende register plaatst en dit keer op keer tot het vijfde register, zullen de ingangen met vier klokpulsen vertraagd worden wanneer ze naar de equivalente uitgangen worden gestuurd.
7.1.3 Simulatie
Figuur 38: Simulatie pipe_line_delay
De simulatie toont aan dat er inderdaad een vertraging is van 4 klokpulsen ten opzichte van het ingangssignaal.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
52
7.2 Neg_edge_detect
7.2.1 Code
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; library UNISIM; use UNISIM.VComponents.all; entity NEG_EDGE_DETECT is Port ( clk : in STD_LOGIC; data_in : in STD_LOGIC; reset : in STD_LOGIC; one_shot_out : out STD_LOGIC); -- signal will be high for one clock cycle after the input transitions high to low end NEG_EDGE_DETECT; architecture Behavioral of NEG_EDGE_DETECT is signal PRESENT_STATE, NEXT_STATE : STD_LOGIC_VECTOR(1 downto 0); constant START : STD_LOGIC_VECTOR(1 downto 0) := "00"; constant LOW : STD_LOGIC_VECTOR(1 downto 0) := "01"; constant HIGH : STD_LOGIC_VECTOR(1 downto 0) := "10"; begin SEQ: process(clk, reset) begin if (reset='1') then PRESENT_STATE <= START; elsif (clk' event and clk = '1') then PRESENT_STATE <= NEXT_STATE; end if; end process SEQ; COMB: process(data_in,PRESENT_STATE) begin case PRESENT_STATE is when START => if (data_in = '0') then NEXT_STATE <= LOW; else NEXT_STATE <= START; end if; when LOW => NEXT_STATE <= HIGH; when HIGH => if (data_in = '0') then NEXT_STATE <= HIGH; else NEXT_STATE <= START; end if; when others => NEXT_STATE <= START; end case; end process COMB; one_shot_out <= PRESENT_STATE(0); end Behavioral;
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
53
7.2.2 Uitleg De ‘neg_edge_detect’ zorgt ervoor dat er een puls komt op de ‘one_shot_out’ bij elke negative flank van de ‘data_in’. De code is gemaakt in de vorm van een state machine, bestaande uit twee processen. Het eerste proces is het ‘SEQ’ proces met asynchrone reset. De else zorgt ervoor dat de ‘NEXT_STATE’ bij iedere klokpuls wordt doorgeschoven naar de PRESENT_STATE. Het tweede proces is het COMB proces. Hierin zit de state machine, waarin de outputs in de state bits gecodeerd zijn. Dit wil zeggen dat de uitgang (one_shot_out) zal worden gelijk gesteld aan een bit van de PRESENT_STATE. Deze manier van schrijven zorgt ervoor dat er minder logica nodig is om de code te genereren in de FPGA. Op onderstaande figuur zie je de data flow van de state machine.
Reset
Start
Data_in =’0’
High
Low
Data_in =’0’ Figuur 39: Data flow state machine
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
54
7.2.3 Simulatie
Figuur 40: Simulatie Neg_edge_detect
De simulatie toont de goede werking van de state machine. Op iedere dalende flank zal er op de one_shot_out een puls zijn, met de lengte van 1 klokpuls.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
55
7.3 If_decode
7.3.1 Code In dit blok komt het gedigitaliseerde signaal toe die van het VDEC bord komt. Het voornaamste wat hier gebeurt is het uitlezen van de horizontale en verticale synchronisatiepulsen uit de datastroom.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; library UNISIM; use UNISIM.VComponents.all; entity If_decode is Port ( rst : in STD_LOGIC; clk : in STD_LOGIC; YCrCb_in : in STD_LOGIC_VECTOR (9 downto 0); YCrCb_out : out STD_LOGIC_VECTOR (9 downto 0); NTSC_out : out STD_LOGIC; Fo : out STD_LOGIC; Vo : out STD_LOGIC; Ho : out STD_LOGIC); end If_decode; architecture Behavioral of If_decode is signal YCrCb_rg1 : std_logic_vector (9 downto 0); signal YCrCb_rg2 : std_logic_vector (9 downto 0); signal YCrCb_rg3 : std_logic_vector (9 downto 0); signal YCrCb_rg4 : std_logic_vector (9 downto 0); signal YCrCb_rg5 : std_logic_vector (9 downto 0); signal TRS : std_logic; signal H_rg : std_logic_vector (4 downto 0); signal V_rising : std_logic; signal V_falling : std_logic; signal H_rising : std_logic; signal format_count :std_logic_vector (4 downto 0); signal format_count_max : std_logic_vector (4 downto 0); signal Fo_in : std_logic; signal Vo_in : std_logic; signal A,B,C : std_logic;
begin process(clk,rst)
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
56
begin if rising_edge(clk) then if rst = '1' then YCrCb_rg1 <= YCrCb_rg2 <= YCrCb_rg3 <= YCrCb_rg4 <= YCrCb_rg5 <= else YCrCb_rg1 <= YCrCb_rg2 <= YCrCb_rg3 <= YCrCb_rg4 <= YCrCb_rg5 <= end if; end if; end process;
"0000000000"; "0000000000"; "0000000000"; "0000000000"; "0000000000"; YCrCb_in; YCrCb_rg1; YCrCb_rg2; YCrCb_rg3; YCrCb_rg4;
Bovenstaand deel zorgt er voor dat de ingang een vertraging van 4 vier klokpulsen heeft en dus gelijk zal lopen met de synchronisatie-uitgangen.
process(clk,rst) begin if rising_edge(clk) then if (rst = '1') then Fo_in <= '0'; Vo_in <= '0'; H_rg <= "00000"; elsif (TRS = '1') then Fo_in <= YCrCb_rg1(8); Vo_in <= YCrCb_rg1(7); H_rg <= (H_rg(4 downto 1) & YCrCb_rg1(6)); else Fo_in <= Fo_in; Vo_in <= Vo_in; H_rg <= (H_rg(3 downto 0) & H_rg(0)); end if; end if; end process;
In bovenstaande code wordt de detectie van de synchronisatiepulsen verzorgt aan de hand van het TRS signaal.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
57
Onderstaande code heeft als enig doel het video formaat te allen tijde te detecteren door de video lijnen tussen ‘V_rising’ en ‘V_falling’ te tellen. Dit gebeurt gedurende de blankingperiode. Bij NTSC is dit getal 19 en bij PAL bedraagt deze waarde 24.
process(clk,rst) begin if rising_edge(clk) then if rst = '1' then format_count <= "00000"; format_count_max <= "10011"; elsif ((V_rising = '1') AND (H_rising = '1')) then format_count <= "00001"; format_count_max <= format_count_max; elsif ((V_falling = '1') AND (H_rising = '1')) then format_count <= "00001"; format_count_max <= format_count; elsif ((V_rising = '0') AND (H_rising = '1')) then format_count <= format_count + 1; format_count_max <= format_count_max; else format_count <= format_count; format_count_max <= format_count_max; end if; end if; end process;
In onderstaand deel wordt het TRS-signaal (Timing Reference signal) gedetecteerd. Deze waarde wordt ‘1’ wanneer patroon ‘FF 00 00’ gedetecteerd wordt. Na dit stuk volgen de waardes van de synchronisatie-uitgangen. Meer uitleg van deze waarden is terug te vinden in hoofdstuk 5.
A <= '1' when (YCrCb_rg2(9 downto 2) = "00000000") else '0'; B <= '1' when (YCrCb_rg3(9 downto 2) = "00000000") else '0'; C <= '1' when (YCrCb_rg4(9 downto 2) = "11111111") else '0'; Fo <= Fo_in; Vo <= Vo_in; TRS <= A AND B AND C; YCrCb_out <= YCrCb_rg5; Ho <= H_rg(0) OR H_rg(4); H_rising <= H_rg(0) AND (NOT H_rg(1)); V_rising <= (TRS AND YCrCb_rg1(7)) AND (NOT Vo_in); V_falling <= (TRS AND (NOT YCrCb_rg1(7))) AND Vo_in; NTSC_out <= '1' when (format_count_max = "10011") else '0'; end Behavioral;
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
58
7.3.2 Simulatie
Figuur 41: Simulatie If_decode
Het ycrcb_in signaal bestaat uit een start of video (SAV) waarop data volgt. De data is een random gegenereerde bitstroom, daar een realistische video data stroom te veel werk in beslag neemt en in deze simulatie niet opportuun is. Op de simulatie is te zien dat wanneer de datastroom op de uitgang komt fo hoog wordt.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
59
7.4 Vp422_444_dup
7.4.1 code
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; library UNISIM; use UNISIM.VComponents.all; entity vp422_444_dup is Port ( rst : in STD_LOGIC; --Reset and Clock input clk : in STD_LOGIC; --27Mhz for SDTV ycrcb_in : in STD_LOGIC_VECTOR (9 downto 0); --data from the line field decoder ntsc_in : in STD_LOGIC; -- from line field decoder fi : in STD_LOGIC; --"FIELD" bit from Line field decoder vi : in STD_LOGIC; --"VERTICAL BLANK" bit from Line field decoder hi : in STD_LOGIC; --"HORIZONTAL BLANK" bit from Line field decoder ceo : out STD_LOGIC:='0'; --output enable valid out put 1/2 ycrcb_in rate ntsc_out_o : out STD_LOGIC:='0'; --high = NTSC format detected delayed to match 422-444 pipe length fo : out STD_LOGIC:='0'; --high = field one (even) delayed to match 422-444 pipe length vo : out STD_LOGIC:='0'; --high = vertical blank delayed to match 422-444 pipe length ho : out STD_LOGIC:='0'; --low = active video delayed to match 422-444 pipe length y_out : out STD_LOGIC_VECTOR (9 downto 0):="0000000000"; --4:4:4 luma dat cr_out : out STD_LOGIC_VECTOR (9 downto 0):="0000000000"; --4:4:4 chroma data cb_out : out STD_LOGIC_VECTOR (9 downto 0):="0000000000"); --4:4:4 chroma data end vp422_444_dup; architecture Behavioral of vp422_444_dup is signal signal signal signal signal signal signal signal signal signal signal signal signal signal signal signal signal signal signal
state_cnt : STD_LOGIC_VECTOR (1 downto 0):="00"; ycrcb_in_reg : STD_LOGIC_VECTOR (9 downto 0):="0000000000"; pipe_fo : STD_LOGIC_VECTOR (4 downto 0):="00000"; pipe_ntsc : STD_LOGIC_VECTOR (4 downto 0):="00000"; pipe_vo : STD_LOGIC_VECTOR (4 downto 0):="00000"; pipe_ho : STD_LOGIC_VECTOR (4 downto 0):="00000"; Y_rg1 : STD_LOGIC_VECTOR (9 downto 0):="0000000000"; Y_rg2 : STD_LOGIC_VECTOR (9 downto 0):="0000000000"; Y_rg3 : STD_LOGIC_VECTOR (9 downto 0):="0000000000"; Y_rg4 : STD_LOGIC_VECTOR (9 downto 0):="0000000000"; chroma_red_rg1 : STD_LOGIC_VECTOR (9 downto 0):="0000000000"; chroma_red_rg2 : STD_LOGIC_VECTOR (9 downto 0):="0000000000"; chroma_red_rg3 : STD_LOGIC_VECTOR (9 downto 0):="0000000000"; chroma_red_rg4 : STD_LOGIC_VECTOR (9 downto 0):="0000000000"; chroma_blue_rg1 : STD_LOGIC_VECTOR (9 downto 0):="0000000000"; chroma_blue_rg2 : STD_LOGIC_VECTOR (9 downto 0):="0000000000"; chroma_blue_rg3 : STD_LOGIC_VECTOR (9 downto 0):="0000000000"; chroma_blue_rg4 : STD_LOGIC_VECTOR (9 downto 0):="0000000000"; chroma_blue_rg5 : STD_LOGIC_VECTOR (9 downto 0):="0000000000";
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
60
signal signal signal signal signal signal signal signal signal
h_falling : STD_LOGIC:='0'; blanking : STD_LOGIC:='0'; vi_reg : STD_LOGIC:='0'; hi_reg : STD_LOGIC:='0'; ntsc_reg : STD_LOGIC:='0'; fi_reg : STD_LOGIC:='0'; ena_luma_reg : STD_LOGIC:='0'; ena_chroma_red_reg : STD_LOGIC:='0'; ena_chroma_blue_reg : STD_LOGIC:='0';
begin process(clk,rst,h_falling) begin -- create a counter to keep track of the Cb, Y, Cr, Y data stream contents if rising_edge (clk) then if ((rst = '1') OR (h_falling = '1')) then state_cnt <= "00"; else state_cnt <= state_cnt + 1; end if; end if; end process; process(clk,rst) begin -- register the inputs if rising_edge(clk) then if (rst = '1') then vi_reg <= '0'; hi_reg <= '0'; fi_reg <= '0'; ntsc_reg <= '0'; ycrcb_in_reg <= "0000000000"; else vi_reg <= vi; hi_reg <= hi; fi_reg <= fi; ntsc_reg <= ntsc_in; ycrcb_in_reg <= ycrcb_in; end if; end if; end process; process(clk) begin -- pipe line delay F,V,NTSC to match delay of 444 dup if rising_edge (clk) then pipe_vo(4) <= vi_reg; pipe_vo(3 downto 0) <= pipe_vo(4 downto 1); pipe_fo(4) <= fi_reg; pipe_fo(3 downto 0) <= pipe_fo(4 downto 1); pipe_ho(4) <= hi_reg; pipe_ho(3 downto 0) <= pipe_ho(4 downto 1); pipe_ntsc(4) <= ntsc_reg; pipe_ntsc(3 downto 0) <= pipe_ntsc(4 downto 1); end if; end process;
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
61
process(clk,ena_luma_reg) begin -- process the luna data if rising_edge (clk) then if (ena_luma_reg = '1') then 151 Y_rg1 <= ycrcb_in_reg; else Y_rg1 <= Y_rg1; end if; end if; end process; process(clk) begin -- 3 clock delay if rising_edge (clk) then Y_rg2 <= Y_rg1; Y_rg3 <= Y_rg2; Y_rg4 <= Y_rg3; end if; end process; process(clk,rst,ena_chroma_red_reg) begin -- process the Cr data if rising_edge (clk) then if (rst = '1') then chroma_red_rg1 <= "0000000000"; elsif (ena_chroma_red_reg = '1') then chroma_red_rg1 <= ycrcb_in_reg; else chroma_red_rg1 <= chroma_red_rg1; end if; end if; end process; process(clk) begin --3 clock delay if rising_edge (clk) then chroma_red_rg2 <= chroma_red_rg1; chroma_red_rg3 <= chroma_red_rg2; chroma_red_rg4 <= chroma_red_rg3; end if; end process; process(clk,rst) begin -- Process the Cb data if rising_edge(clk) then if rst = '1' then chroma_blue_rg1 <= "0000000000"; elsif (ena_chroma_blue_reg = '1') then chroma_blue_rg1 <= ycrcb_in_reg; else chroma_blue_rg1 <= chroma_blue_rg1; end if; end if; end process;
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
62
process(clk) begin -- 4 clock delay if rising_edge (clk) then chroma_blue_rg2 <= chroma_blue_rg1; chroma_blue_rg3 <= chroma_blue_rg2; chroma_blue_rg4 <= chroma_blue_rg3; chroma_blue_rg5 <= chroma_blue_rg4; end if; end process; h_falling <= (hi_reg AND (NOT hi)); ceo <= (((NOT pipe_ho(0)) AND (NOT pipe_vo(0))) AND ena_luma_reg); ena_luma_reg <= ((state_cnt(0) AND (NOT state_cnt(1))) OR (state_cnt(1) AND state_cnt(0)); ena_chroma_blue_reg <= ((NOT state_cnt(0)) AND (NOT state_cnt(1))); ena_chroma_red_reg <= ((NOT state_cnt(0)) AND (state_cnt(1))); y_out <= Y_rg4; cr_out <= chroma_red_rg3; cb_out <= chroma_blue_rg5; vo <= pipe_vo(0); fo <= pipe_fo(0); ho <= pipe_ho(0); ntsc_out_o <= pipe_ntsc(0); end Behavioral;
7.4.2 Uitleg Dit blok zal er in grote lijnen voor zorgen dat het YCrCb-signaal in zijn verschillende componenten gesplitst wordt en er een 4:2:2 naar 4:4:4 conversie gebeurt.
De volledige uitleg van 4:2:2 en 4:4:4 kan is terug te vinden in hoofdstuk 5. Voor iedere pixel wordt de missende Cr- en Cb- informatie ingevuld. De omzetting kan gemakkelijk bekomen worden door de data van Cr en Cb te kopiëren.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
63
7.4.3 Simulatie
Figuur 42: Simulatie Vp422_444_dup
Deze simulatie werd vooral uitgevoerd om te controleren of er data uit iedere uitgang kwam. Hiervoor is er terug een ingangssignaal(ycrcb_in) gegenereerd met SAV, random video data en EAV . Om de vergelijking te kunnen maken, werd er een identieke simulatie aangemaakt voor de verilog code.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
64
7.5 YCrCb2RGB
7.5.1 Code Ycrcb2rgb verzorgt de omzetting van het 8-bits YCrCb naar een 3 x 8-bits signaal, respectievelijk R, G en B
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; library UNISIM; use UNISIM.VComponents.all; entity ycrcb2rgb is Port ( R : out STD_LOGIC_VECTOR (7 downto 0):="00000000"; G : out STD_LOGIC_VECTOR (7 downto 0):="00000000"; B : out STD_LOGIC_VECTOR (7 downto 0):="00000000"; clk : in STD_LOGIC; rst : in STD_LOGIC; Y : in STD_LOGIC_VECTOR (9 downto 0):="0000000000"; Cr : in STD_LOGIC_VECTOR (9 downto 0):="0000000000"; Cb : in STD_LOGIC_VECTOR (9 downto 0):="0000000000"); end ycrcb2rgb; architecture Behavioral of ycrcb2rgb is signal signal signal signal signal signal signal signal
R_int : std_logic_vector (20 downto 0):="000000000000000000000"; G_int : std_logic_vector (20 downto 0):="000000000000000000000"; B_int : std_logic_vector (20 downto 0):="000000000000000000000"; X_int : std_logic_vector (20 downto 0):="000000000000000000000"; A_int : std_logic_vector (20 downto 0):="000000000000000000000"; B1_int : std_logic_vector (20 downto 0):="000000000000000000000"; B2_int : std_logic_vector (20 downto 0):="000000000000000000000"; C_int : std_logic_vector (20 downto 0):="000000000000000000000";
constant const1 : std_logic_vector --1.164 = 01.00101010 constant const2 : std_logic_vector --1.596 = 01.10011000 constant const3 : std_logic_vector --0.813 = 00.11010000 constant const4 : std_logic_vector --0.392 = 00.01100100 constant const5 : std_logic_vector --2.017 = 10.00000100
(9 downto 0):="0100101010"; (9 downto 0):="0110011000"; (9 downto 0):="0011010000"; (9 downto 0):="0001100100"; (9 downto 0):="1000000100";
signal Y_reg : std_logic_vector (9 downto 0):="0000000000"; signal Cr_reg : std_logic_vector (9 downto 0):="0000000000"; signal Cb_reg : std_logic_vector (9 downto 0):="0000000000"; signal temp1 : std_logic_vector (2 downto 0):="000"; signal temp2 : std_logic_vector (2 downto 0):="000"; signal temp3 : std logic vector (2 downto 0):="000";
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
65
begin process(clk,rst) begin if rising_edge(clk) then if (rst = '1') then Y_reg <= "0000000000"; elsif (Y > "1110101100") then --940 Y_reg <= "1110101100"; elsif (Y < "0001000000") then --64 Y_reg <= "0001000000"; else Y_reg <= Y-350; end if; end if; end process; process(clk,rst) begin if rising_edge(clk) then if (rst = '1') then Cr_reg <= "0000000000"; elsif (Cr > "1111000000") then --960 Cr_reg <= "1111000000"; elsif (Cr < "0001000000") then --64 Cr_reg <= "0001000000"; else Cr_reg <= Cr; end if; end if; end process; process(clk,rst) begin if rising_edge(clk) then if (rst = '1') then Cb_reg <= "0000000000"; elsif (Cb > "1111000000") then --960 Cb_reg <= "1111000000"; elsif (Cb < "0001000000") then --64 Cb_reg <= "0001000000"; else Cb_reg <= Cb; end if; end if; end process;
In bovenstaand stukje code worden grenzen gemaakt waartussen Y, Cr en Cb zich moeten bevinden. Voor Y is dit tussen 64 en 940, voor Cr en Cb is dit tussen 64 en 960.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
66
In het onderstaande stukje code bevindt zich het eerste stuk van de berekening. Hier worden de constanten vermenigvuldigd met een waarde Y, Cr of Cb, waar respectievelijk een waarde 64 of 512 werd afgetrokken.
Doordat alle constanten sowieso positief zijn, plaatsen we er ‘unsigned’ voor. De waardes waarmee de vermenigvuldiging gebeurt, kunnen negatief zijn, vandaar de ‘signed’.
Wanneer het rechterstuk van de bewerking negatief blijkt te zijn, is de MSB ‘1’, wanneer die positief is, is de MSB ‘0’. Door het gebruik van signed bekomen we dus vijf maal een getal van 21 bits.
process (clk,rst) begin if rising_edge(clk) then if (rst = '1') then A_int <= "000000000000000000000"; B1_int <= "000000000000000000000"; B2_int <= "000000000000000000000"; C_int <= "000000000000000000000"; X_int <= "000000000000000000000"; else X_int <= (unsigned(const1) * signed((Y_reg)- 64)); A_int <= (unsigned(const2) * signed((Cr_reg)- 512)); B1_int <= (unsigned(const3) * signed((Cr_reg)- 512)); B2_int <= (unsigned(const4) * signed((Cb_reg)- 512)); C_int <= (unsigned(const5) * signed((Cb_reg)- 512)); end if; end if; end process;
Met deze waarden wordt (zoals in onderstaande code) een tussenwaarde gecreëerd, voor de uiteindelijke berekening van R, G en B.
process (clk,rst) begin if rising_edge(clk) then if (rst = '1') then R_int <= "000000000000000000000"; G_int <= "000000000000000000000"; B_int <= "000000000000000000000"; else R_int <= (X_int) + (A_int); G_int <= (X_int) - (B1_int) - (B2_int); B_int <= (X_int) + (C_int); end if; end if; end process;
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
67
temp1 <= R_int(20 downto 18); temp2 <= G_int(20 downto 18); temp3 <= B_int(20 downto 18); with temp1 select R <= R_int(17 downto "11111111" when "11111111" when "11111111" when "00000000" when
10) when "000", "001", "010", "011", others;
with temp2 select G <= G_int(17 downto "11111111" when "11111111" when "11111111" when "00000000" when
10) when "000", "001", "010", "011", others;
with temp3 select B <= B_int(17 downto "11111111" when "11111111" when "11111111" when "00000000" when end Behavioral;
10) when "000", "001", "010", "011", others;
In bovenstaand stuk wordt gekeken naar de drie MSB’s en wordt er een waarde naar de uitgangen gestuurd.
7.5.2 Simulatie
Figuur 43: Simulatie YCrCb2RGB
In de simulatie merken we de waarden X_int, A_int, enz…Deze waarden zijn in een testfase alleen gebruikt om er voor te zorgen dat de vhdl simulatie overeenstemt met die van verilog.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
68
7.6
Line_buffer
7.6.1 Code
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; library UNISIM; use UNISIM.VComponents.all; entity line_buffer is Port ( read_clk : in STD_LOGIC; read_address : in STD_LOGIC_VECTOR(10 downto 0); read_enable : in STD_LOGIC; read_red_data : out STD_LOGIC_VECTOR(7 downto 0); read_green_data : out STD_LOGIC_VECTOR(7 downto 0); read_blue_data : out STD_LOGIC_VECTOR(7 downto 0); 42 write_clk : in STD_LOGIC; write_address : in STD_LOGIC_VECTOR(10 downto 0); write_enable : in STD_LOGIC; write_red_data : in STD_LOGIC_VECTOR(7 downto 0); write_green_data : in STD_LOGIC_VECTOR(7 downto 0); write_blue_data : in STD_LOGIC_VECTOR(7 downto 0)); end line_buffer; architecture Behavioral of line_buffer is component RAMB16_S9_S9 -- synthesis translate_off generic ( INIT_00 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_01 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_02 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_03 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_04 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_05 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_06 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_07 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_08 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_09 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_0A : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_0B : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_0C : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000";
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
69
INIT_0D : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_0E : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_0F : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_10 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_11 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_12 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_13 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_14 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_15 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_16 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_17 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_18 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_19 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_1A : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_1B : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_1C : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_1D : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_1E : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_1F : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_20 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_21 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_22 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_23 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_24 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_25 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_26 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_27 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_28 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_29 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_2A : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000";
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
70
INIT_2B : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_2C : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_2D : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_2E : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_2F : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_30 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_31 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_32 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_33 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_34 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_35 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_36 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_37 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_38 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_39 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_3A : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_3B : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_3C : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_3D : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_3E : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_3F : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INIT_A : bit_vector := X"0"; INIT_B : bit_vector := X"0"; INITP_00 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INITP_01 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INITP_02 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INITP_03 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INITP_04 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INITP_05 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INITP_06 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000"; INITP_07 : bit_vector := X"0000000000000000000000000000000000000000000000000000000000000000";
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
71
SRVAL_A : bit_vector := X"0"; SRVAL_B : bit_vector := X"0"; WRITE_MODE_A : string := "WRITE_FIRST"; WRITE_MODE_B : string := "WRITE_FIRST"); -- synthesis translate_on port ( DOA : out std_logic_vector (0 downto 0); DOB : out std_logic_vector (7 downto 0); DOPA : out std_logic_vector (0 downto 0); DOPB : out std_logic_vector (0 downto 0); ADDRA : in std_logic_vector (10 downto 0); ADDRB : in std_logic_vector (10 downto 0); CLKA : in std_logic; CLKB : in std_logic; DIA : in std_logic_vector (7 downto 0); DIB : in std_logic_vector (7 downto 0); DIPA : in std_logic_vector (0 downto 0); DIPB : in std_logic_vector (0 downto 0); ENA : in std_logic; ENB : in std_logic; SSRA : in std_logic; SSRB : in std_logic; WEA : in std_logic; WEB : in std_logic); end component; begin RED_DATA_RAM : RAMB16_S9_S9 -- synopsys translate_on port map ( DOA => open, DOB => read_red_data, DOPA => open, DOPB => open, ADDRA => write_address, ADDRB => read_address, CLKA => write_clk, CLKB => read_clk, DIA => write_red_data, DIB => "00000000", DIPA => "0", DIPB => "0", ENA => write_enable, ENB => read_enable, SSRA => '0', SSRB => '0', WEA => '1', WEB => '0'); GREEN_DATA_RAM : RAMB16_s9_s9 -- synopsys translate_on port map ( DOA => open, DOB => read_green_data, DOPA => open, DOPB => open, ADDRA => write_address, ADDRB => read_address, CLKA => write_clk, CLKB => read_clk, DIA => write_green_data, DIB => "00000000", DIPA => "0", DIPB => "0", ENA => write_enable, ENB => read_enable, SSRA => '0', SSRB => '0', WEA => '1', WEB => '0');
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
72
BLUE_DATA_RAM : RAMB16_s9_s9 -- synopsys translate_on port map ( DOA => open, DOB => read_blue_data, DOPA => open, DOPB => open, ADDRA => write_address, ADDRB => read_address, CLKA => write_clk, CLKB => read_clk, DIA => write_blue_data, DIB => "00000000", DIPA => "0", DIPB => "0", ENA => write_enable, ENB => read_enable, SSRA => '0', SSRB => '0', WEA => '1', WEB => '0'); end Behavioral;
7.6.2 Uitleg In bovenstaande code wordt gebruik gemaakt van standaard (dual) BRAM-blokken, wat wil zeggen dat er twee interne geheugens zijn die aan elkaar gekoppeld zijn. Op die manier kan men de data, die elk op een aparte klokfrequentie (13Mhz en 27MHz) toekomt, toch synchroon naar buiten sturen.
7.6.3 Simulatie Hier is er geen simulatie gegenereerd, omdat het niet praktisch haalbaar is een testbench voor deze code te maken. De verschillende signalen moeten hiervoor heel precies getimed worden.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
73
7.7 Special_svga_timing_generation
7.7.1 Code
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; library UNISIM; use UNISIM.VComponents.all; entity SPECIAL_SVGA_TIMING_GENERATION is Port ( pixel_clock: in STD_LOGIC; -- pixel clock reset: in STD_LOGIC; -- reset h_synch_delay: out STD_LOGIC; -- horizontal synch for VGA connector v_synch_delay: out STD_LOGIC; -- vertical synch for VGA connector comp_synch: out STD_LOGIC; -- composite synch for DAC blank: out STD_LOGIC; -- composite blanking char_line_count: out STD_LOGIC_VECTOR(2 downto 0); -- line counter for char gen rom char_address: out STD_LOGIC_VECTOR(13 downto 0); -- character mode address char_pixel: out STD_LOGIC_VECTOR(2 downto 0); -- pixel position within the character pixel_count: out STD_LOGIC_VECTOR(10 downto 0));- counts the pixels in a line end SPECIAL_SVGA_TIMING_GENERATION; architecture Behavioral of SPECIAL_SVGA_TIMING_GENERATION is -- DEFINE THE VARIOUS PIPELINE DELAYS constant ZBT_PIPELINE_DELAY : STD_LOGIC_VECTOR(9 downto 0) := "0000000000"; -not required for XUP-V2Pro constant ZBT_INTERFACE_DELAY : STD_LOGIC_VECTOR(9 downto 0) := "0000000000"; - not required for XUP-V2Pro constant CHARACTER_DECODE_DELAY : STD_LOGIC_VECTOR(9 downto 0) := "0000000100"; -- not required for XUP-V2Pro -- 720 X 480 @ 60Hz with a 27MHz pixel clock for NTSC video capture constant H_ACTIVE : STD_LOGIC_VECTOR(9 downto 0) := "1011010000"; --720 pixels constant H_FRONT_PORCH : STD_LOGIC_VECTOR(9 downto 0) := "0000000111"; --7 pixels constant H_SYNC : STD_LOGIC_VECTOR(9 downto 0) := "0000111110"; --62 pixels constant H_BACK_PORCH : STD_LOGIC_VECTOR(9 downto 0) := "0001000101"; --69 pixels constant H_TOTAL : STD_LOGIC_VECTOR(9 downto 0) := "1101011010"; --858 pixels constant V_ACTIVE : STD_LOGIC_VECTOR(9 downto 0):= "0111100111"; --487 lines 1constant V_FRONT_PORCH : STD_LOGIC_VECTOR(9 downto 0):= "0000000100"; --4 lines constant V_SYNC: STD_LOGIC_VECTOR(9 downto 0):= "0000000100"; --4 lines
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
74
constant V_BACK_PORCH : STD_LOGIC_VECTOR(9 downto 0):= "0000011110"; --30 lines constant V_TOTAL : STD_LOGIC_VECTOR(9 downto 0) := "1000001101"; --525 lines signal line_count : STD_LOGIC_VECTOR(9 downto 0) := "0000000000"; -- counts the display lines signal h_synch : STD_LOGIC; -- horizontal synch signal v_synch : STD_LOGIC; -- vertical synch signal h_synch_delay0 : STD_LOGIC; -- h_synch delayed 1 clock signal v_synch_delay0 : STD_LOGIC; -- v_synch delayed 1 clock signal h_c_synch : STD_LOGIC; -- horizontal component of comp synch signal v_c_synch : STD_LOGIC; -- vertical component of comp synch signal h_blank : STD_LOGIC; -- horizontal blanking signal v_blank : STD_LOGIC; -- vertical blanking signal char_count : STD_LOGIC_VECTOR(16 downto 0); -- a counter used to define the character block number signal line_start_address : STD_LOGIC_VECTOR(16 downto 0); -- register to store the starting character number for a line of chars signal reset_char_count : STD_LOGIC; -- flag to reset the character count during VBI signal hold_char_count : STD_LOGIC; -- flag to hold the character count during HBI signal pixel_count_in : STD_LOGIC_VECTOR(10 downto 0); --intern pixel_count signaal signal char_line_count_in : STD_LOGIC_VECTOR(2 downto 0):= "000"; --intern char_line_count signaal signal char_pixel_in : STD_LOGIC_VECTOR(2 downto 0); --intern char_pixel signaal begin -- create the horizontal line pixel counter process (reset,pixel_clock) begin if rising_edge(pixel_clock) then if reset = '1' then pixel_count_in <= "00000000000"; -- on reset set pixel counter to 0 elsif (pixel_count_in = (H_TOTAL - 1)) then pixel_count_in <= "00000000000"; -- reset pixel counter else pixel_count_in <= pixel_count_in + 1; end if; end if; end process; -- create the horizontal synch pulse process(reset,pixel_clock) begin if rising_edge(pixel_clock) then if reset = '1' then h_synch <= '0'; -- remove of h_synch elsif (pixel_count_in = (H_ACTIVE + H_FRONT_PORCH - 1)) then h_synch <= '1'; -- start of h_synch elsif (pixel_count_in = (H_TOTAL - H_BACK_PORCH - 1)) then h_synch <= '0'; -- end of h_synch end if; end if; end process;
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
75
-- CREATE THE VERTICAL FRAME LINE COUNTER process (reset,pixel_clock) begin if rising_edge(pixel_clock) then if reset = '1' then line_count <= (V_TOTAL - "0000100001"); elsif ((line_count = (V_TOTAL - 1)) and (pixel_count_in = (H_TOTAL - 1))) then line_count <= "0000000000"; -- last pixel in last line of frame - reset line counte elsif (pixel_count_in = (H_TOTAL - 1)) then line_count <= line_count +1; -- last pixel but not last line - increment line coun end if; end if; end process; -- CREATE THE VERTICAL SYNCH PULSE process (reset,pixel_clock) begin if rising_edge(pixel_clock) then if reset = '1' then v_synch <= '0'; -- remove v_synch elsif ((line_count = (V_ACTIVE + V_FRONT_PORCH - 1)) and (pixel_count_in = (H_TOTAL - 1)))then v_synch <= '1'; -- start of v_synch elsif ((line_count = (V_TOTAL - V_BACK_PORCH - 1)) and (pixel_count_in = (H_TOTAL - 1))then v_synch <= '0'; -- end of v_synch end if; end if; end process; -- ADD TWO PIPELINE DELAYS TO THE SYNCHs COMPENSATE FOR THE DAC PIPELINE DELAY process (reset,pixel_clock) begin if rising_edge(pixel_clock) then if reset = '1' then h_synch_delay0 <= '0'; v_synch_delay0 <= '0'; h_synch_delay <= '0'; v_synch_delay <= '0'; else h_synch_delay0 <= h_synch; v_synch_delay0 <= v_synch; h_synch_delay <= h_synch_delay0; v_synch_delay <= v_synch_delay0; end if; end if; end process; --CREATE THE HORIZONTAL BLANKING SIGNAL --the "-2" is used instead of "-1" because of the extra register delay --for the composite blanking signal process (reset,pixel_clock) begin if rising_edge(pixel_clock) then if reset = '1' then h_blank <= '0'; -- remove the h_blank elsif (pixel_count_in = (H_ACTIVE - 2)) then h_blank <= '1'; elsif (pixel_count_in = (H_TOTAL - 2)) then h_blank <= '0'; end if; end if; end process;
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
76
--CREATE THE VERTICAL BLANKING SIGNAL --the "-2" is used instead of "-1" in the horizontal factor because of the extra register delay for the composite blanking signal process (reset,pixel_clock) begin if rising_edge(pixel_clock) then if reset = '1' then v_blank <= '1'; -- the FIELD bit that resets the counters transitions during V_BLANK elsif ((line_count = (V_ACTIVE - 1)) and (pixel_count_in = (H_TOTAL - 2))) then v_blank <= '1'; -- start of VBI elsif ((line_count = (V_TOTAL - 1)) and (pixel_count_in = (H_TOTAL - 2))) then v_blank <= '0'; -- end of VBI end if; end if; end process; -- CREATE THE COMPOSITE BLANKING SIGNAL process (reset,pixel_clock) begin if rising_edge(pixel_clock) then if reset = '1' then blank <= '0'; elsif ((h_blank = '1') or (v_blank = '1')) then blank <= '1'; else blank <= '0'; end if; end if; end process; --CREATE THE HORIZONTAL COMPONENT OF COMP SYNCH --the "-2" is used instead of "-1" because of the extra register delay --for the composite synch process (reset,pixel_clock) begin if rising_edge(pixel_clock) then if reset = '1' then h_c_synch <= '0'; -- remove h_c_synch elsif (pixel_count_in = (H_ACTIVE + H_FRONT_PORCH - 2)) then h_c_synch <= '1'; -- start of h_c_synch elsif (pixel_count_in = (H_TOTAL - H_BACK_PORCH - 2)) then h_c_synch <= '0'; -- end of h_c_synch end if; end if; end process; -- CREATE THE VERTICAL COMPONENT OF COMP SYNCH process (reset,pixel_clock) begin if rising_edge(pixel_clock) then if reset = '1' then v_c_synch <= '0'; -- remove v_c_synch elsif ((line_count = (V_ACTIVE + V_FRONT_PORCH - 1)) and (pixel_count_in = (H_TOTAL - 2))) then v_c_synch <= '1'; -- start of v_c_synch elsif ((line_count = (V_TOTAL - V_BACK_PORCH - 1)) and (pixel_count_in = (H_TOTAL – 2))) then v_c_synch <= '0'; -- end of v_c_synch end if; end if; end process;
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
77
--CREATE THE COMPOSITE SYNCH SIGNAL process (reset,pixel_clock) begin if rising_edge(pixel_clock) then if reset = '1' then comp_synch <= '0'; -- remove comp_synch else comp_synch <= (v_c_synch xor h_c_synch); end if; end if; end process; --CREATE THE VERTICAL FRAME LINE COUNTER process (reset,pixel_clock) begin if rising_edge(pixel_clock) then if reset = '1' then char_line_count_in <= "000"; -- on reset set line counter to 0 elsif ((line_count = (V_TOTAL - 1)) and (pixel_count_in = ((H_TOTAL - 1) - CHARACTER_DECODE_DELAY))) then char_line_count_in <= "000"; -- reset line counter elsif (pixel_count_in = ((H_TOTAL - 1) - CHARACTER_DECODE_DELAY)) then char_line_count_in <= (line_count(2 downto 0) + 1); -- increment line counter end if; end if; end process; process (reset,pixel_clock) begin if rising_edge(pixel_clock) then if reset = '1' then char_count <= "00000000000000000"; line_start_address <= "00000000000000000"; elsif (reset_char_count = '1') then -- reset the char count during the VBI char_count <= "00000000000000000"; line_start_address <= "00000000000000000"; elsif (hold_char_count = '0') then char_count <= char_count + 1; line_start_address <= line_start_address; else -- hold the character counter during the HBI if (char_line_count_in = "111") then -- last line in the character block char_count <= char_count; line_start_address <= char_count; -- update the line start address else char_count <= line_start_address; -- restore the line start address line_start_address <= line_start_address; end if; end if; end if; end process;
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
78
-- char_pixel defines the pixel within the character line process (reset,pixel_clock) begin if rising_edge(pixel_clock) then if (reset = '1') then char_pixel_in <= "101"; -- reset to 5 so that the first character data can be latch elsif (pixel_count_in = ((H_TOTAL - 1) - CHARACTER_DECODE_DELAY)) then char_pixel_in <= "101"; -- reset to 5 so that the first character data can be latch else char_pixel_in <= char_pixel_in + 1; end if; end if; end process; -- CREATE THE CONTROL SIGNALS FOR THE CHARACTER ADDRESS COUNTER --- The HOLD and RESET signals are advanced from the beginning and end -- of HBI and VBI to compensate for the internal character generation -- pipeline. process (reset,pixel_clock) begin if rising_edge(pixel_clock) then if reset = '1' then reset_char_count <= '0'; elsif ((line_count = (V_ACTIVE - 1)) and (pixel_count_in = ((H_ACTIVE - 1) - CHARACTER_DECODE_DELAY))) then reset_char_count <= '1'; -- start of VBI elsif ((line_count = (V_TOTAL - 1)) and (pixel_count_in = ((H_TOTAL - 1) - CHARACTER_DECODE_DELAY))) then reset_char_count <='0'; -- end of VBI end if; end if; end process; process (reset,pixel_clock) begin if rising_edge(pixel_clock) then if reset = '1' then hold_char_count <= '0'; elsif (pixel_count_in = ((H_ACTIVE - 1) CHARACTER_DECODE_DELAY)) then hold_char_count <= '1'; -- start of HBI elsif (pixel_count_in = ((H_TOTAL - 1) - CHARACTER_DECODE_DELAY )) then hold_char_count <= '0'; end if; end if; end process;
7.7.2 Uitleg In de special_svga_timing_generation wordt er hoofdzakelijk voor synchronisatiesignalen en een pixelcount gezorgd. Deze laatste wordt gebruikt door de line_buffer module. De andere uitgangen die in bovenstaande code gecreëerd worden, kunnen gebruikt worden om karakters op een scherm te tonen. De special_svga_timing_generation-module bezit slechts twee ingangen: een klok (27MHz) en een reset. Jelmer Callant | Pieter Huyghe
Realtime Video Processing
79
De reset wordt zowel door de globale reset, als door de neg_edge_detect-module aangestuurd, waardoor de special_svga_timing_generation op regelmatige basis gereset wordt. Op die manier wordt er voor gezorgd dat dit stuk code synchroon loopt met de rest van de gegenereerde signalen. De synchronisatie-uitgangen worden via de pipe_line_delay naar de uitgang gebracht.
7.7.3 Simulatie
Figuur 44: Simulatie special_vga_timing_generation
Ook hier werd de bekomen simulatie vergeleken met de simulatie van de Verilog code. 100% zeker is men hier nooit, daar je een simulatie zou moeten doen over een tijdspanne van 20ms om de v_synch_delay ‘hoog’ te laten worden.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
80
7.8 Video Capture
7.8.1 Code
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; library UNISIM; use UNISIM.VComponents.all; entity video_capture is Port ( YCrCb_in : in STD_LOGIC_VECTOR (9 downto 2); LLC_CLOCK : in STD_LOGIC; R : out STD_LOGIC_VECTOR (7 downto 0); G : out STD_LOGIC_VECTOR (7 downto 0); B : out STD_LOGIC_VECTOR (7 downto 0); PIXEL_CLOCK : out STD_LOGIC; H_SYNC_Z : out STD_LOGIC; V_SYNC_Z : out STD_LOGIC; BLANK_Z : out STD_LOGIC; COMP_SYNC : out STD_LOGIC :='0'; RESET_VDEC1_Z : out STD_LOGIC :='1'; VDEC1_OE_Z : out STD_LOGIC :='0'; VDEC1_PWRDN_Z : out STD_LOGIC :='1'; system_dcm_locked : in STD_LOGIC); end video_capture; architecture Behavioral of video_capture is --declaren van de verschillende signalen signal write_address_sig : std_logic_vector (10 downto 0); signal read_enable_lb0 : std_logic; signal write_enable_lb0 : std_logic; signal crop : std_logic; signal h_synch_delay_sig : std_logic; signal v_synch_delay_sig : std_logic; signal comp_synch_sig : std_logic; signal blank_sig : std_logic; signal rst_sig : std_logic; signal Fo_422 : std_logic; signal Vo_422 : std_logic; signal Ho_422 : std_logic; signal Fi_422 : std_logic; signal Vi_422 : std_logic; signal Hi_422 : std_logic; signal Fo_444 : std_logic; signal Vo_444 : std_logic; signal Ho_444 : std_logic; signal ceo_444 : std_logic; signal YCrCb_out_422 : std_logic_vector (9 downto 0); signal YCrCb_in_422 : std_logic_vector (9 downto 0); signal Y_out_444 : std_logic_vector (9 downto 0); signal Cr_out_444 : std_logic_vector (9 downto 0); signal Cb_out_444 : std_logic_vector (9 downto 0); signal Y_in_444 : std_logic_vector (9 downto 0); signal Cr_in_444 : std_logic_vector (9 downto 0);
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
81
signal Cb_in_444 : std_logic_vector (9 downto 0); signal Red : std_logic_vector (7 downto 0); signal Green : std_logic_vector (7 downto 0); signal Blue : std_logic_vector (7 downto 0); signal hsync : std_logic; --is niet gebruikt in de file signal vsync : std_logic; --is niet gebruikt in de file signal hblank : std_logic; signal clock_27 : std_logic; signal clk_27 : std_logic; signal clk_13 : std_logic; signal clock_13 : std_logic; signal clock_40 : std_logic; signal clk_40 : std_logic; signal system_dcm_rst : std_logic; constant low : std_logic :='0'; constant high : std_logic :='1'; signal pixel_count_sig : std_logic_vector (10 downto 0); signal read_enable_lb1 : std_logic; signal write_enable_lb1 : std_logic; signal write_red_data : std_logic_vector (7 downto 0); signal write_green_data : std_logic_vector (7 downto 0); signal write_blue_data : std_logic_vector (7 downto 0); signal read_red_data_lb0 : std_logic_vector (7 downto 0); signal read_green_data_lb0 : std_logic_vector (7 downto 0); signal read_blue_data_lb0 :std_logic_vector (7 downto 0); signal read_red_data_lb1 : std_logic_vector (7 downto 0); signal read_green_data_lb1 : std_logic_vector (7 downto 0); signal read_blue_data_lb1 :std_logic_vector (7 downto 0); signal one_shot_out_sig : std_logic; signal reset_timing_gen : std_logic; signal char_line_count_sig : std_logic_vector (2 downto 0); signal char_address_sig : std_logic_vector (13 downto 0); signal char_pixel_sig : std_logic_vector (2 downto 0); signal hsync_in_sig : std_logic; signal vsync_in_sig : std_logic; signal blank_in_sig : std_logic; signal comp_synch_in : std_logic; signal hsync_out_sig : std_logic; signal vsync_out_sig : std_logic; signal blank_out_sig : std_logic; signal comp_synch_out : std_logic; signal NTSC_out_sig : std_logic; signal concat_YCrCb_in : std_logic_vector (9 downto 0); signal ntsc_out_o_sig: std_logic; constant COMP_SYNC_intern : STD_LOGIC :='0'; constant RESET_VDEC1_Z_in : STD_LOGIC :='1'; constant VDEC1_OE_Z_in : STD_LOGIC :='0'; constant VDEC1_PWRDN_Z_in : STD_LOGIC :='1'; signal clk_27_invert : std_logic; --------------------------------------------------------------------------Inladen van de verschillende files ------------------------------------------------------------------------component IBUFG is port ( O : out std_logic; I : in std_logic); end component;
component BUFG is port ( O : out std_logic; I : in std_logic);
end component;
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
82
component OFDDRRSE port ( Q : out STD_ULOGIC; --Data output (connect directly to top-level port) C0 : in STD_ULOGIC; -- 0 degree clock input C1 : in STD_ULOGIC; -- 180 degree clock input CE : in STD_ULOGIC; -- Clock enable input D0 : in STD_ULOGIC; -- Posedge data input D1 : in STD_ULOGIC; -- Negedge data input R : in STD_ULOGIC; -- Synchronous reset input S : in STD_ULOGIC); -- Synchronous preset input end component; --instantiate the line field decoder this extracts the H,V,F bits from --the timing reference codes component If_decode is port ( rst : in STD_LOGIC; clk : in STD_LOGIC; YCrCb_in : in STD_LOGIC_VECTOR (9 downto 0); YCrCb_out : out STD_LOGIC_VECTOR (9 downto 0); NTSC_out : out STD_LOGIC; Fo : out STD_LOGIC; Vo : out STD_LOGIC; Ho : out STD_LOGIC); end component; --convert from 4:2:2 data to 4:4:4 data component vp422_444_dup is port ( rst : in STD_LOGIC; --Reset and Clock input clk : in STD_LOGIC; --27Mhz for SDTV ycrcb_in : in STD_LOGIC_VECTOR (9 downto 0); --data from the line field decoder ntsc_in : in STD_LOGIC; -- from line field decoder fi : in STD_LOGIC; --"FIELD" bit from Line field decoder vi : in STD_LOGIC; --"VERTICAL BLANK" bit from Line field decoder hi : in STD_LOGIC; --"HORIZONTAL BLANK" bit from Line field decoder ceo : out STD_LOGIC; --output enable valid out put 1/2 ycrcb_in rate ntsc_out_o : out STD_LOGIC; --high = NTSC format detected delayed to match 422-444 pipe length fo : out STD_LOGIC; --high = field one (even) delayed to match 422-444 pipe length vo : out STD_LOGIC; --high = vertical blank delayed to match 422-444 pipe length ho : out STD_LOGIC; --low = active video delayed to match 422-44 pipe length y_out : out STD_LOGIC_VECTOR (9 downto 0); --4:4:4 luma data cr_out : out STD_LOGIC_VECTOR (9 downto 0); --4:4:4 chroma data cb_out : out STD_LOGIC_VECTOR (9 downto 0)); --4:4:4 chroma data end component; --Instantiate the color space converter. component ycrcb2rgb is port ( R : out STD_LOGIC_VECTOR (7 downto 0); G : out STD_LOGIC_VECTOR (7 downto 0); B : out STD_LOGIC_VECTOR (7 downto 0); clk : in STD_LOGIC; rst : in STD_LOGIC; Y : in STD_LOGIC_VECTOR (9 downto 0); Cr : in STD_LOGIC_VECTOR (9 downto 0); Cb : in STD_LOGIC_VECTOR (9 downto 0)); end component;
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
83
component line_buffer is port ( read_clk : in std_logic; read_address : in std_logic_vector (10 downto 0); read_enable : in std_logic; read_red_data : out std_logic_vector (7 downto 0); read_green_data : out std_logic_vector (7 downto 0); read_blue_data : out std_logic_vector (7 downto 0); write_clk : in std_logic; write_address : in std_logic_vector (10 downto 0); write_enable : in std_logic; write_red_data : in std_logic_vector (7 downto 0); write_green_data :in std_logic_vector (7 downto 0); write_blue_data : in std_logic_vector (7 downto 0)); end component; --INSTANTIATE A ONE SHOT TO DETECT THE FALLING EDGS OF THE FIELD --BIT IN THE TIMING REFERENCE CODE. THIS PULSE RESETS THE --SVGA TIMING GENERATION MODULE TO SYNCH THE OUTPUT VIDEO WITH --THE VIDEO SOURCE component NEG_EDGE_DETECT is port ( clk : in STD_LOGIC; data_in : in STD_LOGIC; reset : in STD_LOGIC; one_shot_out : out STD_LOGIC); end component; --Instantiate the svga timing generation module component SPECIAL_SVGA_TIMING_GENERATION is port ( pixel_clock : in std_logic; --pixel clock reset : in std_logic; --reset h_synch_delay : out std_logic; --horizontal synch for VGA connector v_synch_delay : out std_logic; --vertical synch for VGA connector comp_synch : out std_logic; --composite synch for DAC blank : out std_logic; --composite blanking char_line_count: out std_logic_vector (2 downto 0); --line counter for char gen rom char_address : out std_logic_vector (13 downto 0); --character mode address char_pixel : out std_logic_vector (2 downto 0); --pixel position within the character pixel_count : out std_logic_vector (10 downto 0)); --counts the pixels in a line end component; --align the syncs and blank with the video data component pipe_line_delay is port ( clk : in STD_LOGIC; rst : in STD_LOGIC; hsync_in : in STD_LOGIC; vsync_in : in STD_LOGIC; blank_in : in STD_LOGIC; comp_sync_in : in STD_LOGIC; hsync_out : out STD_LOGIC; vsync_out : out STD_LOGIC; blank_out : out STD_LOGIC; comp_sync_out : out STD_LOGIC); end component;
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
84
begin --Instantiate two video line buffers. These line buffers switch form read --to write at the end of each horizontal blanking interval. --toggle the line buffer on each Ho_444 (the start of the HBI) process(Ho_444,rst_sig) begin if rising_edge(Ho_444) then if (rst_sig = '1') then read_enable_lb0 <= '0'; write_enable_lb0 <= '1'; else read_enable_lb0 <= not read_enable_lb0; write_enable_lb0 <= not write_enable_lb0; end if; end if; end process; process(clk_13,Ho_444) begin if rising_edge(clk_13) then if (Ho_444 = '1') then write_address_sig <= "00000000000"; else write_address_sig <= write_address_sig + 1; end if; end if; end process; process(clk_27,rst_sig) begin --crop the first and last pixels of the line do to line count differences if rising_edge(clk_27) then if (rst_sig = '1') then crop <= '1'; elsif (pixel_count_sig < "00000000101") then crop <= '1'; elsif (pixel_count_sig > "01011001010") then --1011001010 crop <= '1'; else crop <= '0'; end if; end if; end process;
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
85
process(clk_27,rst_sig) begin --create a mux for the line buffer outputs if rising_edge(clk_27) then if (rst_sig = '1') then R <= "00000000"; G <= "00000000"; B <= "00000000"; elsif (crop = '1') then R <= "00000000"; G <= "00000000"; B <= "00000000"; elsif (read_enable_lb0 = '1') then R <= read_red_data_lb0; G <= read_green_data_lb0; B <= read_blue_data_lb0; else R <= read_red_data_lb1; G <= read_green_data_lb1; B <= read_blue_data_lb1; end if; end if; end process; --declaraties van de verschillende bestanden LLC_INPUT_BUF : IBUFG port map (clk_27, LLC_CLOCK); CLK_13MHZ_BUF : BUFG port map (clk_13, ceo_444); PIXEL_CLOCK_DDR_FF : OFDDRRSE port map (PIXEL_CLOCK, clk_27, clk_27_invert, high, low, high, reset_timing_gen, low); If_decode_i : If_decode port map (rst_sig,clk_27,concat_YCrCb_in, YCrCb_out_422,NTSC_out_sig,Fo_422,Vo_422,Ho_422); vp422_444_dup_i : vp422_444_dup port map (rst_sig,clk_27,YCrCb_in_422, NTSC_out_sig,Fi_422,Vi_422,Hi_422,ceo_444,ntsc_out_o_sig,Fo_444,Vo_444, Ho_444,Y_out_444,Cr_out_444,Cb_out_444); YCrCb2RGB_i : ycrcb2rgb port map (Red,Green,Blue,clk_13,rst_sig, Y_in_444,Cr_in_444,Cb_in_444); LB0 : line_buffer port map (clk_27,pixel_count_sig,read_enable_lb0, read_red_data_lb0,read_green_data_lb0,read_blue_data_lb0,clk_13, write_address_sig,write_enable_lb0,write_red_data,write_green_data, write_blue_data); LB1 : line_buffer port map (clk_27,pixel_count_sig,read_enable_lb1, read_red_data_lb1,read_green_data_lb1,read_blue_data_lb1,clk_13, write_address_sig,write_enable_lb1,write_red_data,write_green_data, write_blue_data); neg_edge_detect_i : NEG_EDGE_DETECT port map (clk_27,Fo_444,rst_sig, one_shot_out_sig); special_svga_timing_generation_i : SPECIAL_SVGA_TIMING_GENERATION port map(clk_27,reset_timing_gen,h_synch_delay_sig,v_synch_delay_sig, comp_synch_sig,blank_sig,char_line_count_sig,char_address_sig, char_pixel_sig,pixel_count_sig); pipe_line_delay_i : pipe_line_delay port map(clk_27,rst_sig,hsync_in_sig, vsync_in_sig,blank_in_sig,comp_synch_in,hsync_out_sig,vsync_out_sig, blank_out_sig,comp_synch_out);
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
86
--verschillende assignments Fi_422 <= Fo_422; Vi_422 <= Vo_422; Hi_422 <= Ho_422; YCrCb_in_422 <= YCrCb_out_422; Y_in_444 <= Y_out_444; Cr_in_444 <= Cr_out_444; Cb_in_444 <= Cb_out_444; H_SYNC_Z <= hsync_out_sig; V_SYNC_Z <= vsync_out_sig; BLANK_Z <= NOT blank_out_sig; rst_sig <= NOT system_dcm_locked; write_red_data <= Red; write_green_data <= Green; write_blue_data <= Blue; reset_timing_gen <= (rst_sig OR one_shot_out_sig); hsync_in_sig <= h_synch_delay_sig; vsync_in_sig <= v_synch_delay_sig; blank_in_sig <= blank_sig; comp_synch_in <= comp_synch_sig ; concat_YCrCb_in <= (YCrCb_in(9 downto 2) & "00"); read_enable_lb1 <= NOT read_enable_lb0; write_enable_lb1 <= NOT write_enable_lb0; clk_27_invert <= NOT clk_27; end Behavioral;
7.8.2 Uitleg De video_capture-module is de topmodule van het volledige programma. Hierin vindt de declaratie plaats van de verschillende componenten (hier zijn dat er 7). In het tweede deel van het programma is nog wat logica toegevoegd om de verschillende componenten intern aan mekaar te linken. Ook de port-mapping gebeurt in bovenstaand programma.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
87
8 Problemen en aanpak
8.1 Conversie van Verilog naar VHDL Bij het omzetten van de oorspronkelijke Verilog-code was het niet altijd eenvoudig om deze om te vormen naar een juiste vhdl-code. In Verilog zijn er veel mogelijkheden en structuren om routines in zeer weinig code uit te voeren. De problematiek wordt hieronder in een tweetal voorbeelden geschetst.
8.1.1 Voorbeeld 1
8.1.1.1 Verilog assign TRS = ((~|YCrCb_rg2[9:2]) & (~|YCrCb_rg3[9:2]) & (&YCrCb_rg4[9:2]));
In bovenstaande regel wordt er een AND-poort met drie ingangen gemaakt. Die drie ingangen bestaan uit een NOR-, of AND- bewerking van de verschillende YCrCb_rg-signalen.
8.1.1.2 VHDL De code hiervoor is wat complexer, omdat er geen functies als ~| of & bestaan in VHDL. Eerst werd er geopteerd om die code te verwerken aan de hand van verschillende tussensignalen die dan aan elkaar werden gekoppeld. Deze manier was echter nogal omslachtig en omvatte relatief veel code. Na enig zoekwerk werd er beknopter geprogrammeerd onder de vorm van onderstaande code.
A <= '1' B <= '1' C <= '1' TRS <= A
when (YCrCb_rg2(9 downto 2) = "00000000") else '0'; when (YCrCb_rg3(9 downto 2) = "00000000") else '0'; when (YCrCb_rg4(9 downto 2) = "11111111") else '0'; AND B AND C;
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
88
8.1.2 Voorbeeld 2
8.1.2.1 Verilog assign R = (R_int[20]) ? 0 : (R_int[19:18] == 2'b0) ? R_int[17:10] : 8'b11111111;
Bovenstaande code is eigenlijk een concurrent versie van een geneste if-else-structuur. Algemene kan men zeggen : sel?m:n Als ‘sel’ waar is wordt ‘m’ geselecteerd, anders wordt ‘n’ geselecteerd.
8.1.2.2 VHDL De vhdl-code is zo krachtig niet en kan niet onder dezelfde vorm beschreven worden. Er moest dus een andere oplossing gevonden worden.
Eerst werd er een geneste if-else-structuur geprogrammeerd. Dit werkte niet optimaal aangezien die if-else-structuur niet concurrent werkte en enkel afhankelijk was van de klok. Door gebruik te maken van een case stelde dit probleem zich niet.
temp1 <= R_int(20 downto 18); with temp1 select R <= R_int(17 downto 10) when "000", "11111111" when "001", "11111111" when "010", "11111111" when "011", "00000000" when others;
Hierboven wordt aan de hand van de temp1 de uitgang van R bepaald.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
89
8.2 Processen Aanvankelijk bestond ieder VHD-bestand uit één proces. Dit leverde echter nogal wat problemen op, aangezien sommige signalen eerder aangesproken werden dan de andere. Een stuk code mocht soms enkel reageren op een verandering van een intern of een ingangssignaal in plaats van op klokverandering.
Dit probleem kon worden opgelost door de code in verschillende processen op te delen. Deze processen werken onafhankelijk van elkaar, waardoor ze eventueel rekening konden houden met een signaalverandering die uit een vorig proces voortvloeide.
8.3 Digitale video In de ‘If_decode’ is er sprake van een TRS-signaal. Dit signaal detecteert of de datastroom FF 00 00 XY zich aan de ingang aanbiedt. Er heel wat voorgaand onderzoek gebeurd naar de betekenis van die XY-waarde. Deze werd uitvoerig besproken in hoofdstuk…..
Ook naar het waarom en hoe van de conversieformules voor een ‘YCrCb naar RGB’ conversie ging heel wat onderzoek. Er bestaan namelijk verschillende omzettingsformules, die niet altijd even gemakkelijk af te leiden zijn uit een bestaande Verilog-code.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
90
8.4 Implementatie van de VHDL-files Nadat alle files vertaald en gesimuleerd waren, moesten die in het EDK-project geïmplementeerd worden. Hiervoor werden volgende stappen ondernomen :
Nieuwe map aanmaken in de pcore van de video_capture Deze map wordt aangemaakt op de plaats waar de *.v files zijn opslagen, de verilog map wordt verwijderd en er wordt een nieuwe vhdl map aangemaakt.
Vhdl files kopieren naar de nieuwe map In de zo pas aangemaakte map worden *.vhd-files gekopieerd.
Aanpassen van de *.mpd – file In de *.mpd-file moet worden vermeld dat er in plaats van Verilog-code VHDL-code wordt gebruikt. We vervangen de regel ‘OPTION HDL =
verilog’ door ‘OPTION
HDL = VHDL’. De VHDL-bestanden moeten dezelfde naam dragen als de Verilog-bestanden.
8.5 Signed versus Unsigned
8.5.1 Verilog X_int <= (const1 * (Y_reg - 'd64));
8.5.2 VHDL X_int <= (unsigned(const1) * signed((Y_reg)- 64));
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
91
Het X_int-signaal is 21 bit breed. Zowel const1 als Y-reg zijn 10 bits breed. Wanneer beide elementen vermenigvuldigd worden, bekomt men een getal dat 20 bit breed is. De vraag werd gesteld waarom men in Verilog een 21 bit breed signaal gebruikt terwijl een signaal van 20 bit in principe zou volstaan.
De waarde die const1 bevat is een constant getal en is afkomstig van de omvormingsformules die het YCrCb- naar het RGB-signaal omzetten. Dit getal is altijd positief en dus unsigned. De waarde van ‘(y_reg-64)’ kan in principe negatief worden, vandaar dat er een tekenbit wordt toegevoegd.
Het inzien van dit gegeven was geen probleem. Waar er wel lang moest op gezocht worden is het feit dat er in de oorspronkelijke Verilog-code geen rekening gehouden werd of een signaal al dan niet signed of unsigned was. Dit wordt bij de compilatie automatisch gegenereerd.
8.6 Horizontale en verticale synchronisatie Nadat de problemen inzake kleur waren opgelost, was het beeld nog niet optimaal. Wit werd afgebeeld als zwart. Dit kwam doordat de R, G en B waardes te hoog waren, waardoor de signalen afgekapt werden. De enige gemeenschappelijke waarde binnen die conversie is de Y_reg waarde, of het luminantiesignaal. Door het bestuderen van de kleurendriehoek kon ook besloten worden dat er iets schortte met de instelling van de luminantie. Door middel van trial & error werd er een constante waarde gezocht die van het oorspronkelijke Y_reg-signaal werd afgetrokken.
Op figuur 44 is het ongecorrigeerde beeld weergegeven, figuur 45 toont het beeld na aanpassing.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
92
Figuur 45: Oorspronkelijke luminatie
Figuur 46: Aangepaste luminantie
Indien er een te hoge waarde van de luminatie werd afgetrokken,viel de synchronisatie van het beeld volledig weg. Nochtans bleek bij metingen met de oscilloscoop dat de horizontale en verticale synchronisatiepulsen wel degelijk aanwezig waren.
Onder andere omwille van bovenstaande vaststellingen moest worden gezocht naar een fout die afhankelijk was van de timing constraints van het project. Deze ‘fout’ kan ontstaan zijn bij het programmeren van de FPGA. Door constraints in te stellen, maak je de compiler duidelijk welke de kritieke paden van het project zijn. Op die manier worden eerst de kritieke paden en dan de rest van het project opgebouwd.
Om deze instellingen te kunnen doen, moet het EDK-project geïmporteerd worden in ISE.
Figuur 47: Implementeren in ISE
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
93
Op die manier kunnen de timing constraints (kies voor ‘create timing constraints’ in het ‘processes’ venster)ingesteld worden.
Figuur 48: Instellen timing constraints
Via deze weg werden echter nog geen betere resultaten bekomen. De synchronisatie valt nu op ieder moment weg, wat ons wel doet besluiten dat het luma-probleem wel degelijk een timingprobleem is. Wegens tijdsgebrek is het onderzoek naar de timing stopgezet.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
94
9 Eventuele verdere stappen De VHDL-code die in de vorige hoofdstukken werd besproken, kan maar gebruikt worden als er een NTSC signaal op het VDEC decoder bord binnen komt. Hier in België en in bijna heel Europa wordt er gebruik gemaakt van de PAL standaard. Omwille van tijdsgebrek kon deze mijlpaal niet meer uitgewerkt worden. Toch zijn hieronder enkele ideeën neergepend.
9.1 Aanpassing files In de special_svga_timing_generation moeten de constanten worden aangepast. Die waarden zijn terug te vinden in het hoofdstuk over digitale video. Ook in de If_decode en de video_capture zullen constanten moeten worden aangepast.
9.2 Extra frames De grootste uitdaging bij een PAL datastroom is dat er in plaats van 60 beelden per seconde 50 beelden per seconde zijn. Een vernieuwingsfrequentie van 50 beelden per seconde is voor een VGA scherm (flikkering) niet haalbaar. Het aantal beelden per seconde moet dus opgevoerd worden naar een minimum van 60. Hieronder zijn een aantal mogelijkheden opgesomd.
Er kan om de vijf frames een frame gekopieerd worden, zodat men na 50 frames toch aan de 60 frames komt. Nadeel is dat er een onnatuurlijke beeldweergave zal zijn.
Er kan een gemiddelde genomen worden tussen het vorige en het volgende beeldfragment. Deze methode zal een veel natuurlijker beeld genereren. Om deze methode te kunnen toepassen is er echter een vertraging en zullen er dus altijd een paar frames moeten worden gebufferd.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
95
Een derde mogelijkheid is dat er gebruik gemaakt wordt van frame predictie. Aan de hand van voorgaande beelden worden de extra frames voorspeld. Deze manier van werken is de meest gecompliceerde, maar levert wel het beste resultaat.
Voor ieder van bovenstaande mogelijkheden is er nood aan een buffergeheugen, aangezien er frames moeten worden opgeslagen. Doordat het geheugen van de Virtex-II PRO FPGA nogal beperkt is én het opslaan van beelden veel geheugen in beslag neemt, zal er beroep moeten gedaan worden op een extern geheugen. Dit kan door gebruik te maken van de DDR-RAMmodule die op het development bord geplugd kan worden. Om dit geheugen te kunnen aanspreken, zal er terug wat onderzoek moeten gebeuren.
Een extra moeilijkheid dat het gebruik van die buffers met zich meebrengt, is dat de videobuffer op dezelfde frequentie zal moeten werken als de vernieuwingsfrequentie van het beeldscherm.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
96
10 Besluit In deze thesis werd onderzoek gedaan naar het realtime verwerken van videobeelden. Daarvoor moesten een aantal mijlpalen doorlopen worden. Zo werden het VDEC1 video decoder en XUP development bord grondig bestudeerd. Ook werd er heel wat aandacht geschonken aan de studie van analoge en digitale video. Uiteraard moest er vertrouwd geraakt worden met de Verilog en VHDL hardware description language vooraleer de bestaande ‘NTSC naar VGA’ conversie in Verilog kon omgezet worden naar VHDL-code. Het omzetten van Verilog naar VHDL-code verliep niet altijd van een leien dakje. Een grondige studie van die twee talen nam een grote hap uit de planning. De finale doelstelling was het realiseren van een ‘PAL naar VGA’ conversie in VHDL. Deze werd door het gebrek aan tijd niet gehaald.
In een eerste fase werd een studie uitgevoerd van de ISE en EDK pakketten aan de hand van een resem tutorials die te vinden waren op de site van Xilinx en die door de promotor aangeboden werden. Er werden kleine projecten ontwikkeld, waardoor de structuur van beide programma’s een heel stuk duidelijker werd. Een voordeel van de pakketten is dat ze heel erg overzichtelijk en grafisch zijn, wat het wel makkelijker maakt om mee te werken. Simuleren deden we met Modelsim, een pakket van Mentor Graphics.
Door het video decoder bord en het XUP bord grondig te bestuderen werd heel wat code, zoals de aansturing van het ADV7183B IC (video decoder bord) een heel stuk duidelijker. Vooral de analoog naar digitaal conversie was voor het realiseren van het eindwerk heel belangrijk. Het bestuderen van de datasheets daaromtrent verschafte heel wat uitleg over de manier van programmeren in de Verilog code.
Door het analoge en meer specifiek het digitale videosignaal te bestuderen, konden belangrijke stappen omtrent het converteren van Verilog naar VHDL gezet worden. Vooral voor de conversie van YCrCb naar RGB aan de hand van formules, timing delay, 4:2:2 naar 4:4:4 conversie en lf decode was de studie van die signaalgang een must.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
97
In het omzetten van Verilog naar VHDL code werden heel wat problemen ontdekt en aangepakt. Om duidelijkheid te scheppen in de chaos werd er eerst en vooral een blokschema ontworpen van de bestaande Verilog code. Dit maakte het leggen van de juiste linken stukken eenvoudiger.
Wat in Verilog in een regel omschreven kan worden, vergt in VHDL vaak een blok programmacode. Een perfecte timing wordt in VHDL mogelijk gemaakt door de code te verdelen in aparte processen. Bij sommige signaalwegen, zoals horizontale en verticale synchronisatie is timing cruciaal. Timing kan ook nog geoptimaliseerd worden door gebruik te maken van timing constraints in ISE. Hiervoor moet het EDK project in ISE geïmporteerd worden, wat terug wat studiewerk vergde.
Een eindwerk realiseren loopt niet altijd van een leien dakje. Compileren en simuleren neemt vaak heel wat kostbare tijd in beslag. Op cruciale momenten ben je soms zó afhankelijk van de beschikbare technologie en knowhow.
Het opstellen van een stappenplan, zonder besef van de complexiteit van de gegeven materie is ook niet makkelijk. Aanvankelijk werd een heel ambitieus stappenplan verwezenlijkt, dat op geregelde tijdstippen geëvalueerd en aangepast werd.
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
98
Literatuurlijst On-line Verilog HDL Quick Reference Guide Beschikbaar via http://www.sutherland-hdl.com/on-line_ref_guide/vlog_ref_top.html (16 november 2006)
Introduction to verilog Beschikbaar via http://vol.verilog.com/ (7 december 2006)
HDL code examples Beschikbaar via http://toolbox.xilinx.com/docsan/xilinx7/books/data/docs/dev/dev0035_7.html (7 februari 2007)
Comparing Verilog to VHDL Syntactically and Semantically Beschikbaar via http://www.sandstrom.org/systemde.htm (7 december 2006)
RAMB16_Sm_Sn Beschikbaar via http://toolbox.xilinx.com/docsan/xilinx5/data/docs/lib/lib0372_356.html (14 december 2006)
OFDDRRSE Beschikbaar via http://toolbox.xilinx.com/docsan/xilinx5/data/docs/lib/lib0325_309.html (14 december 2006)
PAL, NTSC and SECAM comparisons Beschikbaar via http://www.high-techproductions.com/pal,ntsc.htm (8 maart 2007)
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
99
VHDL sources Beschikbaar via http://dz.ee.ethz.ch/support/ic/vhdl/vhdlsources.en.html (3 april 2007)
OVI Verilog HDL LRM. “[online]” 1991; v.1.0 Beschikbaar via http://vega.unitbv.ro/~nicula/asd/resources/VerilogLangRefManual.pdf (29 januari 2007)
Constraints Guide 9.1I. “[online]” Beschikaar via http://www.xilinx.com/support/sw_manuals/xilinx9/download/cgd.zip (3 mei 2007)
Multiformat SDTV Video Decoder ADV7183B. “[online]” Beschikbaar via http://www.analog.com/UploadedFiles/Data_Sheets/ADV7183B.pdf (1 november 2006)
EDK 9.1 Power PC Tutorial in Virtex 4. “[online]” 2007; v4.0 Beschikbaar via http://www.xilinx.com/support/techsup/tutorials/EDK_91_PPC_Tutorial.pdf (3 mei 2007)
Custom Peripheral Design Guide. “[online]” Beschikbaar via http://direct.xilinx.com/direct/ise7_tutorials/import_peripheral_tutorial.pdf (31 januari 2007)
Platform Specification Format Reference Manual, Embedded Development Kit EDK 9.1i. “[online]” 2007; v5.0 Beschikbaar via http://www.xilinx.com/ise/embedded/edk91i_docs/psf_rm.pdf (26 april 2007)
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
100
Recommendation ITU-T H.262. “[online]” 1995; rev E Beschikbaar via http://le-hacker.org/hacks/mpeg-drafts/is138182.pdf (26 april 2007)
BT.601-5 - Studio encoding parameters of digital television for standard 4:3 and wide-screen 16:9 aspect ratios “[online]” 1996; v.1.3 Beschikbaar via http://www.stewe.org/itu-recs/bt601.pdf (10 november 2006)
YCrCb to RGB considerations. “[online]” 1997 Beschikbaar via http://www.intersil.com/data/an/an9717.pdf (17 mei 2007)
Ciletti, M.D., Starter’s Guide To Verilog 2001. Upper Saddle River: Pearson, 2004
Lee, J.M., Verilog Quickstart, 3rd edition. New York: Springer , 2002
Lee, S, Advanced Digital Logic Design using Verilog, State Machines, and Synthesis for FPGA’s. Toronto : Thomson 2006
Keith, J, Video Demystified, 4th Edition. Burlington: Elsevier, 2005
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
101
Bijlagen Omdat sommige datasheets nogal lijvig zijn, werd besloten alle bijlagen op cd-rom te zetten. Deze cd-rom omvat:
Volledige eindwerk in pdf-formaat
Samenvatting in pdf-formaat
Poster in pdf-formaat
Simulaties in pdf-formaat
‘NTSC naar VGA’ programma in Verilog
‘NTSC naar VGA’ programma in VHDL
Blokschema programma’s
ADV7183B datasheet
3818KRC datasheet
EDK-XUP-V2ProPack
ITU-R BT.1364
ITU-R BT.601-5
ITU-R BT.656-4
Jelmer Callant | Pieter Huyghe
Realtime Video Processing
i