Preview only show first 10 pages with watermark. For full document please download

Eindwerk 2008 Sabbe Kris 3ai1eo Aansturen Led Display Via Artnet

   EMBED


Share

Transcript

Departement Industriële Wetenschappen en Technologie Opleiding bachelor in de elektronica-ICT Afstudeerrichting elektronica Aansturen LED display via art-net Eindwerk aangeboden tot het behalen van het diploma van bachelor in de elektronica-ICT door Kris Sabbe o.l.v. Kristof Soreyn, XL-holding GeertVandecasteele ,KHBO Academiejaar 2007 - 2008 talent@work KHBO Campus Oostende ● Zeedijk 101 ● B-8400 Oostende ● Tel. +32 59 56 90 00 ● Fax +32 59 56 90 01 ● www.khbo.be   Departement Industriële Wetenschappen en Technologie Opleiding bachelor in de elektronica-ICT Afstudeerrichting elektronica Aansturen LED display via art-net Eindwerk aangeboden tot het behalen van het diploma van bachelor in de elektronica-ICT door Kris Sabbe o.l.v. Kristof Soreyn, XL-holding GeertVandecasteele ,KHBO Academiejaar 2007 - 2008 talent@work KHBO Campus Oostende ● Zeedijk 101 ● B-8400 Oostende ● Tel. +32 59 56 90 00 ● Fax +32 59 56 90 01 ● www.khbo.be     Mededeling    Deze eindverhandeling was een examen. De tijdens de verdediging vastgestelde fouten  werden niet gecorrigeerd.  Gebruik als referentie in publicaties is toegelaten na gunstig advies van de KHBO‐promotor,  vermeld op het titelblad.            Woord vooraf    Bij het verwezenlijken van dit eindwerk werd ik bijgestaan door een aantal bijzondere  personen. Hierbij wil ik ook van de gelegenheid gebruik maken om hen te bedanken.    In de eerste plaats zou ik mijn ouders willen bedanken om de morele steun en interesses die  ze toonden tijdens mijn studies.    Bij deze wil ik de firma XL‐holding bedanken omdat ik stage mocht doen bij hen en gebruik  mocht maken van hun materiaal. In het bijzonder Kristof Soreyn als buitenpromotor,  Frederik Torreele als labbegeleider en alle personeelsleden van XL‐holding.    Ook wil ik de binnenpromotor Geert Vandecasteele bedanken evenals alle docenten uit het  KHBO die de voorbije 3 jaar hun steentje bijgedragen hebben om mijn kennis te verruimen.    Kris Sabbe  Jabbeke, mei 2008          Aansturen LED display via art‐net  3  Abstract  Aansturen LED‐display via art‐net  XL‐Holding (Oostende)  Door Kris Sabbe    Dit eindwerk is de oplossing om videopixels, die normaal enkel geschikt zijn om  video weer te geven, ook te gebruiken als lichteffect. Hiervoor wordt een bestaand  lichtprotocol namelijk Art‐net toegepast.  Art‐net is een nieuwe standaard die langzamerhand zijn weg vindt naast DMX. Het is  een lichtprotocol dat net zoals DMX wordt gebruikt om via een lichttafel lampen,  spots en moving heads te besturen.   Het grote verschil met DMX is: het medium dat deze standaard gebruikt is ethernet.  Dit biedt natuurlijk enkele voordelen,  men kan gebruik maken van een reeds  bestaand netwerk om de data over te transporteren, alsook van de apparatuur die  het netwerk gebruikt. Hierbij denken we vooral aan hubs en routers.  Art‐net is een standaard die gebruik maakt van het UDP‐protocol. Het zendt  namelijk de DMX kanalen door in UDP‐pakketten.   De bedoeling van mijn eindwerk is de data uit deze pakketten te halen en om te  zetten naar een DVI‐signaal om een LED‐display aan te sturen.      Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  4  Inhoudsopgave   Inhoudsopgave  Abstract ......................................................................................................................... 3  Inhoudsopgave .............................................................................................................. 4  Lijst met illustraties, afbeeldingen en tabellen ............................................................. 6  Inleiding ......................................................................................................................... 8  1.  Doel ........................................................................................................................ 9  2.  Algemene uitleg van de te gebruiken componenten ........................................... 10  2.1.  LED’s als lichteffect ........................................................................................ 10  2.1.1.  Voordelen en eigenschappen .................................................................. 10  2.1.2.  Opbouw en werking van een LED ............................................................ 11  2.1.3.  Multicolor LED’s ...................................................................................... 12  2.2.  DMX ............................................................................................................... 14  2.2.1.  Wat is DMX? ............................................................................................ 14  2.2.2.  Data protocol .......................................................................................... 15  2.3.  Art‐net ........................................................................................................... 16  2.3.1.  Wat is Art‐net? ........................................................................................ 16  2.3.2.  Beperkingen ............................................................................................ 16  2.3.3.  Ethernet implementatie .......................................................................... 17  2.3.4.  Netwerk topologie .................................................................................. 18  2.4.  OSI‐model ...................................................................................................... 19  2.4.1.  Introductie .............................................................................................. 19  2.4.2.  Lagen OSI‐model ..................................................................................... 19  2.4.3.  Werking OSI‐model ................................................................................. 22  2.4.4.  UDP in het OSI‐model .............................................................................. 23  2.5.  DVI ................................................................................................................. 25  2.6.  RS‐232 ............................................................................................................ 27  2.7.  Barco MiStrip en control box ......................................................................... 29  3.  Keuze van de componenten ................................................................................. 31  3.1.  Picdem.net2 development board .................................................................. 31  3.2.  Pic 18F97J60 .................................................................................................. 31  3.3.  Altera cyclone I FPGA ..................................................................................... 32  3.4.  TFP‐410 .......................................................................................................... 36  3.5.  HIN202 ........................................................................................................... 37  3.6.  MAX489 ......................................................................................................... 38  3.7.  Ontkoppelcondensatoren .............................................................................. 38  Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  5  3.8.  Lichttafel en netlynx ...................................................................................... 39  3.9.  Software ......................................................................................................... 40  3.9.1.  Mplab ...................................................................................................... 40  3.9.2.  Quartus II ................................................................................................. 40  3.9.3.  Microsoft Network Monitor 3.1 .............................................................. 40  3.9.4.  Barco director toolset V1.6 ..................................................................... 42  4.  Uitwerking en problemen .................................................................................... 45  4.1.  Uitwerking ..................................................................................................... 45  4.2.  Metingen ....................................................................................................... 48  4.3.  Schakeling ...................................................................................................... 55  4.4.  Ontwerp van de print ..................................................................................... 58  4.5.  Beeldopbouw ................................................................................................. 58  4.5.1.  Geschiedenis ........................................................................................... 58  4.5.2.  Blanking ................................................................................................... 59  4.6.  Code PIC ......................................................................................................... 60  4.7.  Code FPGA ..................................................................................................... 64  5.  Werking van het toestel ....................................................................................... 70  5.1.  Achterpaneel ................................................................................................. 70  5.2.  Frontpaneel ................................................................................................... 70  6.  Kostprijsberaming ................................................................................................ 72  7.  Algemeen besluit ................................................................................................. 73  8.  Bijlagen ................................................................................................................ 74  9.  Literatuurlijst ....................................................................................................... 75      Kris Sabbe    3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  6  Lijst met illustraties, afbeeldingen en tabellen  figuur 1: blokschema eindwerk ..................................................................................... 9  figuur 2: voordelen van LED’s ...................................................................................... 10  figuur 3: PN‐junctie in doorlaat ................................................................................... 11  figuur 4: opbouw LED .................................................................................................. 11  figuur 5: afmetingen LED ............................................................................................. 12  tabel 1: specificaties LED ............................................................................................. 13  figuur 6: XLR connector ............................................................................................... 14  tabel 2: instellen Art‐net IP‐adres ................................................................................ 17  figuur 7: OSI‐model ..................................................................................................... 20  figuur 8: OSI‐model ..................................................................................................... 22  figuur 9: UDP structuur ............................................................................................... 23  figuur 10: UDP frame .................................................................................................. 24  figuur 11: DVI connector ............................................................................................. 26  tabel 3: pinaansluiting DVI .......................................................................................... 26  figuur 12: RS‐232 connector ........................................................................................ 28  figuur 13: MiStrip ........................................................................................................ 29  figuur 14: MiStrip’s gebruikt als podium ..................................................................... 29  figuur 15: MiStrip’s gebruikt als LED vloer................................................................... 30  figuur 16: Picdem.net2 development board ................................................................ 31  figuur 17: MPLAB ICD 2 ............................................................................................... 31  figuur 18: banken FPGA ............................................................................................... 32  Tabel 4: eigenschappen FPGA ..................................................................................... 33  tabel 5: overzicht EP1C3 .............................................................................................. 33  figuur 19: serial configuration device .......................................................................... 33  figuur 20: programmeren via AS en JT ........................................................................ 34  tabel 6: verschillende programmeermogelijkheden FPGA ........................................... 34  figuur 21: pin layout TFP‐410 ...................................................................................... 36  figuur 22: blokschema TFP‐410 ................................................................................... 36  figuur 23: Blokschema HIN202 .................................................................................... 37  figuur 24: Aansluiting MAX489 ................................................................................... 38  figuur 25: Showmaster 24 en Net‐lynx ........................................................................ 39  figuur 26: ontvangen UDP‐pakket met alle schuifbalken omhoog .............................. 40  figuur 27: ontvangen UDP‐pakket met de eerste en laatste schuifbalk omhoog ........ 41  figuur 28: instellen MiStrip .......................................................................................... 42  figuur 29: MiStrip’s in testopstelling ........................................................................... 43  figuur 30: MiStrip’s geplaatst in director toolset ......................................................... 43  figuur 31: Instellen positie MiStrip’s ............................................................................ 44  figuur 32: gesoldeerde print ........................................................................................ 47  figuur 33: binnenkant behuizing .................................................................................. 47  Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  7  figuur 34: scoopbeeld: voedingsspanning ................................................................... 48  figuur 35: scoopbeeld: 25MHz ..................................................................................... 49  Figuur36: scoopbeeld: leespulsen ................................................................................ 49  figuur 37: scoopbeeld: één leespuls ............................................................................. 50  figuur 38: scoopbeeld: tijd tussen 2 leespulsen ........................................................... 50  figuur 39: scoopbeeld: Teller ....................................................................................... 51  figuur 40: scoopbeeld: 32MHz ..................................................................................... 52  figuur 41: scoopbeeld: data enable en H_sync ............................................................ 52  figuur 42: scoopbeeld: H_sync en V_sync .................................................................... 53  figuur 43: scoopbeeld: TXC‐ en TXC+ ........................................................................... 54  figuur 44: netwerkbelasting ........................................................................................ 54  figuur 45: schakeling deel 1 ......................................................................................... 56  Figuur 46: schakeling deel 2 ........................................................................................ 57  figuur 47: kathodestraalbuis ....................................................................................... 58  figuur 48: beeldopbouw .............................................................................................. 59  figuur 49: software voor sync‐pulsen .......................................................................... 64  figuur 50: software voor de beeldopbouw .................................................................. 66  figuur 51: achterpaneel ............................................................................................... 70  figuur 52: frontpaneel ................................................................................................. 70  Tabel 7: kostprijsberaming .......................................................................................... 72      Kris Sabbe    3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  8  Inleiding   Het doel van dit eindwerk is de data verzonden door een lichttafel over ethernet om  te zetten tot lichteffecten. Hiervoor wordt het bestaande lichtprotocol Art‐net  gebruikt. Art‐net is een standaard die gebruik maakt van het UDP‐protocol. Het  zendt namelijk de DMX kanalen door in UDP‐pakketten. Deze UDP‐pakketten  worden binnen gelezen en de data eruit wordt omgevormd tot een DVI‐signaal.  Dit probleem wordt opgesplitst in drie delen, namelijk ten eerste het ontvangen van  de udp‐pakketten, ten tweede het genereren van de componenten voor een DVI‐ signaal en ten derde de omzetting naar DVI.  Voor het ontvangen van de UDP‐pakketten is gebruik gemaakt van het Picdem.net2  development board. Op dit bord zit de PIC18F97J60 die een ethernet ondersteuning  heeft. Met de PIC worden de UDP‐pakketten ontvangen en de data eruit gehaald.  Dit wordt dan samen met een teller een leespulsen verzonden naar de fpga, de  Cyclone I van Altera.  In de fpga worden de synchronisatie en enable‐pulsen gemaakt voor de  beeldopbouw. In de fpga wordt ook de data verzonden vanuit de pic, met de  standen van de schuifbalken, omgezet naar beeld.  Deze signalen gaan dan naar een digitale transmitter, de TFP‐410 van Texas. Dit ic  zet de signalen dan om naar een DVI‐signaal.      Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  9  1. Doel  Het doel van dit eindwerk is om een LED‐display (Barco ™ MiStrip) aan te sturen via  art‐net. Hiervoor wordt een lichttafel van Showtec (showmaster 24) gebruikt. Deze  lichttafel zendt zijn data uit in een DMX signaal. Dit signaal wordt dan omgezet door  een omvormer (Artistic license Net‐lynx) naar art‐net. De UDP‐pakketten  uitgezonden door dit toestel worden dan binnen gelezen door middel van een PIC.  Deze PIC is de PIC18F97J60 omdat deze een ethernet ondersteuning heeft. Uit deze  pakketten wordt dan de data gehaald die nodig en wordt doorgestuurd naar een  fgpa. De Cyclone I van Altera. In deze fpga gebeurt de opbouw van het beeld, de  synchronisatiepulsen en de blanking.  Deze signalen worden dan doorgezonden naar de TFP‐410 die een digitale omzetter  is. Dit ic zet de signalen dan om naar een DVI‐signaal.  Dit DVI‐signaal wordt dan aangesloten om een Olite control box welke dan de  MiStrip’s aanstuurt.  Figuur 1 is het algemeen blokschema van dit eindwerk.              Kris Sabbe    figuur 1: blokschema eindwerk   3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  10  2. Algemene uitleg van de te gebruiken componenten  2.1. LED’s als lichteffect  2.1.1. Voordelen en eigenschappen  LED’s worden vandaag de dag meer en meer opgenomen in onze dagelijkse  leefomgeving. Als verlichting, signalisatie, lichteffect en nog zoveel meer.   Om deze LED’s te kunnen gebruiken in een videowall moet men over de drie  hoofdkleuren beschikken, namelijk rood, groen en blauw. In vroegere systemen  werkte men dikwijls met drie afzonderlijke LED’s om de drie hoofdkleuren weer te  geven. Nu wordt dit meer geïntegreerd in één SMD‐LED. Op deze manier kunnen  veel hogere resoluties gehaald worden.  De hoge eisen die worden gesteld aan een LED wanneer deze wordt toegepast in  een videowall laten zich ook zien in het ontwerp. Hierbij is te denken aan de  stralingshoek, de lichtopbrengst, het regelgedrag en niet onbelangrijk, de stroom die  wordt opgenomen.  De voordelen van LED’s ten opzichte van gloeilampen is dat ze veel kleiner zijn en ze  duizend maal sneller oplichten. Alsook het rendement (bekeken vanuit het oogpunt:  aantal lummen per watt) ligt ongeveer drie keer hoger dan conventionele  gloeilampen.  De levensduur van een LED ligt ongeveer op honderdduizend branduren.  Gloeilampen moeten het doorgaans stellen met 3000 branduren. LED's bevatten  geen gloeidraad, die vaak stuk gaat bij traditionele verlichting.  Ook heeft een LED een snelle  responstijd wat ideaal is voor  digitale sturing.   Enkele nadelen van LED’s zijn dat  ze het licht in een beperkte hoek  uitzenden, terwijl gloeilampen en  fluorescentielampen licht naar  alle kanten uitstralen. LED‐ verlichting kost ook meer dan  traditionele verlichting.    figuur 2: voordelen van LED’s                    Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  11  2.1.2. Opbouw en werking van een LED    De werking van een LED of een Light Emitting Diode berust op het principe van de  verontreinigde halfgeleider.  Men gebruikt bij het maken van diodes meestal silicium. Deze stof heeft vier  elektronen op de buitenste schil zitten. Af en toe wordt er door warmte energie een  elektron uit zijn schil weggetrokken en kan het zich voortbewegen in de  kristalstructuur van het silicium. De  overgebleven lading noemen we een gat.  Het voortbewegen van deze elektronen  noemen we intrinsieke geleiding. Omdat dit  een slechte geleider is gaat men deze  verontreinigen, bij voorkeur met een atoom  met één elektron meer of minder op de  buitenste schil. Wanneer we   verontreinigen met Fosfor of Arsenicum dan   heeft dit materiaal 5 elektronen op de  buitenste schil en krijgen we N‐materiaal.  Doordat het 5e elektron teveel is ( de andere  4 worden gebruikt om zich te binden met het  silicium.) beweegt dit elektron zich vrij rond  en zo ontstaat er een vast gat in de binding.  De geleiding die hierdoor ontstaat noemt men   figuur 3: PN‐junctie in doorlaat extrinsieke geleiding. Bij P‐materiaal   verontreinigen we met een materiaal (bv. boor of gallium) met 3 elektronen op de  buitenste schil. Zo krijgen we dus een gat en een vaste negatieve lading.  Met deze twee materialen kunnen we nu een PN‐junctie maken. Wanneer we een  spanning aansluiten op deze junctie kan ze in sper  of in doorlaat gepolariseerd zijn. Het gebied waar  de twee materialen elkaar raken noemen we de  sperlaag. Indien de junctie in doorlaat  gepolariseerd is (zie figuur 3) dan kunnen de  elektronen vanaf een bepaalde spanning  (junctiespanning) beginnen vloeien van het N naar  het P‐materiaal. In sper wordt het spergebied  breder en kunnen de elektronen niet vloeien van  het ene naar het andere materiaal.  Bij LED’s is de opbouw iets anders dan een  gewone diode. Er wordt namelijk meestal ook nog  een soort kegeltje voorzien dat fungeert als een  soort reflector om het licht te kunnen richten.  Afhankelijk van de hoek van dit kegeltje wordt de  figuur 4: opbouw LED  stralingshoek van de LED bepaald. Als we een  Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  12  geleidende PN‐junctie hebben dan is de grootte van de gap of het overgangsgebied  tussen de valentieband en de geleidingsband belangrijk voor de golflengte (=kleur)  van het uitgestraalde licht . Daarom hebben blauwe LED’s bijvoorbeeld een hogere  spanning nodig om te branden, omdat de gap energie anders is. Dit in tegenstelling  tot rode LED’s die kunnen werken met een lagere spanning.   Om witte LED’s te maken die enkel dienen als verlichting maakt men een blauwe  LED waarbij men de lens verontreinigt met geel fluorescentie poeder zodat het licht  wit wordt. Bij video toepassingen maakt men wit licht door simpelweg de drie  hoofdkleuren met elkaar te mengen.    2.1.3. Multicolor LED’s  Bij multicolor LED’s worden de drie hoofdkleuren rood, groen en blauw geïntegreerd  in een behuizing. Op deze manier kunnen er veel meer LED’s op dezelfde  oppervlakte geplaatst worden waardoor de resolutie van het display verbeterd.    De LED’s gebruikt in de MiStrip worden door Nichia Corporation gemaakt en zijn  SMD LED’s van 5,5 x 5,5 mm. Deze LED’s hebben zes aansluitpinnen. Telkens zit er  tussen twee aansluitpinnen een LED.  In figuur 5 ziet u de afmetingen van de LED’s en hoe de drie LED’s inwendig zijn  aangesloten.                             Kris Sabbe    figuur 5: afmetingen LED 3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  13    In onderstaande tabellen vindt u enkele specificaties van deze LED’s.                                            Kris Sabbe    tabel 1: specificaties LED 3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  14  2.2. DMX  2.2.1. Wat is DMX?  DMX staat voor Digital MultipleXed. (Ook wel DMX‐512 genoemd)  DMX wordt gebruikt als seriële communicatiebus tussen verschillende apparaten in  de theater‐ en discotheek lichttechniek. Vaak is het sturende apparaat een lichttafel  met enkele dimmerpacks of andere meer ingewikkelde armaturen. Elk apparaat  heeft een ingang en een uitgang zodat de bus tussen de verschillende apparaten  doorgelust kan worden. Volgens de standaard gebruikt de bus een vijf‐aderige kabel  met XLR connectoren maar omdat er veelal drie‐aderige kabels met XLR connector  van de geluidstechniek aanwezig waren werd er in de praktijk meer drie‐aderige  kabels met XLR connectoren voor DMX‐signalen gebruikt. De overige 2 aders waren  oorspronkelijk bedoeld om informatie van de lichtapparatuur terug te sturen naar  de sturende tafel. Dit is echter nooit geïmplementeerd. De pinbezetting is als volgt:       1. Massa     2. Cold (‐)     3. Hot (+)     4. (Niet meer gebruikt) return ‐     5. (Niet meer gebruikt) return +        figuur 6: XLR connector    Behalve de lichtintensiteit kunnen ook de kleur, vorm en richting van een lamp  variabel zijn. Voor elk van deze parameters wordt dan een DMX kanaal gebruikt.  Voor een enkele lamp kunnen dan bijvoorbeeld vijf DMX kanalen in gebruik zijn:       1. Intensiteit     2. Kleur     3. Vorm (gobo)     4. X‐positie (pan)     5. Y‐positie (tilt)    Sommige apparaten vragen om een nauwkeurigere positionering dan mogelijk is  met één 8‐bit waarde. Dan worden er soms twee kanalen gebruikt om één  parameter te veranderen, bijvoorbeeld de X‐positie.    Elektrisch kunnen op één DMX lijn in theorie 32 apparaten (bijvoorbeeld dimmers)  aangesloten worden. Als er meer apparaten nodig zijn dan moet er een zogenaamde  repeater tussen geplaatst worden, die het signaal versterkt. Veel moderne  "intelligente" lampen hebben deze functie tegenwoordig in zich.      Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  15  DMX is niet geschikt voor het gebruik van kritische toepassingen zoals pyrotechniek  (vuurwerk). Het protocol is daar niet betrouwbaar genoeg voor. Als een ontvanger  zich "vertelt" neemt het de waarde van een ander aan, een stuk vuurwerk op kanaal  10 zou dan af kunnen gaan als de lamp op kanaal 11 vol aanstaat. In plaats van DMX  wordt voor dergelijke toepassingen dan bijvoorbeeld MIDI gebruikt, waarbij de  ontvanger ook zijn status terug kan melden en het stuk vuurwerk pas af kan gaan als  het eerst "op scherp" gezet is.    2.2.2. Data protocol  Het protocol zelf is bijzonder eenvoudig: na een korte wachttijd worden tot  maximaal 512 8‐bits kanaalwaarden achter elkaar verzonden. Er kunnen dus 512  dimmerkanalen aangestuurd worden met één DMX kabel, waarbij elke dimmer  tussen de 0 en 255 geregeld kan worden. Daarbij is een waarde van 255 gelijk aan  een volledig ingeschakelde lamp en 0 gelijk aan een uitgeschakelde lamp. Op elk  dimmerpack kan het adres waar het naar luistert ingesteld worden, het  ontvangende apparaat hoeft na het detecteren van de zendpauze alleen maar af te  tellen tot zijn waarde langskomt.  De baudrate van DMX 512 ligt typisch op 250 kbit/s.                                                  Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  16  2.3. Art­net  2.3.1. Wat is Art­net?  Art‐net is een op ethernet gebaseerde standaard die zich situeert in de TCP/IP laag  van dit protocol. Het dient om grote hoeveelheden DMX512 data te verzenden  gebruik makende van standaard netwerktechnologie. Art‐net is in de eerste plaats  bedoeld om te werken op 10BaseT netwerken. De snelheid is dus maximum 10  Mbit/sec.    2.3.2. Beperkingen  Indien we kijken naar de data‐rate van DMX versus ethernet, dan zien we dat DMX  draait op 250 KBaud en ethernet 10MBaud. Dit veronderstelt dat er maar maximum  40 universes zouden kunnen bestaan. Maar Art‐net maakt gebruik van een delta  transmissie compressie techniek die ervoor zorgt dat er ongeveer 60 universes  adresseerbaar zijn.    Delta compressie techniek  Het delta coderen is een manier om gegevens in de vorm van verschillen tussen  opeenvolgende gegevens op te slaan of te verzenden. Het delta coderen wordt ook  deltacompressie genoemd.   De verschillen tussen de data worden geregistreerd in afzonderlijke dossiers  genoemd delta's of diffs. Omdat de veranderingen vaak klein zijn vermindert het  delta coderen veel gegevensovertolligheid. De inzamelingen van unieke delta's zijn  wezenlijk ruimte‐efficiënter dan hun niet‐gecodeerde equivalenten. Van een logisch  standpunt is het verschil tussen twee gegevenswaarden de informatie die wordt  vereist om één waarde uit andere te verkrijgen. Het verschil tussen identieke  waarden is  0 of het neutrale element.   Een voorbeeld.   In plaats van 2..4..6..9..7..10..10..12 te verzenden kan 2..2..2..3..‐2..3..0..2 verzonden  worden.   Deze codering is het meest doeltreffend wanneer er tijdens het verzenden vaak  opeenvolgende of gelijke waarden voorkomen.                      Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  17  2.3.3. Ethernet implementatie  Alle communicatie verloopt via UDP(User Datagram Protocol). Om te kunnen  Communiceren moet het IP‐adres van het Art‐net toestel in klasse A liggen. Dit laat  toe dat Art‐net producten direct met elkaar kunnen communiceren en dat er geen  DHCP‐server nodig is.  DHCP staat voor Dynamic Host Configuration Protocol en is een computerprotocol  dat beschrijft hoe een computer zijn netwerkinstelling kan verkrijgen. DHCP is  gebaseerd op het internet protocol en werkt met UDP‐pakketten. Met DHCP kunnen  onder andere de IP adressen van alle toestellen in het netwerk automatisch  toegewezen worden in plaats van dit handmatig te doen. In deze toepassing is dit  echter niet nodig omdat de IP adressen van de toestellen die gebruikt worden vast  zijn.  Een klasse A netwerkadres is toegestaan in een gesloten ( privé) netwerk. Dit is  belangrijk omdat het niet de bedoeling is dat de Art‐net data naar het internet  gezonden wordt.  Men beveelt aan dat een Art‐net IP‐adres er standaard zo uitziet: 2.x.x.x.  Een IP‐adres bestaat uit het formaat: A.B.C.D. waarbij het de bedoeling is dat B C en  D wordt berekend uit het MAC adres.   De hoogste byte A wordt gezet volgens tabel 2.      tabel 2: instellen Art‐net IP‐adres   Het MAC‐adres is een 48 bits nummer met als vorm: u:v:w:x:y:z. Het is de bedoeling  dat dit een algemeen uniek nummer is. De bovenste bytes u, v en w zijn  geregistreerd aan een specifieke organisatie. De laagste x, y en z worden toegekend  in de organisatie zelf.   Om te verzekeren dat er zeker geen conflicten zijn met IP adressen wordt de  product OEM‐code toegevoegd in het MAC‐adres.  Het subnetmasker wordt standaard op 255.0.0.0 gezet, tenzij er een handmatig IP  adres is ingesteld. Het poortnummer waarop de communicatie verloopt is standaard  6465 (0x1936)              Kris Sabbe  3AI1E0    Oostende 2007‐2008        Aansturen LED display via art‐net  18  Een voorbeeld:  o Netwerk switch: uit  o MAC‐adres: 12.45.78.98.34.76  o OEM code: 0x0010  o Berekening IP‐adres(A.B.C.D):  o IP‐adres A = 2 (Netwerk switch is uit)  o IP‐adres B = 114( 98+0+16)  o IP‐adres C = 34( uit het MAC‐adres)  o IP‐adres D = 76( uit het MAC‐adres)  o IP‐adres is: 2.114.34.76.      Standaard moet een server pollen naar het primaire en secundair adres  Primair adres: 2.255.255.255:6454  Secundair adres: 10.255.255.255:6454    2.3.4. Netwerk topologie  Bij Art‐net zijn er twee netwerkstructuren mogelijk:  1. Peer to peer.  Dit is een netwerk dat data verzendt zonder tussenkomst van een server.  Meerdere nodes kunnen data verzenden. Alle data wordt verzonden via  ArtDMX‐packets. Alle packets worden gebroadcast, dit wil zeggen verzonden  met IP‐adres 2.255.255.255. (of 10.255.255.255). Dus ALLE nodes die  aangesloten zijn op het netwerk ontvangen de data. Als een Art‐net toestel  opstart, start het op in deze mode.  2. Server to peer.  Dit is de meest gesofisticeerde implementatie waarbij één of meerdere nodes  communiceert met één of meerdere centrale servers. ( meestal lichtconsoles).  Deze methode van werken is programmeerbaar door het werken met het  Artpoll data packet. In deze mode kan men ook kiezen of de data verder  gebroadcast wordt of ze naar één specifiek adres gezonden wordt.  Een Universe adres wordt gecodeerd als een 8‐bits getal. De hoogste bit is de  referentie voor het Sub‐net adres en wordt op één enkele waarde gezet voor  iedere node. De laagste bit wordt gebruikt om het individueel universe te  definiëren in de node. In de bijlage kan men de inhoud vinden die in de ArtDMX‐ packets zit, alsook de procedure die gevolgd moet worden voor de  Artpollpackets en Artpollreply.               Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  19  2.4. OSI­model  2.4.1. Introductie  Hoewel er verschillende protocollen beschikbaar zijn voor de overdracht van  computergegevens, moeten alle protocollen voor netwerkcommunicatie bepaalde  kernfuncties bieden. De implementatie van de functies kan per fabrikant verschillen,  maar hebben allemaal een aantal basiskenmerken gemeen. Het OSI‐referentiemodel  (Open Systems Interconnection Reference Model) is door de ISO (International  Systems Organization for Standardization) ontwikkeld als basismodel waarop alle  protocollen kunnen voortborduren. Het OSI‐model is wel in de praktijk gebruikt,  maar wordt over het algemeen gezien als een theoretisch raamwerk dat de  bouwblokken van een goed protocol in kaart brengt en definieert. Protocollen als  TCP/IP bevatten (een gedeelte van) de basisfuncties die zijn vastgelegd in het OSI‐ model.  Het gebruik van een referentiemodel heeft een aantal voordelen. Het biedt  bijvoorbeeld een algemeen frame voor programmeurs die protocol stacks  ontwikkelen. Daarnaast biedt het alle gebruikers van een netwerk de mogelijkheid  om voor alle protocolsystemen dezelfde uitgangspunten te gebruiken op het gebied  van functionaliteitslagen. Verder zou de modulariteit van een gelaagd protocol in  een ideale situatie de mogelijkheid bieden om een overbodig functionerend  codeblok te vervangen door een verbeterde versie van hetzelfde blok zonder dat  nodig de hele stack te bewerken. Die uitwisselbare, modulaire eigenschap kan  helpen bij het koppelen van netwerksoftware afkomstig van verschillende  fabrikanten.  Voordat het OSI‐model werd erkend als een geldig protocolmodel, maakten de  meeste fabrikanten hun eigen protocollen waarbij weinig aandacht werd besteed  aan de mogelijkheden tot samenwerking van producten van verschillende  fabrikanten. Doordat steeds meer gebruikers interesse toonden voor open  standaards, begonnen de besloten standaards terrein te verliezen. De  mogelijkheden voor samenwerking tussen producten van verschillende fabrikanten  werd steeds belangrijker en het werd duidelijk dat er behoefte was aan een  standaardmodel, zoals OSI.    2.4.2. Lagen OSI­model  Het OSI‐model bestaat uit zeven lagen en elke laag heeft een eigen functie. Dit  betekent niet dat elk protocol dat gebaseerd is op het OSI‐model uit zeven  verschillende lagen bestaat of niet meer dan zeven functies heeft. De zeven lagen  vertegenwoordigen alleen de typen functies die een protocol zou moeten  ondersteunen. Daarnaast worden de functionele blokken in het OSI‐model  gerangschikt in een logische volgorde, met een bovenste en onderste laag. De  functies bovenin het model bevinden zich het dichtst bij de gebruiker of toepassing  en de functies onderin het model het dichtst bij het fysieke netwerk of  netwerkkaarten.    Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net           20    figuur 7: OSI‐model • Laag 7: Application layer (toepassingslaag)  Dit is de toplaag van het OSI‐model. Deze laag is verantwoordelijk voor de  netwerktoegang van applicaties. Gebruikerstoepassingen en systeemservices  krijgen over het algemeen toegang tot het netwerk door samen te werken  met een proces dat uitgevoerd wordt in deze OSI‐laag.    • Laag 6: Presentation layer (presentatielaag)  Dit is de OSI‐laag die het nauwst samenwerkt met de toepassingslaag. De  belangrijkste taak van deze laag is ervoor te zorgen dat de gegevens die  worden doorgestuurd naar de Toepassingslaag een indeling hebben of  krijgen, die wordt begrepen door het proces in de Toepassingslaag.    • Laag 5: Session layer (sessielaag)  De Sessielaag is verantwoordelijk voor het tot stand brengen, onderhouden  en beëindiging van de communicatie tussen toepassingen of processen op  een netwerk.      Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  21  • Laag 4: Transport layer (transportlaag)  De Transportlaag is verantwoordelijk voor het verzenden van berichten van  de bronhost naar de eindbestemming. Deze laag is niet alleen  verantwoordelijk voor het maken van een virtueel circuit tussen twee punten  op het netwerk, maar ook voor de gegevensintegriteit (als de lagere  protocollen die niet aanbieden).    • Laag 3: Network layer (netwerklaag)  Deze laag zorgt ervoor dat pakketten door verschillende lagen worden  gerouteerd. De netwerklaag houdt geen rekening met de onderliggende  protocollen die actief zijn op dit niveau en daardoor kunnen apparaten (zoals  routers) die actief zijn op dit niveau, worden gebruikt om verbindingen tot  stand te brengen tussen netwerken die verschillende technologieën  gebruiken in de lagen Data Link en Physical.    • Laag 2: Data Link layer (gegevenskoppelingslaag)  Deze laag is oorspronkelijk ontworpen als een enkele functionele laag. Later  bleek het echter noodzakelijk om de laag te verdelen in twee sublagen,  namelijk LLC (Logical Link Control) en MAC (Media Access Control). Deze twee  lagen zijn samen verantwoordelijk voor het verplaatsen van pakketten van en  naar het netwerk.  o MAC  De MAC‐sublaag moet ervoor zorgen dat er op het juiste toegang  wordt verkregen tot het netwerk, bijvoorbeeld als er geen  communicatie met andere computers plaatsvindt of als er expliciet  toegang is verleend tot het netwerk. In deze laag worden bits en bytes  verzameld en omgezet in frames en omgekeerd.  o LLC  De LLC‐sublaag zet de bytes die ontvangen zijn van de onderliggende  MAC‐laag om in een indeling die leesbaar is voor de bovenliggende  Netwerklaag.    • Laag 1: Physical layer (fysische laag)  Deze laag is verantwoordelijk voor de manier waarop de bits en bytes fysiek  worden verzonden en ontvangen. In deze laag worden de hardware,  connectoren, kabels en signaalspecificaties gedefinieerd.             Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  22  2.4.3. Werking OSI­model  Wanneer de Toepassingslaag een pakket met gegevens ontvangt van een toepassing  of service, verwerkt de laag de informatie, voegt er een header aan toe en geeft de  informatie door aan de volgende OSI‐laag (Presentation). De gegevens worden  uiteindelijk door het hele model naar de fysieke media gestuurd, waarbij elke laag  een bewerking uitvoert en header informatie toevoegt. De gegevens worden  vervolgens via het netwerk verstuurd naar de doelcomputer. Deze doelcomputer  ontvangt de gegevens en stuurt ze via alle lagen van het OSI‐model naar de toplaag  (Application). Elke laag voert een bewerking uit, verwijdert de bijbehorende header  informatie en stuurt de gegevens door naar de volgende laag.      figuur 8: OSI‐model   Iedere laag van het OSI‐model is bewust van het bestaan van de onder‐ en  bovenliggende lagen. Daarnaast onderhoudt elke laag logische communicatie met  de corresponderende laag op de andere computer. De lagen zijn zich echter niet  bewust van de onderliggende processen die worden uitgevoerd door andere lagen.                              Kris Sabbe  3AI1E0    Oostende 2007‐2008        Aansturen LED display via art‐net  23  2.4.4. UDP in het OSI­model  UDP is de afkorting van User Datagram Protocol en bevindt zich in de transportlaag  of vierde laag van het OSI‐model. UDP is één van de basisprotocollen van het  Internet en opereert op hetzelfde niveau als TCP.  Vergeleken met TCP is UDP minder betrouwbaar, maar dankzij een lagere overhead  (zoals handshaking, en verificatie) ook sneller. Zo biedt UDP geen garantie dat de  gegevens werkelijk aankomen. Een aantal protocollen die via UDP werken  implementeren zelf een verificatiemethode. Hiermee zorgen ze effectief voor een  vervanging van de functionaliteit die TCP heeft op dit gebied.  UDP wordt veel gebruikt bij toepassingen waar het snel overdragen van de gegevens  en een korte reactietijd zeer belangrijk is, en het minder erg is dat er gegevens  verloren kunnen gaan.  De UDP hoofdstructuur is als volgt.    figuur 9: UDP structuur   Source port  Source port is een optioneel veld. Wanneer dit gebruikt wordt geeft dit de poort  weer van de zender. Dus data die teruggezonden moet worden zal ook naar deze  poort verstuurd worden.  Wanneer deze poort niet gebruikt wordt is deze waarde gelijk aan nul.  In deze toepassing is deze poort 6454. Dit is de standaard poort voor art‐net.    Destination port  Dit is de poort waar de data op verzonden wordt. Hier is deze ook 6454.    Lengte  De lengte van het totale pakket. Hier is dit steeds 538 bytes.    Checksum  Veel manieren om gegevens te lezen, over te brengen of op te slaan zijn niet 100%  betrouwbaar. Om te kunnen controleren of er een fout opgetreden is, kan een  controlecijfer worden toegevoegd. Dit wordt berekend uit de gegevens die zijn  gelezen of verstuurd. Achteraf wordt de checksum opnieuw berekend en vergeleken  met de opgeslagen of meegestuurde versie. Als de twee niet overeenkomen is er  een fout opgetreden. De foutdetectie van een checksum is beperkt: bij een  meervoudige fout zal het controlecijfer wel kunnen kloppen.    Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  24  Data  De data zelf van het pakket is 530 bytes. Hierin bevinden zich de informatie van de  lichttafel en de data ervan. Op deze manier is het dan ook mogelijk om verschillende  lichttafels binnen te lezen.         figuur 10: UDP frame                         Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  25  2.5. DVI  DVI (Digital Visual Interface) is ontworpen in 1998 door DDWG (Digital Display  Working Group), en was oorspronkelijk bedoeld als interface voor monitoren.  Sindsdien is het gebruik echter zodanig uitgebreid dat het een standaard in wording  is voor digitale gegevensoverdracht. Het hoofdkenmerk aan dit type interface is dat  het een verbinding tot stand kan brengen tussen computer en monitor, met een  zeer hoge bandbreedte (tot 165 MHz voor een enkele verbinding). Hierdoor kan  men ongecomprimeerde videosignalen doorsturen naar de monitor, zodat niet  enkel de beeldprestaties veel hoger zijn, maar eveneens de snelheid van update en  reactie. DVI brengt een volledig digitaal signaal zonder enig gegevensverlies.  Bovendien wordt elke pixel gedefinieerd door 24‐bits RGB gegevensstroom.     Men kan deze interface echter opdelen in 4 verschillende types:    • DVI‐A  Deze interface stuurt enkel een analoog signaal door, met als nut om een  gewone connector overgang te maken. Dit type is gelijkwaardig met DVI‐I,  zoals onderstaande:  • DVI‐I  Dit was de oorspronkelijke interface, die een combinatie maakte van een  digitaal en analoog signaal dat compatibel was met Pc's voorzien van een CRT  (of eventueel een digitale) monitor. Kortom, een oplossing om de weg tussen  analoog en digitaal onzichtbaar te maken.  • DVI‐D   De interface die enkel een digitaal signaal draagt. De opmars van DVI‐D is nog  volop bezig en vele consumentenproducten (zoals digitale televisie en  monitors of Tv‐toestellen) dragen deze interface al met zich mee.  • DVI‐D HDCP  Verschillend van DVI‐A, DVI‐I en DVI‐D draagt dit type interface de codering  HDCP met zich mee om illegaal gebruik tegen te gaan.    Verschil tussen Barco DVI en standaard DVI  Bij het Barco DVI‐signaal worden enkele kanalen gewisseld waar de kleuropbouw  gebeurt. In deze toepassing gebeurt dit in de FPGA. Indien je er een standaard DVI‐ signaal wilt hebben kan je dit bekomen door een softwareaanpassing in de FPGA.  Barco heeft de 24 kanalen (8bit rood, 8bit groen en 8 bit blauw) omgewisseld die  door de TFP‐410 omgezet word naar een DVI‐signaal.              Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  26  Connector  De signalen zijn gebalanceerd; als de spanning op de + lijn omhoog gaat, daalt de  spanning op de bijbehorende ‐ lijn en omgekeerd; de impedantie van iedere  verbinding bedraagt 100 Ohm.      figuur 11: DVI connector        Pin  Functie  Pin  Functie  1  TMDS Data 2‐ 16  Hot Plug Detect  2  TMDS Data 2+  17  TMDS data 0−  3  TMDS Data 2/4 schild  18  TMDS data 0+  4  TMDS Data 4−  19  TMDS data 0/5 schild  5  TMDS Data 4+  20  TMDS data 5−  6  DDC klok 21  TMDS data 5+  7  DDC data 22  TMDS klokschild  8  Analoge Verticale Sync  23  TMDS clock+        9  TMDS Data 1−  24  TMDS clock−  10  TMDS Data 1+  C1  Analoog Rood  11  TMDS Data 1/3 schild  C2  Analoog Groen  12  TMDS Data 3−  C3  13  TMDS Data 3+  C4  Analoog Blauw  Analoge Horizontale  Sync  14  +5V  C5  Analoge GND  15  GND                              Kris Sabbe    tabel 3: pinaansluiting DVI 3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  27  2.6. RS­232  Communicatie zoals die gedefinieerd is in de RS232 standaard is een asynchrone  seriële communicatie methode. Het woord serieel betekent dat de informatie bit  voor bit wordt verzonden. Asynchroon leert ons, dat de informatie niet op vooraf  afgesproken momenten wordt verzonden. Het verzenden van data kan op elk  willekeurig moment starten en het is daarbij de taak van de ontvanger om te  detecteren wanneer een boodschap start en eindigt. Asynchrone communicatie  heeft zowel voordelen als nadelen.    Signaalniveaus  De RS‐232 standaard definieert de signaalniveaus die corresponderen met een  logische één en een logische nul als plus of min 3 tot 15 volt; het gebied rond nul  volt is geen geldig RS‐232 niveau. Een logische één heeft een negatief signaalniveau,  wordt 'mark' genoemd en heeft als functionele betekenis UIT (OFF), een logische nul  is positief, wordt 'space' genoemd en heeft als functionele betekenis AAN (ON). De  standaard specificeert een maximum van 25 V. Afhankelijk van de gebruikte voeding  worden veelal signaalniveaus van ±5 V, ±10 V, ±12 V en ±15 V gebruikt. Een  beroemde omzetter van en naar TTL‐niveau is het Maxim‐ic MAX232. Ook de  snelheid waarmee de signalen moeten veranderen (stijg‐ en daaltijd of slew rate) is  vastgelegd in de norm.    Startbit  RS232 definieert een asynchrone manier van communiceren. Dit betekent dat het  verzenden van een datawoord op elk moment kan beginnen. Het op elk moment  kunnen starten levert enkele problemen op aan de ontvangstzijde om te detecteren  welk bit het eerste te ontvangen bit van een datawoord is. Om dit probleem op te  lossen wordt elk datawoord vooraf gegaan door een signaleringsbit. Dit  signaleringsbit, ook bekend als startbit, is altijd herkenbaar aan het space signaal  niveau. Omdat de lijn in mark status is als er geen communicatie geschiedt, kan de  startbit eenvoudig door de ontvanger worden herkend.     Databits  Direct na de startbit worden de databits verzonden. Een bitwaarde 1 zorgt ervoor  dat de lijn in de mark status gaat terwijl de bitwaarde 0 wordt gerepresenteerd door  de space status. Het minst significante bit wordt altijd als eerste verzonden.     Pariteitsbit  Om transmissiefouten te kunnen detecteren is het mogelijk om aan het eind van het  datawoord automatisch een pariteitsbit te laten genereren. 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 het ontvangen pariteitsbit overeen  komt met de berekende waarde.     Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  28  Stopbits  Veronderstel, dat de ontvanger de startbit gemist heeft omdat er op dat moment  ruis op de lijn aanwezig was. In dat geval start de ontvangst met het eerstvolgende  databit die een space waarde heeft. Hierdoor wordt verminkte data ontvangen. Een  mechanisme moet aanwezig zijn om hersynchronisatie te bewerkstelligen. Om dit te  doen is het begrip framing geïntroduceerd. Framing betekent, dat de databits en het  pariteitsbit 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 startbit wordt altijd aangegeven met het space niveau, het stopbit  met mark niveau. Als de ontvanger een andere waarde dan mark detecteert op het  moment dat het stopbit had moeten worden ontvangen, dan is daarmee  gedetecteerd dat er een framing error heeft plaatsgevonden. Hierdoor wordt een  foutconditie in de UART gezet. Vervolgens wordt geprobeerd op nieuw  binnenkomende bits te hersynchroniseren.   Om opnieuw te synchroniseren zoekt de ontvanger in de binnenkomende gegevens  naar correcte paren van start‐ en stopbits. Dit werkt, zolang er genoeg variatie is in  de bitpatronen van de binnenkomende datawoorden. Als bijvoorbeeld de  datawaarde 0 continu verzonden wordt kan echter in het geheel geen  hersynchronisatie plaatsvinden.     Aansluitingen                               figuur 12: RS‐232 connector Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  29  2.7. Barco MiStrip en control box  De Barco MiStrip is een balk van 1,5 meter op 3,75 cm die 128 multicolor SMD LED’s  bevat. Met één LED kunnen ongeveer 16,7 miljoen kleuren gemaakt worden. De  MiStrip kan door zijn vorm in verschillende toepassingen gebruikt worden, zowel  indoor als outdoor. Figuur 13 is een afbeelding van een MiStrip.  De MiStrip heeft een  horizontale en verticale  kijkhoek van 145°. De  helderheid van één MiStrip is  6100 cd/m².    figuur 13: MiStrip     De MiStrip kan wegens een degelijke onderconstructie veel gewicht dragen.  In figuur 14 wordt de MiStrip gebruikt als podium op het concert van George  Michael. Hiervoor werden ongeveer 3000 MiStrip’s gebruikt om een display van 9  meter breed op 25 hoog te maken.                              figuur 14: MiStrip’s gebruikt als podium Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  30    In figuur 15 werden de MiStrip’s  gebruikt als LED vloer op de  Frankfurt autoshow 2007. De  MiStrip is dus zelfs sterk genoeg om  auto’s en mensen te dragen.                                  figuur 15: MiStrip’s gebruikt als LED vloer     Voor het aansturen van de MiStrip’s is er een control box nodig. Deze control box  wordt aangestuurd met een DVI signaal. De control box stuurt dan de verschillende  MiStrip’s aan. Via RS‐232 kunnen de MiStrip’s geprogrammeerd worden zodat je kan  instellen op welke positie een MiStrip hangt. Deze signalen worden ook via de DVI  kabel verzonden naar de control box die dan de MiStrip’s programmeert. Met één  control box kunnen 20 MiStrip’s van 1500mm aangestuurd worden. Dit wegens  vermogenbeperkingen.                          Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  31  3. Keuze van de componenten  3.1. Picdem.net2 development board  Met het Picdem.net2 development board, die de PIC18F97J60 bevat en ethernet  ondersteuning heeft, is de interface gemaakt om de UDP pakketten te ontvangen  verstuurd via de Net‐lynx. Met de PIC wordt ook  de data van de 24 kanalen van de lichttafel  uitgelezen.  Ik heb voor dit bord gekozen omdat dit  aanwezig was op mijn stageplaats en het alle  eigenschappen had die ik nodig had voor het  uitwerken van mijn project.  Nadat het uitlezen van de pakketten werkte ben  ik begonnen met zelf een schakeling te maken  met behulp van de datasheet van het  development board zodat ik dit bord niet  helemaal in mijn eindwerk moest gebruiken.    figuur 16: Picdem.net2 development board     3.2. Pic 18F97J60  Deze PIC is een 1 Mbit flash microcontroller met ethernet ondersteuning. Deze PIC  heb ik gekozen omdat deze ook in het Picdem.net development board zit.  De PIC is IEEE 802.3™ compatibel en heeft geïntegreerde MAC en 10Base‐T PHY. De  PIC heeft een verzend/ontvang buffer van 8‐Kbyte SRAM om data die ontvangen of  verzonden wordt op te slaan.  Ook heeft de PIC 2 8‐bit in/uit poorten die 25 mA kunnen leveren. Ideaal voor het  aansturen van LED’s of kleine relais.  Met de MPLAB ICD 2 wordt de PIC geprogrammeerd. Dit toestel wordt aangesloten  op de pc door middel van een USB connector. Met dit toestel kan je het programma  ook debuggen.            Kris Sabbe                 figuur 17: MPLAB ICD 2 3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  32  3.3. Altera cyclone I FPGA  FPGA staat voor Field Programmable Gate Array.  Een FPGA valt onder de programmeerbare logica. Hieronder verstaat men  geïntegreerde circuits (chips) waarvan de functie na de fysieke productie door de  klant kan worden geconfigureerd. FPGA's zijn ontstaan uit de behoefte om grote  digitale schakelingen in relatief kleine aantallen te realiseren. Vóór het FPGA‐ tijdperk moest alles met logische bouwstenen samengesteld worden, hetgeen erg  veel tijd en printruimte kostte. Sinds de komst van de programmeerbare logica  kunnen we zo'n schakeling als een soort programma schrijven (in bijvoorbeeld VHDL  of Verilog), waarna het voor de chip gecompileerd wordt en in de chip "geladen".   Op dezelfde manier is de schakeling ook weer eenvoudig te wijzigen. De basis van  een FPGA is een array van identieke cellen welke op een aantal gedefinieerde  manieren geconfigureerd kan worden. Zo'n cel bevat altijd tenminste een  geheugenplaats (flipflop) voor 1 bit aan informatie met daarbij enkele logische  poorten (AND, OR) welke de inhoud van deze of andere geheugenplaatsen  controleren/bepalen.   Door nu verschillende cellen aan elkaar te knopen kunnen verschillende functies  worden gerealiseerd. De uiteindelijke functie van de FPGA wordt bepaald door de  configuratie van iedere cel en de onderlinge verbindingen. Op deze manier kunnen  zeer complexe digitale functies worden verkregen.    Naast de FPGA is ook de CPLD (Complex Programmable Logic Device) een veel  gebruikt programmeerbaar logisch IC. De goedkopere FPGA's worden meestal  gebruikt in schakelingen waar men eenvoudige logische bewerkingen van signalen  nodig heeft. (vergelijken, optellen aftrekken, verbindingen leggen, ...) Dit kan bv  nuttig zijn om verschillende devices aan elkaar te hangen, of een adresdecoder te  maken welke de processor aan de RAM, ROM en I/O hangt.   Ook op het vlak van beveiliging tegen namaak is een FPGA interessant. Doordat de  verbindingen in de FPGA niet zichtbaar zijn, is het interne programma zeer moeilijk  te achterhalen. Men kan op de schakeling nu data gaan coderen op zo'n manier dat  buitenstaanders er niets meer van snappen.    Ik gebruik een FPGA van Altera. Zo’n chip is  opgedeeld in 4 banken.  Het voordeel van deze banken is dat ze op een  verschillende spanning gevoed kunnen worden.  Zodanig dat de I/O van deze bepaalde bank dan op  dezelfde spanning werkt. Ze kunnen gevoed worden  met volgende spanningen: 1.5‐V, 1.8‐V, 2.5‐V, en  3.3‐V. In mijn eindwerk is dit niet nodig, maar dit  kan zeer handig zijn bij het gebruiken van IC’s die op  lagere of hogere spanningen werken.  figuur 18: banken FPGA   Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  33  Cyclone Device eigenschappen    (1) Hierbij zijn de klokpinnen bij gerekend.     Tabel 4: eigenschappen FPGA   Het kan met zijn 64 single purpose IO's geprogrammeerd worden naar de gebruiker  zijn wensen. De Cyclone is opgebouwd uit logische elementen. Met deze logische  elementen kan men verschillende hardwarecomponenten programmeren,  bijvoorbeeld tellers, flipflops, registers, enzovoort. Dus: hoe meer logische  elementen hoe meer men kan programmeren. Deze FPGA heeft 2910 Logic  Elements (LEs). Deze Logic Elements worden nog eens per 10 gegroepeerd tot een  LAB, een Logic Array Block. De LAB’s worden op hun beurt  gegroepeerd in rijen en kolommen. Deze rijen en kolommen kan men onderling  verbinden door de chip te programmeren en zo bekomt men een snel werkende  hardware ontwerp. Er zijn ook lijnen en IO’s die geoptimaliseerd zijn om te  functioneren als kloklijn.    Kort overzicht:  tabel 5: overzicht EP1C3   Een nadeel van de FPGA die wij gebruiken is dat deze geen flash geheugen heeft. Dit  wil zeggen dat we een externe Eprom nodig hebben om ons programma in te laden.  Anders telkens we iets zouden programmeren, en we de spanning onderbreken, zou  dit terug gewist worden. Dit is zeker niet gebruiksvriendelijk.   In het gamma van Altera is dit voorzien, zodanig dat we hetzelfde merk kunnen  nemen. Zo zijn we zeker dat  ze compatibel zijn met elkaar.  Wij gebruiken een EPC1  bouwsteentje. Dit IC heeft 8  pinnen en is gemakkelijk te  verbinden met de FPGA. Dit is  het aansluitingsschema met  de FPGA.  figuur 19: serial configuration device       Kris Sabbe  3AI1E0    Oostende 2007‐2008        Aansturen LED display via art‐net  34    figuur 20: programmeren via AS en JT    Het programmeren kan op verschillende manieren gebeuren. Hieronder vind je het  Cyclone FPGA configuratie tabel.    tabel 6: verschillende programmeermogelijkheden FPGA   Ik gebruik de Active serial (AS) configuratie. Er is ook een JTAG configuratie voorzien.  AS: In de AS configuratie, worden de Cyclone FPGA’s gevormd door de nieuwe  seriële configuratie apparaten te gebruiken. Deze configuratie apparaten zijn low  cost met een niet veranderlijk geheugen. Kenmerkend heeft deze een eenvoudige  vier pin’s interface en een kleine omvang. Deze eigenschappen maken dit een ideale  oplossing voor het vormen van goedkope Cyclone FPGA’s. De seriële configuratie  verstrekt een seriële interface om data tot de configuratie toegankelijk te maken.  Kris Sabbe  3AI1E0    Oostende 2007‐2008        Aansturen LED display via art‐net  35  Gedurende deze configuratie, leest de Cyclone FPGA de data via de seriële interface  in. Deze data wordt gereduceerd indien nodig. Hun SRAM cellen worden ook  geconfigureerd. De seriële configuratie apparaten hebben een vier‐pin’s interface:  seriële klokingang (DCLK), seriële data uitgang (DATA), AS data ingang (ASDI), en een  actief chip select (nCS). Deze 4 pin’s interface verbindt de Cyclone FPGA zoals in  figuur 20.   JTAG: JTAG wordt gebruikt voor het monitoren van de hardware. JTAG staat voor:  Joint Test Action Group. Met deze techniek kan van fan tot cpu worden  gecontroleerd, zolang deze maar voldoet aan de standaard (IEEE1149.1). Een FPGA  dat gebruikt wordt in JTAG‐mode gebruikt vier vereiste pinnen: TDI (Test Data  Input), TDO (Test Data Output), TMS (Test Mode Select) en TCK (Test Clock Input).  De drie JTAG ingangspinnen, TCK, TDI en TMS, hebben interne pull‐up weerstanden  die liggen tussen 20 en 40 kΩ. Alle gebruikte I/O pinnen zijn tri‐state tijdens de JTAG‐ configuratie. Tijdens de JTAG‐configuratie, wordt de data gedownload in de FPGA.  Hiervoor kunnen verschillende kabels gebruikt worden, nl. de USB Blaster,  ByteBlaster II, ByteBlasterMV of MasterBlaster. In mijn toepassing gebruik ik de USB  blaster.                                                      Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  36  3.4. TFP­410  De TFP410 is een 64 pins Digital Transmitter in een  TQFP package van Texas Instruments. Het is DVI  compliant en kan functioneren op een  voedingsspanning van 3,3Volt.   Dit IC zet 23 bit of 12 bit digitale beeld data om in  differentiële/analoge beeld data op een maximale klok  van 165 MHz. Deze klok kan dual edge zijn. Het IC is  ook aanstuurbaar via I²C.  In deze toepassing zetten we op de negatieve flank van  een 32 MHz klok, 24 bit kleurdata om in 3 differentieel  datalijnen en 1 differentiële klok.    figuur 21: pin layout TFP‐410                                  Kris Sabbe    figuur 22: blokschema TFP‐410  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  37  3.5. HIN202  Dit ic is een omzetter van RS‐232 naar TTL en omgekeerd. Het grote voordeel van dit  IC is dat het op een spanning van +5V werkt. Door het aansluiten van vier  condensatoren genereert dit IC door middel van een charge pump en een voltage  convertor een spanning van +10V en ‐10V.                  Kris Sabbe    figuur 23: Blokschema HIN202 3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  38  3.6. MAX489  Dit IC wordt gebruikt voor het doorzenden van het RS‐232 signaal over de DVI‐kabel.  De reden daarvoor is dat we een gebalanceerd signaal nodig hebben om mee te  zenden met de DVI‐kabel.            figuur 24: Aansluiting MAX489  3.7. Ontkoppelcondensatoren  Waarom ontkoppelcondensatoren  In elk elektronisch apparaat willen we voorkomen dat de diverse deelcircuits elkaar  beïnvloeden. Eén van de beïnvloedingsmogelijkheden is via de gemeenschappelijke  voedingsspanning. Ontkoppelcondensatoren (tussen voedingsspanning en massa)  moeten er voor zorgen dat signalen van het ene circuit niet via de voedingsleidingen  in een ander circuit terecht komen.  Vooral in digitale circuits waar vaak zeer hoogfrequente signalen omgaan moeten  goede ontkoppelcondensatoren gebruikt worden, en deze moeten ook met zo kort  mogelijke verbindingen aangesloten worden op de geïntegreerde circuits.  Dit zal bij alle IC’s gebeuren.                          Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  39  3.8. Lichttafel en netlynx  Als lichttafel wordt de Showtec Showmaster 24 gebruikt. Dit is een 24 kanaal  lichttafel die zijn data in DMX uitzend. Om deze data om te zetten naar art‐net  wordt de Net‐lynx van Artistic license.   Met de lichttafel kunnen er 8 MiStrip’s aangestuurd worden als je voor elke MiStrip  3 kanalen gebruikt. Telken één kanaal voor rood, groen en blauw. Er kunnen ook  programma’s of scènes opgeslagen worden in de tafel.  Met de Net‐lynx wordt de data van de lichttafel omgevormd van DMX naar Art‐net.  Figuur 25 is een afbeelding van de lichttafel en net‐lynx                                      Kris Sabbe  figuur 25: Showmaster 24 en Net‐lynx 3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  40  3.9. Software  3.9.1. Mplab  Met dat softwarepakket bijgeleverd bij het Picdem.net2 development board is het  programma voor de PIC gemaakt. Als basis voor het programma is een  demoprogramma overgenomen waarin de initialisatie van de PIC en  ethernetverbinding gebeurt. Dit programma is dan uitgebreid zodat je er UDP‐ paketten mee kan ontvangen, de data eruit lezen en die data doorzenden naar de  FPGA. Het programmeren gebeurt in c18, een soort C taal.    3.9.2. Quartus II  Met dit softwarepakket, die gratis te downloaden is via een studentenlicentie, wordt  het programma voor de FPGA gemaakt.    3.9.3. Microsoft Network Monitor 3.1  Met Microsoft Network Monitor 3.1, die gratis te downloaden is heb worden de  UDP pakketten, verzonden door de Net‐lynx, binnengelezen om te zien hoe de UDP‐ pakketten eruit zien. De data is telkens omkaderd in blauw. In figuur 26 staan alle  schuifbalken op de lichttafel omhoog. In figuur 27 staan enkel de eerste en laatste  schuifbalk omhoog.          figuur 26: ontvangen UDP‐pakket met alle schuifbalken omhoog  Kris Sabbe  3AI1E0  Oostende 2007‐2008          Aansturen LED display via art‐net  41  figuur 27: ontvangen UDP‐pakket met de eerste en laatste schuifbalk omhoog    Kris Sabbe      3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  42  3.9.4. Barco director toolset V1.6  Met deze software worden door middel van een RS‐232 verbinding de LED‐displays  ingesteld. Op de eerste plaats wordt de positie van de displays ingesteld zodat de  control box weet welk beeld er op welk display moet verschijnen.  Alsook kan de helderheid en kleurintensiteit ingesteld worden. De LED‐displays  kunnen ook gekalibreerd worden zodat elk afzonderlijk display dezelfde helderheid  en kleurintensiteit vertoont.  Op figuur 28 kan je de helderheid, kleurintensiteit en frequentie instellen van de  displays.                            Kris Sabbe    figuur 28: instellen MiStrip 3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  In figuur 29 zie je de acht MiStrip’s die  aan de control box hangen. De vier  bovenste hangen aan één uitgang van de  control box en zijn rood gekleurd. De vier  onderste hangen aan een tweede uitgang  van de control box en zijn groen gekleurd.  De kleur van de MiStrip’s zelf is dan ook  gelijk aan de kleur zoals weergegeven op  het beeldscherm.  Opmerking: de kleur van de drie bovenste  displays wijkt af omdat op deze MiStrip’s  een diffusor is geplaatst. Deze verspreid  het licht beter dan een gewone MiStrip.                         Kris Sabbe  43  figuur 29: MiStrip’s in testopstelling   figuur 30: MiStrip’s geplaatst in director toolset 3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  44  In figuur 31 wordt de positie van de displays toegewezen. De MiStrip’s die ik heb  gebruikt heb ik ingesteld op X positie 50 en Y positie 50.                                                         De horizontale resolutie is gelijk aan  112 pixels. Dit is het aantal LED’s dat  één MiStrip bezit.  De verticale resolutie is 8 pixels. Dit is  het aantal MiStrip’s dat gebruikt is.        figuur 31: Instellen positie MiStrip’s             Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  45  4. Uitwerking en problemen  4.1. Uitwerking  Ik ben begonnen met de software te schrijven voor het uitlezen van de data uit de  UDP pakketten. Daarvoor heb ik gebruikt gemaakt van het Picdem.net2  development board van Microchip.  Eerst heb ik enkele basisprogramma’s gemaakt  om te leren programmeren in Mplab en te zien wat de functies van het bord zijn.  Na enkele basisprogramma’s gemaakt te hebben ben ik begonnen met het  bestuderen van een demoprogramma, bijgeleverd bij het development board,  waarin de ethernet initialisatie gebeurt. Na het bestuderen en begrijpen van dit  demoprogramma heb ik aanpassingen gemaakt zodat ik er UDP pakketten mee kon  lezen. Na het lezen van de pakketten moest ik de data ook nog uit deze pakketten  halen. Dit heb ik getest door uit dat ontvangen pakket de data van de eerste  schuifbalk op de lichttafel te halen, en deze op de LED’s te plaatsen.  Nadat dit werkte heb ik mijn programma nog verder uitgebreid zodat ik alle 24  kanalen van de lichttafel kon uitlezen. Ook heb ik er een beveiliging ingestoken  zodat UDP pakketten die niet van de lichttafel komen geen invloed hebben op de  data zodat er geen foute data binnen gelezen kan worden.    Nadat dit werkte ben ik begonnen met het maken van de schakeling en print. De  schakeling van de PIC heb ik grotendeels overgenomen uit de datasheet van het  Picdem.net2 development board.  De schakeling voor de FPGA is overgenomen uit de datasheet.  De schakeling voor de TFP‐410 (digitale transmitter) heb ik deels overgenomen van  een schakeling van Barco en deels uit de datasheet.    Bij de PIC heb ik vijf ingangen voor drukknoppen. Eén daarvan is de reset knop. De  andere vier zijn drukknoppen om programma’s te kiezen.   Op één uitgangsbank van de PIC, die 25 mA kan leveren, heb ik 8 LED’s aangesloten  zodat er een visuele indicatie is.   Tussen de PIC en FPGA zijn er nog eens 2 banken voorzien voor overdracht van data  en synchronisatiepulsen.    Tussen de FPGA en de TFP‐410 zijn er 34 datalijnen voorzien. 24 daarvan zijn voor de  overdracht van de kleurinformatie. Telkens 8 bits voor rood, groen en blauw. De  andere datalijnen zijn voor horizontale/verticale synchronisatie, blanking, enable,  klok, power down en keuze tussen positieve en negatieve flankdetectie.    Terwijl de print besteld was ben ik begonnen met het maken van het programma  voor de FPGA. Door een handige simulator in het softwarepakket kon ik de  programma’s ook simuleren.    Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  46  Toen ik de print heb ontvangen ben ik begonnen met het in delen solderen van de  print. Eerst de voeding. Nadien ben ik begonnen met het solderen van de PIC. Na het  solderen van de PIC heb ik die getest maar kon hem niet programmeren. Na het nog  eens goed controleren van de schakeling heb ik ondervonden dat ik twee draden  omgewisseld heb om te programmeren. Na het omwisselen van die draden werkte  het programmeren wel.    Toen de PIC werkte ben ik begonnen met het solderen van de FPGA. Tijdens het  testen bleek dat ik deze moeilijk kon programmeren. De ene keer ging dit wel maar  de andere keer kreeg ik een error tijdens het programmeren. Dit probleem heb ik  opgelost door pull‐up weerstanden te plaatsen aan de klemmen voor het  programmeren.    Nadat de FPGA werkte ben ik begonnen met het solderen van de TFP‐410. Toen ik  mijn eindwerk voor de eerste keer aansloot op een LED display kreeg ik geen beeld.  Ik heb dan de DVI signalen gemeten en deze bleken te klein te zijn. Na het  aanpassen van een weerstand was dit probleem verholpen.    Voor mijn eerste beeld op het LED display had ik een programma geschreven zodat  heel het display wit oplichtte. Nadat dit werkte ben ik begonnen met maar één  horizontale lijn aan te sturen. Dit bleek moeilijker dan verwacht want het beeld  rolde heel de tijd van boven naar beneden. Na het wijzigen van de  synchronisatiepulsen was dit probleem opgelost.    Toen heb ik enkele demoprogramma’s geschreven zodat mijn eindwerk ook beeld  op het display kan krijgen zonder dat er een lichttafel op aangesloten is. Deze  demoprogramma’s zijn:  • Lus waarin de kleuren rood, groen, blauw, wit en zwart verschijnen op het  display.  • Programma waarin het display geleidelijk aan van zwart naar wit oplicht.    Hierna ben ik begonnen met het aanpassen van de software zodat ik met de  lichttafel acht MiStrip’s kon aansturen.    Tijdens het testen heb ik ook ondervonden dat de spanningsstabilisator 7805 zeer  warm werd. Dit kwam door het feit dat de ingangsspanning 9,5V was en het IC  teveel vermogen moest dissiperen. Dit heb ik dan opgelost door enkele dioden in  serie voor de spanningsstabilisator te plaatsen.    De TFP‐410 ging redelijk rap stuk. Dit probleem was te wijten aan een vergeten  massaverbinding. Na het aansluiten van die massaverbinding was het probleem  opgelost.    Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  47  Figuur 32 is een foto van de print met de verschillende delen aangeduid.           figuur 32: gesoldeerde print     Nadat alles werkte ben ik begonnen met het maken van de behuizing. Figuur 33 is  een foto van de binnenkant van de behuizing.                                  Kris Sabbe      figuur 33: binnenkant behuizing 3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  48    4.2. Metingen  • Metingen op de voeding  De voeding heb ik als eerste gemaakt. De spanningen komen overeen met de  opgegeven spanningen in de datasheet. De spanningen zijn goed afgevlakt  want er is geen enkele rimpel waarneembaar.  Tijdens het testen ondervond ik dat de spanningsregelaar van 5V, de 7805,  redelijk warm werd. De reden hiervoor was doordat de voedingsspanning  9,6V was en het IC teveel vermogen moest dissiperen. Dit heb ik dan opgelost  door enkele dioden in serie ervoor te plaatsen zodat de voedingsspanning  daalt.      figuur 34: scoopbeeld: voedingsspanning     • Vermogenverbruik.  Het toestel gebruikt ongeveer 1,28A op een spanning van 9,48V. Het  vermogen dat het toestel gebruikt is 12,13Watt.  Eén enkele MiStrip verbruikt 46 Watt nodig wanneer deze wit beeld geeft op  de volle lichtsterkte. Dus voor de 8 MiStrip’s die ik gebruik is er 368 Watt  nodig.        Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen n LED displaay via art‐neet 49    n op de PIC C  • Metingen o Klo okfrequenttie van 25M MHz  figuur 35: sscoopbeeld d: 25MHz          o Leeespulsen vverzonden van de PIC C naar de FPGA om dee data binn nen te  lezzen. Er zijn 24 leespulsen. De to otale tijd om m de data te verzend den uit  dee PIC en bin nnen te lezen in de FP PGA is 24,2 20µs.         Kris Saabbe  Figuur36: scoopbeeld d: leespulsen n   3AI1E0 O Oostende 2007‐2008        50  Aansturen n LED displaay via art‐neet   o Tijd van één leespuls       figuur 37: scoopbeeld d: één leespuls   wee leespu ulsen  o Tijd tussen tw              Kris Saabbe  figuur 38: sscoopbeeld d: tijd tussen n 2 leespulseen  3AI1E0   O Oostende 2007‐2008        Aansturen LED display via art‐net  51    o 5‐bits teller die meegezonden wordt zodat de FPGA weet welke data  hij ontvangt.                  Kris Sabbe  figuur 39: scoopbeeld: Teller   3AI1E0  Oostende 2007‐2008        Aansturen n LED displaay via art‐neet 52    n op de FPG GA  • Metingen o Klo okfrequenttie van de FPGA. Deze frequenttie is 32MH Hz en word dt  op pgewekt meet een kristaloscillato or.         figuur 40: sscoopbeeld:: 32MHz   H_sync ben neden  o Daata enable boven en H        Kris Saabbe  figuur 41: sscoopbeeld:: data enable en H_syn nc  3AI1E0   O Oostende 2007‐2008        Aansturen n LED displaay via art‐neet 53    o H__sync boven en V_Syn nc beneden.    f figuur 42: s coopbeeld: H_sync en V_sync        • Metingen n op de TFP P‐410  o Dee klok van 3 32MHz, op pgewekt do oor de VCO O, wordt oo ok aangeslo oten op  dee TFP‐410. D Deze klok h hebben we e nodig om m een beeld d te genere eren  van 840 pixels op 635 p pixels met een refresh rate van 60Hz.  40*635*60 = 32MHz. 84 Heet bovenstee beeld is TTXC‐ en hett onderste TXC+.  Kris Saabbe  3AI1E0 O Oostende 2007‐2008        Aansturen n LED displaay via art‐neet    figuur 43: sscoopbeeld d: TXC‐ en TX XC+ 54    • Netwerkb belasting  De UDP p pakketten w worden meet een gem middelde sn nelheid van n 11,2kB/s  verzonden. Dit is geemeten wanneer de lichttafel co onstant an ndere data  d door gebrruik te makken van de e fader. Perr uur komtt dit dan on ngeveer  doorzend overeen m met 40MB.    40416KB Æ Æ 39,47MB B.  336,8KB ** 2 * 60 = 4                  Kris Saabbe    figuur 44: netwerkbeelasting 3AI1E0 O Oostende 2007‐2008        Aansturen LED display via art‐net  55  4.3. Schakeling  1. Voeding  Voeding van 8V, 5V, 3.3V en 1.5V.  2. Drukknoppen  Eén drukknop om de PIC te resetten en vier drukknoppen voor keuze tussen  programma’s.  3. Connector programmeren PIC  Via een RJ11 connector programmeren we de PIC.  4. Ethernet connector  Standaard ethernet connector met 2 LED’s.  5. Kristal 25MHz  Klok met een frequentie van 25MHz voor de PIC.  6. LED’s  8 LED’s die aan een uitgang van de PIC hangen ter indicatie.  7. PIC18F97J60  Met deze PIC gebeurt de ethernet interface en het lezen van de UDP pakketten.  8. Connectoren programmeren FPGA en EPC1  Connectoren voor het programmeren van de FPGA en de EPC1 (serial  configuration device).  9. FPGA  FPGA, Altera Cyclone I. Met deze FPGA gebeurt de beeldopbouw.  10. VCO 32MHz  Voltage controlled oscillator. Klokfrequentie van 32MHz voor de FPGA.  11. EPC1  De FPGA verliest zijn programma als de voedingsspanning afgelegd is. Met de  EPC1 (serial configuration device) programmeren we de FPGA als we de spanning  van het toestel aanleggen.  12. RS232 verbinding  Verbinding voor het in te stellen van de MiStrip’s. (O.a. helderheid, positie)  13. TFP410  Dit is een digitale omzetter en zet de beeldopbouw gegenereerd in de FPGA om  naar een DVI signaal.  14. DVI connector  DVI connector om het DVI beeld aan te sluiten op een control box.                    Kris Sabbe  3AI1E0  Oostende 2007‐2008                                                                                              Aansturen LED display via art‐net  56    figuur 45: schakeling deel 1 Kris Sabbe  3AI1E0  Oostende 2007‐2008                                                                                              Kris Sabbe  Aansturen LED display via art‐net  57  Figuur 46: schakeling deel 2 3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  58  4.4. Ontwerp van de print  Bij het ontwerpen van de print moest ervoor gezorgd worden dat alle  voedingsspanningen aan de ic’s ontkoppeld werden. Dit om ervoor te zorgen dat er  geen stoorpieken op de voeding kwamen.  Ook moest ervoor gezorgd worden dat de verbindingen voor de ethernet verbinding  en het DVI‐signaal zo kort mogelijk waren. De reden daarvoor is de hoge frequenties  van deze signalen.  De print die ik gemaakt heb, is een vierlaags print geworden. De bovenlaag en de  twee tussenlagen zijn alle drie lagen waar gewone verbindingen gemaakt worden.  De onderste laag is het massavlak.    4.5. Beeldopbouw  4.5.1. Geschiedenis  De geschiedenis van bewegend beeld begon bij de film. Men nam dia’s van een  bepaalde gebeurtenis. Deze dia’s projecteerden ze op een wit doek met een  zodanige snelheid dat het oog niet kon onderscheiden dat het stilstaande beelden  zijn. Om precies te zijn is deze snelheid boven 25 beelden per seconde. Hierna  begon men de ontwikkeling van de kathodestraalbuis.  Het principe hiervan is dat men een elektronenstroom afschiet naar een  fluorescerende laag. Deze laag begint op  te lichten wanneer er elektronen  tegenvallen. Met spoelen kan men deze  elektronenstraal afbuigen en kan er een  beeld gevormd worden. Wanneer we nu  deze beelden vlug laten veranderen zien  we een bewegend beeld.  Vandaag zijn er digitale beeldschermen.  Deze werken niet meer met een  elektronenstraal die op een fluolaag  worden geprojecteerd, maar wel met  led’s die met een sturingseenheid wel of  niet oplichten.          figuur 47: kathodestraalbuis          Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  59  4.5.2. Blanking  Om de spoelen van rechts naar links te laten bewegen na een geprojecteerde lijn  moest een snelle verandering in de spoelen teweeg gebracht worden, hetzelfde  geldt voor de beweging op het einde van het beeld wanneer men terug naar boven  moet met de elektronenstraal. Dit is onmogelijk omdat de spoelen anders een te  hoge inductiestroom zouden genereren.  Blanking is de oplossing voor dit probleem. Tijdens de terugkeer van de  elektronenstraal zorgt men ervoor dat er geen beeld geschreven wordt, dit noemen  we blanking omdat we de elektronenstraal uitschakelen.  In digitale beeldschermen moet de blanking tijd in principe niet zo groot zijn als bij  analoge beeldschermen omdat er in een digitaal beeldscherm geen mechanische  veranderingen nodig zijn voor het weergeven van beeld. Dit wordt meestal wel  gedaan voor de compatibiliteit met analoge beeldschermen.   In mijn eindwerk genereer ik een beeld met een resolutie van 840 x 635 pixels met  een refresh rate van 60Hz. Het beeld dat zichtbaar is heeft een resolutie van 830 x  625 pixels. Voor zowel de verticale als horizontale synchronisatie blanking  zijn 10  klokpulsen genomen.    figuur 48: beeldopbouw         Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  60  4.6. Code PIC  Voor het uitwerken van de code voor de PIC is een demoprogramma, bijgeleverd bij  het Picdem.net2 development board, overgenomen. In dit demoprogramma  gebeurt de initialisatie van de PIC en de ethernetverbinding.  In dit demoprogramma is dan code toegevoegd voor het uitlezen van UDP‐ pakketten. Uit deze pakketten wordt dan de data van de 24 schuifbalken gehaald.  Deze data wordt dan doorgezonden naar de FPGA.     Code voor het instellen van het IP en MAC adres  Remote.IPAddr.Val=0x47071802; //IP-adres van het toestel die de UDP-paketten verzendt in hex formaat 2.24.7.71 Remote.MACAddr.v[0]=0x00; //MAC-adres van het toestel dat uitzendt Remote.MACAddr.v[1]=0x06; Remote.MACAddr.v[2]=0xA6; Remote.MACAddr.v[3]=0x01; Remote.MACAddr.v[4]=0x07; Remote.MACAddr.v[5]=0x47;     Openen van een UDP­socket  // Openen van een UDP socket op poort 0x1936 MySocket = UDPOpen(0x1936, &Remote, 0x1936); // voor art-net altijd poort 0x1936 (6454 decimaal)     Binnenlezen van de data  UDPGet(&c); //Eerste byte van het UDP-pakket lezen if (c==0x41) //Als deze byte gelijk is aan 0x41 (A), dan gaan we verder { while(UDPGet(&c)) //Lezen van het UDP-pakket { udpRxBuf[udpRxBufPut++] = c; //Byte lezen van UDP-pakket en opslaan in buffer if (udpRxBufPut >= 49) //Als we 49 bytes binnen gelezen hebben stoppen we. We hebben dan namelijk alle data die we moeten hebben. { break; //uit de lus springen als we 49 bytes hebben binnengelezen } } Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  61  Verzenden van de data    ontv = udpRxBuf[17]; PORTF = ontv; PORTDbits.RD2 = 0; PORTDbits.RD3 = 0; PORTDbits.RD4 = 0; PORTHbits.RH1 = 0; PORTHbits.RH2 = 0; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0; //De data van de eerste schuifbalk staat op positie 17 //De data op PORTF plaatsen //teller =00000 //teller //teller //teller //teller //lees = 1 //lees = 0 ontv = udpRxBuf[18]; PORTF = ontv; PORTDbits.RD2 = 1; PORTDbits.RD3 = 0; PORTDbits.RD4 = 0; PORTHbits.RH1 = 0; PORTHbits.RH2 = 0; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0; //Data van de tweede schuifbalk //Data op PORTF plaatsen //teller =00001 ontv = udpRxBuf[39]; PORTF = ontv; PORTDbits.RD2 = 0; PORTDbits.RD3 = 1; PORTDbits.RD4 = 1; PORTHbits.RH1 = 0; PORTHbits.RH2 = 1; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0; ontv = udpRxBuf[40]; PORTF = ontv; PORTDbits.RD2 = 1; PORTDbits.RD3 = 1; PORTDbits.RD4 = 1; PORTHbits.RH1 = 0; PORTHbits.RH2 = 1; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0; //lees = 1 //lees = 0 //Data van de tweede schuifbalk //Data op PORTF plaatsen //teller =10110 //lees = 1 //lees = 0 //Data van de tweede schuifbalk //Data op PORTF plaatsen //teller =10111 //lees = 1 //lees = 0 //de teller terug op 0 zetten PORTDbits.RD2 = 0; PORTDbits.RD3 = 0; PORTDbits.RD4 = 0; PORTHbits.RH1 = 0; PORTHbits.RH2 = 0; //teller =00000         Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  62  Code voor het kiezen tussen de 4 programma’s    if(PORTBbits.RB0 == 0) { led1aan++; if (led1aan==1) { PORTDbits.RD0 = 1; PORTJbits.RJ2 = 1; PORTDbits.RD0 = 0; } if (led1aan>=2) { PORTDbits.RD0 = 1; PORTJbits.RJ2 = 0; PORTDbits.RD0 = 0; led1aan=0; } for(t = 0; t<500000 ; t++); } //Drukken op drukknop 1 //Teller //RD0 = 1 Î Puls op RD0 //LED 1 aan //RD0 = 0 //RD0 = 1 Î Puls op RD0 //LED 1 uit //RD0 = 0 //Delay Î ontdenderen if(PORTBbits.RB1 == 0) { led2aan++; if (led2aan==1) { PORTDbits.RD7 = 1; PORTJbits.RJ3 = 1; PORTDbits.RD7 = 0; } if (led2aan>=2) { PORTDbits.RD7 = 1; PORTJbits.RJ3 = 0; PORTDbits.RD7 = 0; led2aan=0; } for(t = 0; t<500000 ; t++); } //Drukken op drukknop 2 if(PORTBbits.RB2 == 0) { led3aan++; if (led3aan==1) { PORTDbits.RD5 = 1; PORTJbits.RJ6 = 1; PORTDbits.RD5 = 0; } if (led3aan>=2) { PORTDbits.RD5 = 1; PORTJbits.RJ6 = 0; PORTDbits.RD5 = 0; led3aan=0; } for(t = 0; t<500000 ; t++); //Drukken op drukknop 3 //Teller //RD7 = 1 Î Puls op RD7 //LED 2 aan //RD7 = 0 //RD7 = 1 Î Puls op RD7 //LED 2 uit //RD7 = 0 //Delay Î ontdenderen //Teller //RD5 = 1 Î Puls op RD5 //LED 3 aan //RD0 = 0 //RD5 = 1 Î Puls op RD5 //LED 3 uit //RD0 = 0 //Delay Î ontdenderen } Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  if(PORTBbits.RB3 == 0) { led4aan++; if (led4aan==1) { PORTDbits.RD6 = 1; PORTJbits.RJ1 = 1; PORTDbits.RD6 = 0; } if (led4aan>=2) { PORTDbits.RD6 = 1; PORTJbits.RJ1 = 0; PORTDbits.RD6 = 0; led4aan=0; } for(t = 0; t<500000 ; t++);     63  //Drukken op drukknop 4 //Teller //RD6 = 1 Î Puls op RD6 //LED 4 aan //RD0 = 0 //RD6 = 1 Î Puls op RD6 //LED 4 uit //RD0 = 0 //Delay Î ontdenderen }                        Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  64  4.7. Code FPGA  Software voor de sync­pulsen      figuur 49: software voor sync‐pulsen Code H_sync  // Port Declaration // {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE! input klokje; //Declareren van de variabelen output H_sync; output blank; output tel_0; reg H_sync; reg blank; reg [19:0] teller; reg tel_0; // {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE! always @ (posedge klokje) //Uitvoeren bij iedere positieve flank van de klok begin if(teller < 830) blank <=0; //als de teller <830 is blank=0 if(teller >= 830 && teller <835) //blank =1 als teller tussen 830 en 835 begin blank <=1; end if(teller >=835 && teller <840) //H_sync = 1 en blank = 1 begin H_sync <=1; blank <=1; end if(teller >= 840) begin //teller terug op 0 als teller =840 H_sync <=0; blank <=0; //blank en H_sync ook terug 0 teller =0; end teller = teller + 1;//Bij iedere klokpuls de teller laten optellen end endmodule Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  65  Code V_sync  // Port Declaration // {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE! input klokje; //Declareren van de variabelen output V_sync; output blank; output tel_0; reg V_sync; reg blank; reg [19:0] teller; reg tel_0; // {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE! always @ (posedge klokje) //Uitvoeren bij iedere positieve flank van de klok begin if(teller < 533390) blank <=0; //als de teller <533390 is blank=0 if(teller >= 533390 && teller <533395) //blank =1 begin blank <=1; end if(teller >= 533395 && teller <533400) //V_sync = 1 en blank = 1 begin V_sync <=1; blank <=1; end if(teller >= 533400) begin //teller terug op 0 als teller =533400 V_sync <=0; //533400 = 840 * 635 blank <=0; //blank en V_sync ook terug 0 teller =0; end teller = teller + 1; //Bij iedere klokpuls de teller laten optellen end endmodule                                  Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  66  Software voor de beeldopbouw  Dit programma wordt gekozen door het indrukken van de eerste (linkse) drukknop.  Zie punt 5 blz. voor meer info over dit programma.        figuur 50: software voor de beeldopbouw Code voor de beeldopbouw  //Code voor het inlezen van de data always //@(posedge lees) begin if(teller >=0 && teller <=25) begin if (lees ==1 && enable==1) begin datain0[teller] <= data0; datain1[teller] <= data1; datain2[teller] <= data2; datain3[teller] <= data3; datain4[teller] <= data4; datain5[teller] <= data5; datain6[teller] <= data6; datain7[teller] <= data7; end end end Kris Sabbe  3AI1E0  //Uitvoeren bij positieve flank op lees //(verzonden uit PIC) //Enkel als de teller tussen 0 en 25 is //(verzonden uit PIC) //Uitvoeren als lees en enable 1 zijn //Verzonden uit PIC //Inlezen van de data en opslaan //24 x 8bit = 192bits Oostende 2007‐2008        Aansturen LED display via art‐net  //Genereren van de beeldopbouw always @(posedge klok) begin if(enable==1) begin if(teller_H == 840) begin teller_H=0; teller_V = teller_V+1; end if(V_sync == 1) begin teller_H=0; teller_V=0; end if(blank==1) begin teller_H=0; end teller_H = teller_H+1; case(teller_V) 67  //Uitvoeren bij een positieve flank van de klok //Enkel als enable = 1 (data uit PIC) //Resetten van Horizontale teller //Verticale teller+1 //Wanneer de vertical sync 1 is uitvoeren //Reset Horizontale en vertical teller //Uitvoeren bij blank =1 //Resetten van horizontale teller //Horizontale teller + 1 //Case vertical teller, output 50: begin //Aansturen bovenste MiStrip uit5 <= datain0[0]; //data1 rood uit10 <= datain1[0]; //data2 rood uit0 <= datain2[0]; //data3 rood uit1 <= datain3[0]; //data4 rood uit2 <= datain4[0]; //data5 rood uit3 <= datain5[0]; //data6 rood uit4 <= datain6[0]; //data7 rood uit6 <= datain7[0]; //data8 rood uit11 <= datain0[1]; uit16 <= datain1[1]; uit7 <= datain2[1]; uit8 <= datain3[1]; uit9 <= datain4[1]; uit12 <= datain5[1]; uit13 <= datain6[1]; uit14 <= datain7[1]; //data1 groen //data2 groen //data3 groen //data4 groen //data5 groen //data6 groen //data7 groen //data8 groen uit17 <= datain0[2]; uit23 <= datain1[2]; uit15 <= datain2[2]; uit18 <= datain3[2]; uit19 <= datain4[2]; uit20 <= datain5[2]; uit21 <= datain6[2]; uit22 <= datain7[2]; //data1 blauw //data2 blauw //data3 blauw //data4 blauw //data5 blauw //data6 blauw //data7 blauw //data8 blauw end Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  68  51: begin //Aansturen 2de MiStrip uit5 <= datain0[3]; uit10 <= datain1[3]; uit0 <= datain2[3]; uit1 <= datain3[3]; uit2 <= datain4[3]; uit3 <= datain5[3]; uit4 <= datain6[3]; uit6 <= datain7[3]; uit11 <= datain0[4]; uit16 <= datain1[4]; uit7 <= datain2[4]; uit8 <= datain3[4]; uit9 <= datain4[4]; uit12 <= datain5[4]; uit13 <= datain6[4]; uit14 <= datain7[4]; uit17 <= datain0[5]; uit23 <= datain1[5]; uit15 <= datain2[5]; uit18 <= datain3[5]; uit19 <= datain4[5]; uit20 <= datain5[5]; uit21 <= datain6[5]; uit22 <= datain7[5]; end 57: begin //Aansturen 8ste MiStrip uit5 <= datain0[21]; uit10 <= datain1[21]; uit0 <= datain2[21]; uit1 <= datain3[21]; uit2 <= datain4[21]; uit3 <= datain5[21]; uit4 <= datain6[21]; uit6 <= datain7[21]; uit11 <= datain0[22]; uit16 <= datain1[22]; uit7 <= datain2[22]; uit8 <= datain3[22]; uit9 <= datain4[22]; uit12 <= datain5[22]; uit13 <= datain6[22]; uit14 <= datain7[22]; uit17 <= datain0[23]; uit23 <= datain1[23]; uit15 <= datain2[23]; uit18 <= datain3[23]; uit19 <= datain4[23]; uit20 <= datain5[23]; uit21 <= datain6[23]; uit22 <= datain7[23]; end endcase end Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  if(enable==0) begin uit0 <= 1'b0; uit1 <= 1'b0; uit2 <= 1'b0; uit3 <= 1'b0; uit4 <= 1'b0; uit5 <= 1'b0; uit6 <= 1'b0; uit7 <= 1'b0; uit8 <= 1'b0; uit9 <= 1'b0; uit10 <= 1'b0; uit11 <= 1'b0; uit12 <= 1'b0; uit13 <= 1'b0; uit14 <= 1'b0; uit15 <= 1'b0; uit16 <= 1'b0; uit17 <= 1'b0; uit18 <= 1'b0; uit19 <= 1'b0; uit20 <= 1'b0; uit21 <= 1'b0; uit22 <= 1'b0; uit23 <= 1'b0; end 69  //Uitvoeren als enable = 0 //Alle uitgangsbits op 0 zetten Î geen beeld end endmodule                                           Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  70  5. Werking van het toestel  5.1. Achterpaneel    Op het achterpaneel worden de  voeding, RS‐232 en ethernet kabel  aangesloten.   Voor de ethernet kabel moet een  crossed kabel gebruikt worden.  De RS‐232 verbinding is voor het  instellen van de LED‐displays.  Op het achterpaneel zit ook een  zekeringhouder.            figuur 51: achterpaneel  5.2. Frontpaneel    Op het frontpaneel hebben we vier  drukknoppen en de DVI uitgang.  Als signalisatie dat de drukknop actief is,  brandt er een LED.  Het DVI‐signaal kan enkel maar gebruikt  worden voor het aan te sturen van  Barco LED‐displays. Dit komt door het  feit dat Barco enkele draden heeft  omgewisseld. Bij mij is dit echter  softwarematig gebeurd zodat je door  verandering van de software een  gestandaardiseerd DVI‐signaal krijgt.  In het toestel zitten enkele verschillende  programma’s.  figuur 52: frontpaneel  • Eerste drukknop (links):  Met dit programma kan je de rode, groene en blauwe kleur van de MiStrip  wijzigen d.m.v. drie schuifbalken.  Met de lichttafel Showtec showmaster 24 kunnen er op deze manier 8 MiStrip’s  aangestuurd worden met telkens drie kanalen per MiStrip.  • Tweede drukknop:  Dit is een demoprogramma waarvoor je de lichttafel niet nodig hebt.  In dit programma verschijnen de kleuren rood, groen, blauw, wit en zwart  continu in een lus.  Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  71  • Derde drukknop:  Dit is ook een demoprogramma waarvoor je de lichttafel niet nodig hebt.  In dit programma gaat het beeld geleidelijk aan van zwart naar wit.  • Vierde drukknop (rechts):  Eén pixel op de MiStrip brandt en gaat van links naar rechts en terug. Met de drie  eerste schuifbalken van de lichttafel kan de kleur gewijzigd worden volgens het  RGB principe. Met de vierde schuifbalk kan de snelheid waarmee de pixel  verschuift gewijzigd worden.  Met de vijfde schuifbalk kunnen het aantal pixels die branden ingesteld worden  (van 1 tot 60 pixels).  o Vierde en eerste drukknop  Nu gaan twee pixels van links naar rechts en terug. Van deze twee pixels  kunnen de kleur en snelheid geregeld worden.  o Vierde en tweede drukknop  Nu gaan vier pixels van links naar rechts en terug. Ook hier kan de  snelheid en kleur terug geregeld worden.  o Vierde en derde drukknop  Eén pixel van de MiStrip brandt. Van deze pixel kan je de kleur wijzigen  met de eerste drie schuifbalken. De positie waar de LED oplicht kan  gekozen worden met de vierde schuifbalk.                                            Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  72  6. Kostprijsberaming  Omschrijving  Print  Ethernet connector  RJ‐11 connector  Regulator 1.5V  Regulator 3.3V  Regulator 5V  Regulator 8V  Altera EPCS1  DVI connector  Drukknoppen  LED's  VCO 32MHz  Kristal 25MHz  MAX 489 CPD+  TFP‐410  Altera Cyclone 1  PIC 18F97J60  Condensatoren  Weerstanden  Behuizing     Totaal                                  Kris Sabbe  Prijs in Euro  300 10,87 1,68 3,68 1,06 0,69 0,7 3,39 3,1 4,05 5,35 4,72 0,96 2,85 7,75 16,2 11,49 10,78 4,73 16,36    410,41 Tabel 7: kostprijsberaming 3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  73  7. Algemeen besluit  Het doel van mijn eindwerk is behaald. Ik kan videopixels aansturen door middel van  ethernet. Dit komt mede door het opsplitsen van het probleem in meerdere delen.  Het gebruik van nieuwe componenten (pic, fpga en tfp) was hiervoor een noodzaak.  Hierdoor heb ik ook veel bijgeleerd over het implementeren van deze technologie in  een bepaalde toepassing. Alsook hoe je ermee werkt, programmeert en fouten  opspoort.                                                                    Kris Sabbe  3AI1E0  Oostende 2007‐2008        Aansturen LED display via art‐net  74  8. Bijlagen                                                                                Kris Sabbe  3AI1E0  Oostende 2007‐2008                                                                  77    Bovenkant van de print      Tweede laag van de print              78    Derde laag van de print      Onderzijde print            Sabbe Kris       Code PIC  79  /*********************************************************************   *   *  Main Application Entry Point and TCP/IP Stack Demo   *  Module for Microchip TCP/IP Stack   *  Sabbe Kris   *  3AI1EO   ********************************************************************/    #define THIS_IS_STACK_APPLICATION  #define BAUD_RATE       (19200)   // bps    // This header includes all headers for any enabled TCPIP Stack functions  #include "TCPIP Stack/TCPIP.h"    // This is used by other stack elements.  // Main application must define this and initialize it with proper values.  APP_CONFIG AppConfig;  BYTE AN0String[8];  BYTE myDHCPBindCount = 0xFF;    #if !defined(STACK_USE_DHCP_CLIENT)    #define DHCPBindCount  (1)  #endif    #pragma udata BUFFER1_50BYTES    //Buffer om het ontvangen UDP‐pakket in op te bergen    BYTE udpRxBuf[50];    #pragma udata      // Set configuration fuses  #if defined(__18CXX)    #if defined(__EXTENDED18__)      #pragma config XINST=ON    #elif !defined(HI_TECH_C)      #pragma config XINST=OFF    #endif      #if defined(__18F8722)      // PICDEM HPC Explorer board      #pragma config OSC=HSPLL, FCMEN=OFF, IESO=OFF, PWRT=OFF, WDT=OFF, LVP=OFF    #elif defined(_18F8722)  // HI‐TECH PICC‐18 compiler      // PICDEM HPC Explorer board      __CONFIG(1, HSPLL);      __CONFIG(2, WDTDIS);      __CONFIG(3, MCLREN);      __CONFIG(4, XINSTDIS & LVPDIS);    #elif defined(__18F87J10) || defined(__18F86J15) || defined(__18F86J10) || defined(__18F85J15) || defined(__18F85J10) ||  defined(__18F67J10) || defined(__18F66J15) || defined(__18F66J10) || defined(__18F65J15) || defined(__18F65J10)      // PICDEM HPC Explorer board      #pragma config WDTEN=OFF, FOSC2=ON, FOSC=HSPLL    #elif defined(__18F97J60) || defined(__18F96J65) || defined(__18F96J60) || defined(__18F87J60) || defined(__18F86J65) ||  defined(__18F86J60) || defined(__18F67J60) || defined(__18F66J65) || defined(__18F66J60)       // PICDEM.net 2 or any other PIC18F97J60 family device      #pragma config WDT=OFF, FOSC2=ON, FOSC=HSPLL, ETHLED=ON    #elif defined(_18F97J60) || defined(_18F96J65) || defined(_18F96J60) || defined(_18F87J60) || defined(_18F86J65) ||  defined(_18F86J60) || defined(_18F67J60) || defined(_18F66J65) || defined(_18F66J60)       // PICDEM.net 2 board with HI‐TECH PICC‐18 compiler      __CONFIG(1, WDTDIS & XINSTDIS);      __CONFIG(2, HSPLL);      __CONFIG(3, ETHLEDEN);    #elif defined(__18F4620)        // PICDEM Z board      #pragma config OSC=HSPLL, WDT=OFF, MCLRE=ON, PBADEN=OFF, LVP=OFF    #endif  #elif defined(__PIC24F__)    // Explorer 16 board    _CONFIG2(FNOSC_PRIPLL & POSCMOD_XT)   // Primary XT OSC with 4x PLL    _CONFIG1(JTAGEN_OFF & FWDTEN_OFF)    // JTAG off, watchdog timer off  #elif defined(__dsPIC33F__) || defined(__PIC24H__)    // Explorer 16 board    _FOSCSEL(FNOSC_PRIPLL)      // PLL enabled      Sabbe Kris       Code PIC  80    _FOSC(OSCIOFNC_OFF & POSCMD_XT)  // XT Osc    _FWDT(FWDTEN_OFF)        // Disable Watchdog timer    // JTAG should be disabled as well  #elif defined(__dsPIC30F__)    // dsPICDEM 1.1 board    _FOSC(XT_PLL16)          // XT Osc + 16X PLL    _FWDT(WDT_OFF)          // Disable Watchdog timer    _FBORPOR(MCLR_EN & PBOR_OFF & PWRT_OFF)  #elif defined(__PIC32MX__)    #pragma config FPLLODIV = DIV_1, FPLLMUL = MUL_18, FPLLIDIV = DIV_2, FWDTEN = OFF, FPBDIV = DIV_1, POSCMOD = XT,  FNOSC = PRIPLL, CP = OFF  #endif      void delay (void)   //Eenvoudige delay, tellertje laten tellen tot 50000  {    unsigned int i;    for(i = 0; i<50000 ; i++);  }    void delay2 (void)   //Kleinere delay  {    unsigned int i;    for(i = 0; i<2000 ; i++);  }    void receiveUDP2(void)  {        BYTE udpRxBufPut;    //variabelen declareren    UDP_SOCKET  MySocket;    NODE_INFO  Remote;    WORD    wTemp;    BYTE *buffer;    static DWORD dwCounter = 1;    BYTE c;    BYTE ontv;    BYTE ontv1;    BYTE testbyte;    unsigned int teller=0;    unsigned int t = 0;          UDPInit();    // Suppress transmissions if we don't have an Ethernet link so our counter starts correctly at 0x00000001    if(!MACIsLinked())      return;        udpRxBufPut = 0;   //Op 0 zetten zodat we altijd op de eerste plaats in het buffer beginnen opslaan    Remote.IPAddr.Val=0x47071802;  //IP‐adres van het toestel die de UDP‐paketten verzend in hex formaat    Remote.MACAddr.v[0]=0x00;    //MAC‐adres van het toestel dat uitzend    Remote.MACAddr.v[1]=0x06;    Remote.MACAddr.v[2]=0xA6;    Remote.MACAddr.v[3]=0x01;    Remote.MACAddr.v[4]=0x07;    Remote.MACAddr.v[5]=0x47;      // Openen van een UDP socket op poort 0x1936    MySocket = UDPOpen(0x1936, &Remote, 0x1936);    // voor art‐net altijd poort 0x1936  (6454 decimaal)           if(MySocket == INVALID_UDP_SOCKET)    //Terugkeren als er een probleem is met de socket      return;             if (UDPIsGetReady(MySocket))   //Als er data staat op de socket voeren we de code uit    {                      UDPGet(&c);    //Eerste byte van het UDP‐pakket lezen        if (c==0x41)  //Als deze byte 0x41 (A), dan gaan we verder  {            Sabbe Kris                                          udpRxBuf[udpRxBufPut++] = c;                     if (udpRxBufPut >= 49)   namelijk alle data die we moeten hebben                                 break;                     }                 }                                                                                                                                                                                                                                      //                                                                                                                                                                                                                                        Code PIC  81  while(UDPGet(&c))   //Lezen van het UDP‐pakket  {  //Byte lezen van UDP‐pakket en opslaan in buffer        //Als we 51 bytes binnen gelezen hebben stoppen we. We hebben dan     {  UDPDiscard();  ontv = udpRxBuf[17];  PORTF = ontv;  PORTDbits.RD2 = 0;    PORTDbits.RD3 = 0;  PORTDbits.RD4 = 0;  PORTHbits.RH1 = 0;  PORTHbits.RH2 = 0;  PORTDbits.RD1 = 1;    PORTDbits.RD1 = 0;    ontv = udpRxBuf[18];  PORTF = ontv;  PORTDbits.RD2 = 1;    PORTDbits.RD3 = 0;  PORTDbits.RD4 = 0;  PORTHbits.RH1 = 0;  PORTHbits.RH2 = 0;  PORTDbits.RD1 = 1;    PORTDbits.RD1 = 0;    ontv = udpRxBuf[19];  PORTF = ontv;  PORTDbits.RD2 = 0;    PORTDbits.RD3 = 1;  PORTDbits.RD4 = 0;  PORTHbits.RH1 = 0;  PORTHbits.RH2 = 0;  PORTDbits.RD1 = 1;    for(t = 0; t<5 ; t++);  PORTDbits.RD1 = 0;    ontv = udpRxBuf[20];  PORTF = ontv;  PORTDbits.RD2 = 1;    PORTDbits.RD3 = 1;  PORTDbits.RD4 = 0;  PORTHbits.RH1 = 0;  PORTHbits.RH2 = 0;  PORTDbits.RD1 = 1;    PORTDbits.RD1 = 0;    ontv = udpRxBuf[21];  PORTF = ontv;  PORTDbits.RD2 = 0;    PORTDbits.RD3 = 0;  PORTDbits.RD4 = 1;  PORTHbits.RH1 = 0;  PORTHbits.RH2 = 0;  PORTDbits.RD1 = 1;    PORTDbits.RD1 = 0;    ontv = udpRxBuf[22];  PORTF = ontv;  PORTDbits.RD2 = 1;    PORTDbits.RD3 = 0;  PORTDbits.RD4 = 1;  PORTHbits.RH1 = 0;  PORTHbits.RH2 = 0;  PORTDbits.RD1 = 1;    PORTDbits.RD1 = 0;    //teller =00000      //lees = 1  //lees = 0  //teller =00001      //lees = 1  //lees = 0  //teller =00010    //lees = 1    //lees = 0  //teller =00011      //lees = 1  //lees = 0  //teller =00100      //lees = 1  //lees = 0  //teller =00101      //lees = 1  //lees = 0      Sabbe Kris                                                                                                                                                     Code PIC                                                            ontv = udpRxBuf[23];  PORTF = ontv;  PORTDbits.RD2 = 0;    PORTDbits.RD3 = 1;  PORTDbits.RD4 = 1;  PORTHbits.RH1 = 0;  PORTHbits.RH2 = 0;  PORTDbits.RD1 = 1;    PORTDbits.RD1 = 0;                                                          ontv = udpRxBuf[24];  PORTF = ontv;  PORTDbits.RD2 = 1;    PORTDbits.RD3 = 1;  PORTDbits.RD4 = 1;  PORTHbits.RH1 = 0;  PORTHbits.RH2 = 0;  PORTDbits.RD1 = 1;    PORTDbits.RD1 = 0;                                                          ontv = udpRxBuf[25];  PORTF = ontv;  PORTDbits.RD2 = 0;    PORTDbits.RD3 = 0;  PORTDbits.RD4 = 0;  PORTHbits.RH1 = 1;  PORTHbits.RH2 = 0;  PORTDbits.RD1 = 1;    PORTDbits.RD1 = 0;                                                          ontv = udpRxBuf[26];  PORTF = ontv;  PORTDbits.RD2 = 1;    PORTDbits.RD3 = 0;  PORTDbits.RD4 = 0;  PORTHbits.RH1 = 1;  PORTHbits.RH2 = 0;  PORTDbits.RD1 = 1;    PORTDbits.RD1 = 0;                                                            //    ontv = udpRxBuf[27];  PORTF = ontv;  PORTDbits.RD2 = 0;    PORTDbits.RD3 = 1;  PORTDbits.RD4 = 0;  PORTHbits.RH1 = 1;  PORTHbits.RH2 = 0;  PORTDbits.RD1 = 1;    for(t = 0; t<5 ; t++);  PORTDbits.RD1 = 0;                                                          ontv = udpRxBuf[28];  PORTF = ontv;  PORTDbits.RD2 = 1;    PORTDbits.RD3 = 1;  PORTDbits.RD4 = 0;  PORTHbits.RH1 = 1;  PORTHbits.RH2 = 0;  PORTDbits.RD1 = 1;    PORTDbits.RD1 = 0;                                                          ontv = udpRxBuf[29];  PORTF = ontv;  PORTDbits.RD2 = 0;    PORTDbits.RD3 = 0;  PORTDbits.RD4 = 1;  PORTHbits.RH1 = 1;  PORTHbits.RH2 = 0;  PORTDbits.RD1 = 1;    PORTDbits.RD1 = 0;    82  //teller =00110      //lees = 1  //lees = 0  //teller =00111      //lees = 1  //lees = 0  //teller =01000      //lees = 1  //lees = 0  //teller =01001      //lees = 1  //lees = 0  //teller =01010    //lees = 1    //lees = 0  //teller =01011      //lees = 1  //lees = 0  //teller =01100      //lees = 1  //lees = 0      Sabbe Kris                                                                                                                                                     Code PIC                                                        ontv = udpRxBuf[30];  PORTF = ontv;  PORTDbits.RD2 = 1;    PORTDbits.RD3 = 0;  PORTDbits.RD4 = 1;  PORTHbits.RH1 = 1;  PORTHbits.RH2 = 0;  PORTDbits.RD1 = 1;    PORTDbits.RD1 = 0;                                                          ontv = udpRxBuf[31];  PORTF = ontv;  PORTDbits.RD2 = 0;    PORTDbits.RD3 = 1;  PORTDbits.RD4 = 1;  PORTHbits.RH1 = 1;  PORTHbits.RH2 = 0;  PORTDbits.RD1 = 1;    PORTDbits.RD1 = 0;                                                          ontv = udpRxBuf[32];  PORTF = ontv;  PORTDbits.RD2 = 1;    PORTDbits.RD3 = 1;  PORTDbits.RD4 = 1;  PORTHbits.RH1 = 1;  PORTHbits.RH2 = 0;  PORTDbits.RD1 = 1;    PORTDbits.RD1 = 0;                                                          ontv = udpRxBuf[33];  PORTF = ontv;  PORTDbits.RD2 = 0;    PORTDbits.RD3 = 0;  PORTDbits.RD4 = 0;  PORTHbits.RH1 = 0;  PORTHbits.RH2 = 1;  PORTDbits.RD1 = 1;    PORTDbits.RD1 = 0;                                                          ontv = udpRxBuf[34];  PORTF = ontv;  PORTDbits.RD2 = 1;    PORTDbits.RD3 = 0;  PORTDbits.RD4 = 0;  PORTHbits.RH1 = 0;  PORTHbits.RH2 = 1;  PORTDbits.RD1 = 1;    PORTDbits.RD1 = 0;                                                          ontv = udpRxBuf[35];  PORTF = ontv;  PORTDbits.RD2 = 0;    PORTDbits.RD3 = 1;  PORTDbits.RD4 = 0;  PORTHbits.RH1 = 0;  PORTHbits.RH2 = 1;  PORTDbits.RD1 = 1;    PORTDbits.RD1 = 0;                                                          ontv = udpRxBuf[36];  PORTF = ontv;  PORTDbits.RD2 = 1;    PORTDbits.RD3 = 1;  PORTDbits.RD4 = 0;  PORTHbits.RH1 = 0;  PORTHbits.RH2 = 1;  PORTDbits.RD1 = 1;    PORTDbits.RD1 = 0;    83  //teller =01101      //lees = 1  //lees = 0  //teller =01110      //lees = 1  //lees = 0  //teller =01111      //lees = 1  //lees = 0  //teller =10000      //lees = 1  //lees = 0  //teller =10001      //lees = 1  //lees = 0  //teller =10010      //lees = 1  //lees = 0  //teller =10011      //lees = 1  //lees = 0      Sabbe Kris       Code PIC  84          ontv = udpRxBuf[37];          PORTF = ontv;          PORTDbits.RD2 = 0;    //teller =10100          PORTDbits.RD3 = 0;          PORTDbits.RD4 = 1;          PORTHbits.RH1 = 0;          PORTHbits.RH2 = 1;          PORTDbits.RD1 = 1;      //lees = 1          PORTDbits.RD1 = 0;      //lees = 0            ontv = udpRxBuf[38];          PORTF = ontv;  //teller =10101          PORTDbits.RD2 = 1;            PORTDbits.RD3 = 0;          PORTDbits.RD4 = 1;          PORTHbits.RH1 = 0;          PORTHbits.RH2 = 1;          PORTDbits.RD1 = 1;      //lees = 1          PORTDbits.RD1 = 0;      //lees = 0            ontv = udpRxBuf[39];          PORTF = ontv;          PORTDbits.RD2 = 0;    //teller =10110          PORTDbits.RD3 = 1;          PORTDbits.RD4 = 1;          PORTHbits.RH1 = 0;          PORTHbits.RH2 = 1;          PORTDbits.RD1 = 1;      //lees = 1          PORTDbits.RD1 = 0;      //lees = 0            ontv = udpRxBuf[40];          PORTF = ontv;          PORTDbits.RD2 = 1;    //teller =10111          PORTDbits.RD3 = 1;          PORTDbits.RD4 = 1;          PORTHbits.RH1 = 0;          PORTHbits.RH2 = 1;          PORTDbits.RD1 = 1;      //lees = 1          PORTDbits.RD1 = 0;      //lees = 0            //alles terug op 0          PORTDbits.RD2 = 0;    //teller =00000          PORTDbits.RD3 = 0;          PORTDbits.RD4 = 0;          PORTHbits.RH1 = 0;          PORTHbits.RH2 = 0;                      }        else         {                  }      }    }      // Private helper functions.  // These may or may not be present in all applications.  static void InitAppConfig(void);  static void InitializeBoard(void);  //static void ProcessIO(void);  #if defined(STACK_USE_SMTP_CLIENT)  static void SMTPDemo(void);  #endif  #if defined(STACK_USE_ICMP_CLIENT)  static void PingDemo(void);  #endif  #if defined(STACK_USE_SNMP_SERVER) && !defined(SNMP_TRAP_DISABLED)  static void SNMPTrapDemo(void);      Sabbe Kris       Code PIC  85  #endif    //static void DisplayIPValue(IP_ADDR IPVal);  void FormatNetBIOSName(BYTE Name[16]);    #if defined(STACK_USE_UART)    static void SetConfig(void);  #endif    #if defined(MPFS_USE_EEPROM) && (defined(STACK_USE_MPFS) || defined(STACK_USE_MPFS2))    void SaveAppConfig(void);    #if defined(STACK_USE_UART) && defined(STACK_USE_MPFS)      static BOOL DownloadMPFS(void);    #endif  #else    #define SaveAppConfig()  #endif      //  // PIC18 Interrupt Service Routines  //   // NOTE: Several PICs, including the PIC18F4620 revision A3 have a RETFIE FAST/MOVFF bug  // The interruptlow keyword is used to work around the bug when using C18  #if defined(__18CXX)    #if defined(HI_TECH_C)    void interrupt low_priority LowISR(void)    #else    #pragma interruptlow LowISR    void LowISR(void)    #endif    {        TickUpdate();    }        #if defined(HI_TECH_C)    void interrupt HighISR(void)    #else    #pragma interruptlow HighISR    void HighISR(void)    #endif    {        #if defined(STACK_USE_UART2TCP_BRIDGE)      UART2TCPBridgeISR();      #endif    }        #if !defined(HI_TECH_C)    #pragma code lowVector=0x18    void LowVector(void){_asm goto LowISR _endasm}    #pragma code highVector=0x8    void HighVector(void){_asm goto HighISR _endasm}    #pragma code // Return to default code section    #endif    //    //    //    //    //    unsigned int schakelaar1=0;    unsigned int i;    unsigned int ontdender1=0;    unsigned int tel=0;    unsigned int t;    unsigned int tt;    unsigned int led1aan=0;    unsigned int led2aan=0;    unsigned int led3aan=0;    unsigned int led4aan=0;    #elif defined(__C30__)      Sabbe Kris       Code PIC  86    void _ISR __attribute__((__no_auto_psv__)) _AddressError(void)    {        Nop();      Nop();    }    void _ISR __attribute__((__no_auto_psv__)) _StackError(void)    {        Nop();      Nop();    }      #elif defined(__C32__)    void _general_exception_handler(unsigned cause, unsigned status)    {      Nop();      Nop();    }  #endif    //  // Main application entry point.  //  //#if defined(__18CXX)  void main(void)  //#else    //int main(void)  //#endif  {      //  TCPPerformanceTask();        static TICK t = 0;    BYTE i;        // Initialize any application specific hardware.      InitializeBoard();    #ifdef USE_LCD    // Initialize and display the stack version on the LCD    LCDInit();    for(i = 0; i < 100; i++)      DelayMs(1);    strcpypgm2ram((char*)LCDText, "TCPStack " VERSION "  "                    "                ");  //  LCDUpdate();  #endif        // Initialize all stack related components.      // Following steps must be performed for all applications using      // the Microchip TCP/IP Stack.   //   TickInit();    #if defined(STACK_USE_MPFS) || defined(STACK_USE_MPFS2)      // Initialize Microchip File System module      MPFSInit();  #endif        // Initialize Stack and application related NV variables into AppConfig.      InitAppConfig();        // Initiates board setup process if button is depressed     // on startup      if(BUTTON0_IO == 0u)      {      #if defined(MPFS_USE_EEPROM) && (defined(STACK_USE_MPFS) || defined(STACK_USE_MPFS2))      // Invalidate the EEPROM contents if BUTTON0 is held down for more than 4 seconds      TICK StartTime = TickGet();        while(BUTTON0_IO == 0u)      {      Sabbe Kris       Code PIC  87        if(TickGet() ‐ StartTime > 4*TICK_SECOND)        {            XEEBeginWrite(0x0000);            XEEWrite(0xFF);            XEEEndWrite();          #if defined(STACK_USE_UART)          putrsUART("\r\n\r\nBUTTON0 held for more than 4 seconds.  EEPROM contents  erased.\r\n\r\n");          #endif          LED0_TRIS = 0;          LED1_TRIS = 0;          LED2_TRIS = 0;          LED3_TRIS = 0;          LED0_IO = 1;          LED1_IO = 1;          LED2_IO = 1;          LED3_IO = 1;          while((LONG)(TickGet() ‐ StartTime) <= (LONG)(9*TICK_SECOND/2));          Reset();          break;        }      }      #endif        #if defined(STACK_USE_UART)          SetConfig();      #endif      }      // Initialize core stack layers (MAC, ARP, TCP, UDP)      StackInit();    //#if defined(STACK_USE_UART2TCP_BRIDGE)   //   UART2TCPBridgeInit();  //#endif    //#if defined(STACK_USE_HTTP_SERVER) || defined(STACK_USE_HTTP2_SERVER)  //    HTTPInit();  //#endif    //#if defined(STACK_USE_SSL_SERVER)  //    SSLInit();  //#endif    //#if defined(STACK_USE_FTP_SERVER) && defined(MPFS_USE_EEPROM) && defined(STACK_USE_MPFS)   //   FTPInit();  //#endif    //#if defined(STACK_USE_SNMP_SERVER)  //  SNMPInit();  //#endif    //#if defined(STACK_USE_DHCP_CLIENT)  //    if(!AppConfig.Flags.bIsDHCPEnabled)  //    {  //        DHCPDisable();  //    }  //#endif    TRISJ=0x00;    TRISB=0xFF;    PORTJ=0x00;    TRISD=0x00;    PORTD=0x00;    //TRISB=0x00;    //PORTB=0x00;    TRISC=0x00;    PORTC=0x00;    TRISF=0x00;    PORTF=0x00;    TRISH=0x00;    PORTH=0x00;      Sabbe Kris       Code PIC  88      // Once all items are initialized, go into infinite loop and let      // stack items execute their tasks.      // If application needs to perform its own task, it should be      // done at the end of while loop.      // Note that this is a "co‐operative mult‐tasking" mechanism      // where every task performs its tasks (whether all in one shot      // or part of it) and returns so that other tasks can do their      // job.      // If a task needs very long time to do its job, it must be broken      // down into smaller pieces so that other tasks can have CPU time.      while(1)      {          // Blink LED0 (right most one) every second.       //   if(TickGet() ‐ t >= TICK_SECOND/2ul)       //   {        //      t = TickGet();       //       LED0_IO ^= 1;       //   }            // This task performs normal stack task including checking          // for incoming packet, type of packet and calling          // appropriate stack entity to process it.          StackTask();    //#if defined(STACK_USE_UART2TCP_BRIDGE)  //        UART2TCPBridgeTask();  //#endif    //#if defined(STACK_USE_HTTP_SERVER) || defined(STACK_USE_HTTP2_SERVER)          // This is a TCP application.  It listens to TCP port 80          // with one or more sockets and responds to remote requests.   //       HTTPServer();  //#endif    //#if defined(STACK_USE_SSL_SERVER)  //    SSLServer();  //#endif    //#if defined(STACK_USE_FTP_SERVER) && defined(MPFS_USE_EEPROM) && defined(STACK_USE_MPFS)   //       FTPServer();  //#endif    //#if defined(STACK_USE_SNMP_SERVER)  //    SNMPTask();  //#endif    //#if defined(STACK_USE_ANNOUNCE)  //    DiscoveryTask();  //#endif    //#if defined(STACK_USE_NBNS)  //    NBNSTask();  //#endif    //#if defined(STACK_USE_DHCP_SERVER)  //    DHCPServerTask();  //#endif    //#if defined(STACK_USE_GENERIC_TCP_CLIENT_EXAMPLE)  //    GenericTCPClient();  //#endif    //#if defined(STACK_USE_GENERIC_TCP_SERVER_EXAMPLE)  //    GenericTCPServer();  //#endif    //#if defined(STACK_USE_TELNET_SERVER)  //    TelnetTask();  //#endif    //#if defined(STACK_USE_REBOOT_SERVER)      Sabbe Kris       Code PIC  89  //    RebootTask();  //#endif    //#if defined(STACK_USE_SNTP_CLIENT)  //    SNTPClient();  //#endif    //#if defined(STACK_USE_UDP_PERFORMANCE_TEST)                //ReceiveUDP();    receiveUDP2();              if(PORTBbits.RB0 == 0)      {        led1aan++;        if (led1aan==1)        {        PORTDbits.RD0 = 1;        PORTJbits.RJ2 = 1;        PORTDbits.RD0 = 0;        }        if (led1aan>=2)        {          PORTDbits.RD0 = 1;          PORTJbits.RJ2 = 0;          PORTDbits.RD0 = 0;          led1aan=0;        }        for(t = 0; t<500000 ; t++);      }                      if(PORTBbits.RB1 == 0)      {          led2aan++;        if (led2aan==1)        {        PORTDbits.RD7 = 1;        PORTJbits.RJ3 = 1;        PORTDbits.RD7 = 0;        }        if (led2aan>=2)        {          PORTDbits.RD7 = 1;          PORTJbits.RJ3 = 0;          PORTDbits.RD7 = 0;  led2aan=0;                }        for(t = 0; t<500000 ; t++);        }            if(PORTBbits.RB2 == 0)      {        led3aan++;        if (led3aan==1)        {        PORTDbits.RD5 = 1;        PORTJbits.RJ6 = 1;        PORTDbits.RD5 = 0;        }        if (led3aan>=2)        {          PORTDbits.RD5 = 1;          PORTJbits.RJ6 = 0;      Sabbe Kris       Code PIC  90          PORTDbits.RD5 = 0;          led3aan=0;        }        for(t = 0; t<500000 ; t++);              }      if(PORTBbits.RB3 == 0)      {        led4aan++;        if (led4aan==1)        {        PORTDbits.RD6 = 1;        PORTJbits.RJ1 = 1;        PORTDbits.RD6 = 0;        }        if (led4aan>=2)        {          PORTDbits.RD6 = 1;          PORTJbits.RJ1 = 0;          PORTDbits.RD6 = 0;          led4aan=0;        }        for(t = 0; t<500000 ; t++);              }      //#if defined(STACK_USE_TCP_PERFORMANCE_TEST)  //    TCPPerformanceTask();  //#endif    //#if defined(STACK_USE_SMTP_CLIENT)  //    SMTPTask();  //    SMTPDemo();  //#endif    //#if defined(STACK_USE_ICMP_CLIENT)  //    PingDemo();  //#endif    //#if defined(STACK_USE_SNMP_SERVER) && !defined(SNMP_TRAP_DISABLED)  //    SNMPTrapDemo();  //#endif            // Add your application specific tasks here.          //ProcessIO();              // For DHCP information, display how many times we have renewed the IP          // configuration since last reset.          if(DHCPBindCount != myDHCPBindCount)          {              myDHCPBindCount = DHCPBindCount;          #if defined(STACK_USE_UART)          putrsUART((ROM char*)"New IP Address: ");        #endif               // DisplayIPValue(AppConfig.MyIPAddr);  // Print to UART          #if defined(STACK_USE_UART)          putrsUART((ROM char*)"\r\n");        #endif          #if defined(STACK_USE_ANNOUNCE)          AnnounceIP();        #endif          }        }  }      Sabbe Kris       Code PIC  91      /*static void DisplayIPValue(IP_ADDR IPVal)  {  //  printf("%u.%u.%u.%u", IPVal.v[0], IPVal.v[1], IPVal.v[2], IPVal.v[3]);      BYTE IPDigit[4];    BYTE i;  #ifdef USE_LCD    BYTE j;    BYTE LCDPos=16;  #endif      for(i = 0; i < sizeof(IP_ADDR); i++)    {        uitoa((WORD)IPVal.v[i], IPDigit);        #if defined(STACK_USE_UART)        putsUART(IPDigit);      #endif        #ifdef USE_LCD        for(j = 0; j < strlen((char*)IPDigit); j++)        {          LCDText[LCDPos++] = IPDigit[j];        }        if(i == sizeof(IP_ADDR)‐1)          break;        LCDText[LCDPos++] = '.';      #else        if(i == sizeof(IP_ADDR)‐1)          break;      #endif        #if defined(STACK_USE_UART)        while(BusyUART());        WriteUART('.');      #endif    }      #ifdef USE_LCD      if(LCDPos < 32)        LCDText[LCDPos] = 0;      LCDUpdate();    #endif  }*/      /*static void ProcessIO(void)  {  #if defined(__C30__) || defined(__C32__)      // Convert potentiometer result into ASCII string      uitoa((WORD)ADC1BUF0, AN0String);  #else      // AN0 should already be set up as an analog input      ADCON0bits.GO = 1;        // Wait until A/D conversion is done      while(ADCON0bits.GO);      // AD converter errata work around (ex: PIC18F87J10 A2)    #if !defined(__18F87J50) && !defined(_18F87J50)      PRODL = ADCON2;      ADCON2bits.ADCS0 = 1;      ADCON2bits.ADCS1 = 1;      ADCON2 = PRODL;    #endif        // Convert 10‐bit value into ASCII string      uitoa(*((WORD*)(&ADRESL)), AN0String);  #endif  }*/      Sabbe Kris       Code PIC  92      #if defined(STACK_USE_SMTP_CLIENT)  static void SMTPDemo(void)  {    // Send an email once if someone pushes BUTTON2 and BUTTON3 at the same time    // This is a simple message example, where the message     // body must already be in RAM.    // LED1 will be used as a busy indicator  // LED2 will be used as a mail sent successfully indicator      static enum    {      MAIL_HOME = 0,      MAIL_BEGIN,      MAIL_SMTP_FINISHING,      MAIL_DONE    } MailState = MAIL_HOME;    static TICK WaitTime;             switch(MailState)    {      case MAIL_HOME:          if((BUTTON2_IO == 0u) && (BUTTON3_IO == 0u))        {          // Start sending an email          LED1_IO = 1;          MailState++;          LED2_IO = 0;        }        break;        case MAIL_BEGIN:        if(SMTPBeginUsage())        {          // Note that these strings must stay allocated in           // memory until SMTPIsBusy() returns FALSE.  To           // guarantee that the C compiler does not reuse this           // memory, you must allocate the strings as static.            static BYTE RAMStringTo[] = "[email protected]";          //static BYTE RAMStringCC[] = "[email protected], \"Jane Smith\"  ";          //static BYTE RAMStringBCC[] = "";          static BYTE RAMStringBody[] = "Message generated by stack " VERSION " \r\n\r\nButtons:  3210";          RAMStringBody[sizeof(RAMStringBody)‐2] = '0' + BUTTON0_IO;          RAMStringBody[sizeof(RAMStringBody)‐3] = '0' + BUTTON1_IO;          RAMStringBody[sizeof(RAMStringBody)‐4] = '0' + BUTTON2_IO;          RAMStringBody[sizeof(RAMStringBody)‐5] = '0' + BUTTON3_IO;            SMTPClient.Server.szROM = (ROM BYTE*)"mail";  // SMTP server address          SMTPClient.ROMPointers.Server = 1;          //SMTPClient.Username.szROM = (ROM BYTE*)"mchpboard";          //SMTPClient.ROMPointers.Username = 1;          //SMTPClient.Password.szROM = (ROM BYTE*)"secretpassword";          //SMTPClient.ROMPointers.Password = 1;          SMTPClient.To.szRAM = RAMStringTo;          SMTPClient.From.szROM = (ROM BYTE*)"\"SMTP Service\" ";          SMTPClient.ROMPointers.From = 1;          SMTPClient.Subject.szROM = (ROM BYTE*)"Hello world!  SMTP Test.";          SMTPClient.ROMPointers.Subject = 1;          SMTPClient.Body.szRAM = RAMStringBody;          SMTPSendMail();          MailState++;        }        break;        case MAIL_SMTP_FINISHING:        if(!SMTPIsBusy())        {          // Finished sending mail      Sabbe Kris       Code PIC  93          LED1_IO = 0;          MailState++;          WaitTime = TickGet();          LED2_IO = (SMTPEndUsage() == SMTP_SUCCESS);        }        break;        case MAIL_DONE:        // Wait for the user to release BUTTON2 or BUTTON3 and for at         // least 1 second to pass before allowing another         // email to be sent.  This is merely to prevent         // accidental flooding of email boxes while         // developing code.  Your application may wish to         // remove this.        if(BUTTON2_IO && BUTTON3_IO)        {          if(TickGet() ‐ WaitTime > TICK_SECOND)            MailState = MAIL_HOME;        }        break;    }  }    #endif //#if defined(STACK_USE_SMTP_CLIENT)          Sabbe Kris  Code Horizontale synchronisatie FPGA  94  // WARNING: Do NOT edit the input and output ports in this file in a text  // editor if you plan to continue editing the block that represents it in  // the Block Editor! File corruption is VERY likely to occur.    // Copyright (C) 1991‐2007 Altera Corporation  // Your use of Altera Corporation's design tools, logic functions   // and other software and tools, and its AMPP partner logic   // functions, and any output files from any of the foregoing   // (including device programming or simulation files), and any   // associated documentation or information are expressly subject   // to the terms and conditions of the Altera Program License   // Subscription Agreement, Altera MegaCore Function License   // Agreement, or other applicable license agreement, including,   // without limitation, that your use is for the sole purpose of   // programming logic devices manufactured by Altera and sold by   // Altera or its authorized distributors.  Please refer to the   // applicable agreement for further details.      // Generated by Quartus II Version 7.2 (Build Build 175 11/20/2007)  // Created on Thu Mar 06 10:01:11 2008    //  Module Declaration  module H_sync  (    // {{ALTERA_ARGS_BEGIN}} DO NOT REMOVE THIS LINE!    klokje, H_sync, blank, tel_0    // {{ALTERA_ARGS_END}} DO NOT REMOVE THIS LINE!  );  // Port Declaration      // {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!    input klokje;    output H_sync;    output blank;    output tel_0;    reg H_sync;    reg blank;    reg [19:0] teller;    reg tel_0;    // {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!    always @ (posedge klokje)    begin      if(teller < 830) blank <=0;      if(teller >= 830 && teller <835)         begin          //H_sync <=1;          blank <=1;        end      if(teller >=835 && teller <840)        begin          H_sync <=1;          blank <=1;        end      if(teller >= 840) begin        H_sync <=0;        blank <=0;        teller =0;      end      teller = teller + 1;    end      endmodule      Sabbe Kris  Code verticale synchronisatie FPGA  // WARNING: Do NOT edit the input and output ports in this file in a text  // editor if you plan to continue editing the block that represents it in  // the Block Editor! File corruption is VERY likely to occur.    // Copyright (C) 1991‐2007 Altera Corporation  // Your use of Altera Corporation's design tools, logic functions   // and other software and tools, and its AMPP partner logic   // functions, and any output files from any of the foregoing   // (including device programming or simulation files), and any   // associated documentation or information are expressly subject   // to the terms and conditions of the Altera Program License   // Subscription Agreement, Altera MegaCore Function License   // Agreement, or other applicable license agreement, including,   // without limitation, that your use is for the sole purpose of   // programming logic devices manufactured by Altera and sold by   // Altera or its authorized distributors.  Please refer to the   // applicable agreement for further details.      // Generated by Quartus II Version 7.2 (Build Build 175 11/20/2007)  // Created on Thu Mar 06 10:59:34 2008    //  Module Declaration  module V_sync  (    // {{ALTERA_ARGS_BEGIN}} DO NOT REMOVE THIS LINE!    klokje, V_sync, blank, tel_0    // {{ALTERA_ARGS_END}} DO NOT REMOVE THIS LINE!  );  // Port Declaration      // {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!    input klokje;    output V_sync;    output blank;    output tel_0;    reg V_sync;    reg blank;    reg [19:0] teller;    reg tel_0;    // {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!    always @ (posedge klokje)    begin      if(teller < 533390) blank <=0;      if(teller >= 533390 && teller <533395)         begin          //V_sync <=1;          blank <=1;        end      if(teller >= 533395 && teller <533400)        begin          V_sync <=1;          blank <=1;        end      if(teller >= 533400) begin        V_sync <=0;        blank <=0;        teller =0;      end      teller = teller + 1;    end      endmodule  95  Sabbe Kris  Code beeld‐enabler FPGA  96  Softwarecode om de keuze te maken tussen de verschillende beeld blokken.    // WARNING: Do NOT edit the input and output ports in this file in a text  // editor if you plan to continue editing the block that represents it in  // the Block Editor! File corruption is VERY likely to occur.    // Copyright (C) 1991‐2007 Altera Corporation  // Your use of Altera Corporation's design tools, logic functions   // and other software and tools, and its AMPP partner logic   // functions, and any output files from any of the foregoing   // (including device programming or simulation files), and any   // associated documentation or information are expressly subject   // to the terms and conditions of the Altera Program License   // Subscription Agreement, Altera MegaCore Function License   // Agreement, or other applicable license agreement, including,   // without limitation, that your use is for the sole purpose of   // programming logic devices manufactured by Altera and sold by   // Altera or its authorized distributors.  Please refer to the   // applicable agreement for further details.      // Generated by Quartus II Version 7.2 (Build Build 175 11/20/2007)  // Created on Tue Apr 01 08:37:47 2008    //  Module Declaration  module enabler_2  (    // {{ALTERA_ARGS_BEGIN}} DO NOT REMOVE THIS LINE!    enable1, enable2, enable3, enable4, uit1, uit2, uit3, uit4_1, uit4_2,     uit4_3, uit4_4    // {{ALTERA_ARGS_END}} DO NOT REMOVE THIS LINE!  );  // Port Declaration      // {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!    input enable1;    input enable2;    input enable3;    input enable4;    output uit1;    output uit2;    output uit3;    output uit4_1;    output uit4_2;    output uit4_3;  output uit4_4;      reg uit1;    reg uit2;    reg uit3;    reg uit4_1;    reg uit4_2;    reg uit4_3;    reg uit4_4;    // {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!    always    begin      if (enable1==0 && enable2==0 && enable3==0 && enable4==0)      begin        uit1 <= 1'b0;        uit2 <= 1'b0;        uit3 <= 1'b0;        uit4_1 <= 1'b0;        uit4_2 <= 1'b0;        uit4_3 <= 1'b0;        uit4_4 <= 1'b0;      end      if (enable1==1 && enable2==0 && enable3==0 && enable4==0)      begin        uit1 <= 1'b1;        uit2 <= 1'b0;        uit3 <= 1'b0;      Sabbe Kris                                                                                                                                                                                                                                                                        end      endmodule  Code beeld‐enabler FPGA  97    uit4_1 <= 1'b0;    uit4_2 <= 1'b0;    uit4_3 <= 1'b0;    uit4_4 <= 1'b0;  end  if (enable1==0 && enable2==1 && enable3==0 && enable4==0)  begin    uit1 <= 1'b0;    uit2 <= 1'b1;    uit3 <= 1'b0;    uit4_1 <= 1'b0;    uit4_2 <= 1'b0;    uit4_3 <= 1'b0;    uit4_4 <= 1'b0;  end  if (enable1==0 && enable2==0 && enable3==1 && enable4==0)  begin    uit1 <= 1'b0;    uit2 <= 1'b0;    uit3 <= 1'b1;    uit4_1 <= 1'b0;    uit4_2 <= 1'b0;    uit4_3 <= 1'b0;    uit4_4 <= 1'b0;  end  if (enable1==0 && enable2==0 && enable3==0 && enable4==1)  begin    uit1 <= 1'b0;    uit2 <= 1'b0;    uit3 <= 1'b0;    uit4_1 <= 1'b1;    uit4_2 <= 1'b0;    uit4_3 <= 1'b0;    uit4_4 <= 1'b0;  end  if (enable1==1 && enable2==0 && enable3==0 && enable4==1)  begin    uit1 <= 1'b0;    uit2 <= 1'b0;    uit3 <= 1'b0;    uit4_1 <= 1'b0;    uit4_2 <= 1'b1;  uit4_3 <= 1'b0;      uit4_4 <= 1'b0;  end  if (enable1==0 && enable2==1 && enable3==0 && enable4==1)  begin    uit1 <= 1'b0;    uit2 <= 1'b0;    uit3 <= 1'b0;    uit4_1 <= 1'b0;    uit4_2 <= 1'b0;    uit4_3 <= 1'b1;    uit4_4 <= 1'b0;  end  if (enable1==0 && enable2==0 && enable3==1 && enable4==1)  begin    uit1 <= 1'b0;    uit2 <= 1'b0;    uit3 <= 1'b0;    uit4_1 <= 1'b0;    uit4_2 <= 1'b0;    uit4_3 <= 1'b0;    uit4_4 <= 1'b1;  end      Sabbe Kris  Code beeldopbouw FPGA  98  Softwarecode om de data ontvangen uit de pic, afkomstig van de lichttafel, om te zetten  naar beeld    // WARNING: Do NOT edit the input and output ports in this file in a text  // editor if you plan to continue editing the block that represents it in  // the Block Editor! File corruption is VERY likely to occur.    // Copyright (C) 1991‐2007 Altera Corporation  // Your use of Altera Corporation's design tools, logic functions   // and other software and tools, and its AMPP partner logic   // functions, and any output files from any of the foregoing   // (including device programming or simulation files), and any   // associated documentation or information are expressly subject   // to the terms and conditions of the Altera Program License   // Subscription Agreement, Altera MegaCore Function License   // Agreement, or other applicable license agreement, including,   // without limitation, that your use is for the sole purpose of   // programming logic devices manufactured by Altera and sold by   // Altera or its authorized distributors.  Please refer to the   // applicable agreement for further details.      // Generated by Quartus II Version 7.2 (Build Build 175 11/20/2007)  // Created on Tue Mar 11 13:15:29 2008    //  Module Declaration  module beeldopbouw  (    // {{ALTERA_ARGS_BEGIN}} DO NOT REMOVE THIS LINE!    data0, data1, data2, data3, data4, data5, data6, data7, lees, update,     klok, enable, teller, H_sync, V_sync, blank, uit0, uit1, uit2, uit3, uit4,     uit5, uit6, uit7, uit8, uit9, uit10, uit11, uit12, uit13, uit14, uit15,     uit16, uit17, uit18, uit19, uit20, uit21, uit22, uit23    // {{ALTERA_ARGS_END}} DO NOT REMOVE THIS LINE!  );  // Port Declaration      // {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!    input data0;    input data1;    input data2;    input data3;    input data4;    input data5;    input data6;    input data7;    input lees;    input update;    input klok;    input enable;    input [4:0] teller;    input H_sync;    input V_sync;    input blank;    output uit0;    output uit1;    output uit2;    output uit3;    output uit4;    output uit5;    output uit6;    output uit7;    output uit8;    output uit9;    output uit10;    output uit11;    output uit12;    output uit13;    output uit14;    output uit15;      Sabbe Kris                                                                                                                                                Code beeldopbouw FPGA  99  output uit16;  output uit17;  output uit18;  output uit19;  output uit20;  output uit21;  output uit22;  output uit23;  reg uit0;  reg uit1;  reg uit2;  reg uit3;  reg uit4;  reg uit5;  reg uit6;  reg uit7;  reg uit8;  reg uit9;  reg uit10;  reg uit11;  reg uit12;  reg uit13;  reg uit14;  reg uit15;  reg uit16;  reg uit17;  reg uit18;  reg uit19;  reg uit20;  reg uit21;  reg uit22;  reg uit23;  reg [19:0] bla1;  reg [19:0] bla2;  reg [20:0] teller_V;  reg [20:0] teller_H;  reg [23:0] datain0;  reg [23:0] datain1;  reg [23:0] datain2;  reg [23:0] datain3;  reg [23:0] datain4;  reg [23:0] datain5;  reg [23:0] datain6;  reg [23:0] datain7;      // {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!  always @(posedge klok)  begin    /*teller_H=teller_H+1;    if(teller_H==840)    begin      teller_V = teller_V+1;    end    if (V_sync == 1)    begin      teller_V=0;      teller_H=0;    end*/        if(enable==1)    begin                if(teller_H == 840)    begin      teller_H=0;      teller_V = teller_V+1;    end    if(V_sync == 1)      Sabbe Kris                                                                                                                                                                                                                                                                                              Code beeldopbouw FPGA  begin    teller_H=0;    teller_V=0;  end  if(blank==1)  begin    //teller_V=0;    teller_H=0;  end  teller_H = teller_H+1;          /*if(enable==1)  begin*/    case(teller_V)      50:                                                                                                                                                                        51:                                                                                                                                                        begin                                                      end  begin                                                    100  uit5 <= datain0[0];  uit10 <= datain1[0];  uit0 <= datain2[0];  uit1 <= datain3[0];  uit2 <= datain4[0];  uit3 <= datain5[0];  uit4 <= datain6[0];  uit6 <= datain7[0];    uit11 <= datain0[1];  uit16 <= datain1[1];  uit7 <= datain2[1];  uit8 <= datain3[1];  uit9 <= datain4[1];  uit12 <= datain5[1];  uit13 <= datain6[1];  uit14 <= datain7[1];        uit17 <= datain0[2];  uit23 <= datain1[2];  uit15 <= datain2[2];  uit18 <= datain3[2];  uit19 <= datain4[2];  uit20 <= datain5[2];  uit21 <= datain6[2];  uit22 <= datain7[2];  uit5 <= datain0[3];  uit10 <= datain1[3];  uit0 <= datain2[3];  uit1 <= datain3[3];  uit2 <= datain4[3];  uit3 <= datain5[3];  uit4 <= datain6[3];  uit6 <= datain7[3];    uit11 <= datain0[4];  uit16 <= datain1[4];  uit7 <= datain2[4];  uit8 <= datain3[4];  uit9 <= datain4[4];  uit12 <= datain5[4];  uit13 <= datain6[4];  uit14 <= datain7[4];        uit17 <= datain0[5];  uit23 <= datain1[5];  uit15 <= datain2[5];  uit18 <= datain3[5];  uit19 <= datain4[5];  uit20 <= datain5[5];  uit21 <= datain6[5];      Sabbe Kris                                                                                                                                                                                                                                                                                              Code beeldopbouw FPGA                                                                                                                                                                                                                                                                                                  52:                                                        53:                                                        54:                            end  begin                                                      end  begin                                                      end  begin                          101  uit22 <= datain7[5];  uit5 <= datain0[6];  uit10 <= datain1[6];  uit0 <= datain2[6];  uit1 <= datain3[6];  uit2 <= datain4[6];  uit3 <= datain5[6];  uit4 <= datain6[6];  uit6 <= datain7[6];    uit11 <= datain0[7];  uit16 <= datain1[7];  uit7 <= datain2[7];  uit8 <= datain3[7];  uit9 <= datain4[7];  uit12 <= datain5[7];  uit13 <= datain6[7];  uit14 <= datain7[7];        uit17 <= datain0[8];  uit23 <= datain1[8];  uit15 <= datain2[8];  uit18 <= datain3[8];  uit19 <= datain4[8];  uit20 <= datain5[8];  uit21 <= datain6[8];  uit22 <= datain7[8];  uit5 <= datain0[9];  uit10 <= datain1[9];  uit0 <= datain2[9];  uit1 <= datain3[9];  uit2 <= datain4[9];  uit3 <= datain5[9];  uit4 <= datain6[9];  uit6 <= datain7[9];    uit11 <= datain0[10];  uit16 <= datain1[10];  uit7 <= datain2[10];  uit8 <= datain3[10];  uit9 <= datain4[10];  uit12 <= datain5[10];  uit13 <= datain6[10];  uit14 <= datain7[10];        uit17 <= datain0[11];  uit23 <= datain1[11];  uit15 <= datain2[11];  uit18 <= datain3[11];  uit19 <= datain4[11];  uit20 <= datain5[11];  uit21 <= datain6[11];  uit22 <= datain7[11];  uit5 <= datain0[12];  uit10 <= datain1[12];  uit0 <= datain2[12];  uit1 <= datain3[12];  uit2 <= datain4[12];  uit3 <= datain5[12];  uit4 <= datain6[12];  uit6 <= datain7[12];    uit11 <= datain0[13];  uit16 <= datain1[13];  uit7 <= datain2[13];      Sabbe Kris                                                                                                                                                                                                                                                                                              Code beeldopbouw FPGA                                                                                                                                                                                                                                                                                                                            55:                                                        56:                                                                                    end  begin                                                      end  begin                                                      end  102  uit8 <= datain3[13];  uit9 <= datain4[13];  uit12 <= datain5[13];  uit13 <= datain6[13];  uit14 <= datain7[13];        uit17 <= datain0[14];  uit23 <= datain1[14];  uit15 <= datain2[14];  uit18 <= datain3[14];  uit19 <= datain4[14];  uit20 <= datain5[14];  uit21 <= datain6[14];  uit22 <= datain7[14];  uit5 <= datain0[15];  uit10 <= datain1[15];  uit0 <= datain2[15];  uit1 <= datain3[15];  uit2 <= datain4[15];  uit3 <= datain5[15];  uit4 <= datain6[15];  uit6 <= datain7[15];    uit11 <= datain0[16];  uit16 <= datain1[16];  uit7 <= datain2[16];  uit8 <= datain3[16];  uit9 <= datain4[16];  uit12 <= datain5[16];  uit13 <= datain6[16];  uit14 <= datain7[16];        uit17 <= datain0[17];  uit23 <= datain1[17];  uit15 <= datain2[17];  uit18 <= datain3[17];  uit19 <= datain4[17];  uit20 <= datain5[17];  uit21 <= datain6[17];  uit22 <= datain7[17];  uit5 <= datain0[18];  uit10 <= datain1[18];  uit0 <= datain2[18];  uit1 <= datain3[18];  uit2 <= datain4[18];  uit3 <= datain5[18];  uit4 <= datain6[18];  uit6 <= datain7[18];    uit11 <= datain0[19];  uit16 <= datain1[19];  uit7 <= datain2[19];  uit8 <= datain3[19];  uit9 <= datain4[19];  uit12 <= datain5[19];  uit13 <= datain6[19];  uit14 <= datain7[19];        uit17 <= datain0[20];  uit23 <= datain1[20];  uit15 <= datain2[20];  uit18 <= datain3[20];  uit19 <= datain4[20];  uit20 <= datain5[20];  uit21 <= datain6[20];  uit22 <= datain7[20];      Sabbe Kris                                                                                                                                                Code beeldopbouw FPGA  103        57:  begin            uit5 <= datain0[21];            uit10 <= datain1[21];            uit0 <= datain2[21];            uit1 <= datain3[21];            uit2 <= datain4[21];            uit3 <= datain5[21];            uit4 <= datain6[21];            uit6 <= datain7[21];                        uit11 <= datain0[22];            uit16 <= datain1[22];            uit7 <= datain2[22];            uit8 <= datain3[22];            uit9 <= datain4[22];            uit12 <= datain5[22];            uit13 <= datain6[22];            uit14 <= datain7[22];                            uit17 <= datain0[23];            uit23 <= datain1[23];            uit15 <= datain2[23];            uit18 <= datain3[23];            uit19 <= datain4[23];            uit20 <= datain5[23];            uit21 <= datain6[23];            uit22 <= datain7[23];          end      endcase    end    if(enable==0)    begin      uit0 <= 1'b0;      uit1 <= 1'b0;      uit2 <= 1'b0;      uit3 <= 1'b0;      uit4 <= 1'b0;      uit5 <= 1'b0;      uit6 <= 1'b0;      uit7 <= 1'b0;      uit8 <= 1'b0;      uit9 <= 1'b0;      uit10 <= 1'b0;      uit11 <= 1'b0;      uit12 <= 1'b0;      uit13 <= 1'b0;      uit14 <= 1'b0;      uit15 <= 1'b0;  uit16 <= 1'b0;          uit17 <= 1'b0;      uit18 <= 1'b0;      uit19 <= 1'b0;      uit20 <= 1'b0;      uit21 <= 1'b0;      uit22 <= 1'b0;      uit23 <= 1'b0;    end  end  always //@(posedge lees)  begin    if(teller >=0 && teller <=25)    begin      if (lees ==1 && enable==1)      begin          case (teller)            0:  begin                 datain0[0] <= data0;                datain1[0] <= data1;                datain2[0] <= data2;                datain3[0] <= data3;                datain4[0] <= data4;      Sabbe Kris                                                                                                                                                                                                                                                                                              Code beeldopbouw FPGA                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  1:                    2:                    3:                    4:                    5:                    6:                    7:                    end   begin                   end   begin                   end   begin                   end  begin                   end  begin                   end  begin                   end  begin               104  datain5[0] <= data5;  datain6[0] <= data6;  datain7[0] <= data7;  datain0[1] <= data0;  datain1[1] <= data1;  datain2[1] <= data2;  datain3[1] <= data3;  datain4[1] <= data4;  datain5[1] <= data5;  datain6[1] <= data6;  datain7[1] <= data7;  datain0[2] <= data0;  datain1[2] <= data1;  datain2[2] <= data2;  datain3[2] <= data3;  datain4[2] <= data4;  datain5[2] <= data5;  datain6[2] <= data6;  datain7[2] <= data7;  datain0[3] <= data0;  datain1[3] <= data1;  datain2[3] <= data2;  datain3[3] <= data3;  datain4[3] <= data4;  datain5[3] <= data5;  datain6[3] <= data6;  datain7[3] <= data7;  datain0[4] <= data0;  datain1[4] <= data1;  datain2[4] <= data2;  datain3[4] <= data3;  datain4[4] <= data4;  datain5[4] <= data5;  datain6[4] <= data6;  datain7[4] <= data7;  datain0[5] <= data0;  datain1[5] <= data1;  datain2[5] <= data2;  datain3[5] <= data3;  datain4[5] <= data4;  datain5[5] <= data5;  datain6[5] <= data6;  datain7[5] <= data7;  datain0[6] <= data0;  datain1[6] <= data1;  datain2[6] <= data2;  datain3[6] <= data3;  datain4[6] <= data4;  datain5[6] <= data5;  datain6[6] <= data6;  datain7[6] <= data7;  datain0[7] <= data0;  datain1[7] <= data1;  datain2[7] <= data2;  datain3[7] <= data3;  datain4[7] <= data4;  datain5[7] <= data5;      Sabbe Kris                                                                                                                                                                                                                                                                                              Code beeldopbouw FPGA                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                8:                    9:                    10:                    11:                    12:                    13:                    14:                    end  begin                   end  begin                   end  begin                   end  begin                   end  begin                   end  begin                   end  begin                 105  datain6[7] <= data6;  datain7[7] <= data7;  datain0[8] <= data0;  datain1[8] <= data1;  datain2[8] <= data2;  datain3[8] <= data3;  datain4[8] <= data4;  datain5[8] <= data5;  datain6[8] <= data6;  datain7[8] <= data7;  datain0[9] <= data0;  datain1[9] <= data1;  datain2[9] <= data2;  datain3[9] <= data3;  datain4[9] <= data4;  datain5[9] <= data5;  datain6[9] <= data6;  datain7[9] <= data7;  datain0[10] <= data0;  datain1[10] <= data1;  datain2[10] <= data2;  datain3[10] <= data3;  datain4[10] <= data4;  datain5[10] <= data5;  datain6[10] <= data6;  datain7[10] <= data7;  datain0[11] <= data0;  datain1[11] <= data1;  datain2[11] <= data2;  datain3[11] <= data3;  datain4[11] <= data4;  datain5[11] <= data5;  datain6[11] <= data6;  datain7[11] <= data7;  datain0[12] <= data0;  datain1[12] <= data1;  datain2[12] <= data2;  datain3[12] <= data3;  datain4[12] <= data4;  datain5[12] <= data5;  datain6[12] <= data6;  datain7[12] <= data7;  datain0[13] <= data0;  datain1[13] <= data1;  datain2[13] <= data2;  datain3[13] <= data3;  datain4[13] <= data4;  datain5[13] <= data5;  datain6[13] <= data6;  datain7[13] <= data7;  datain0[14] <= data0;  datain1[14] <= data1;  datain2[14] <= data2;  datain3[14] <= data3;  datain4[14] <= data4;  datain5[14] <= data5;  datain6[14] <= data6;      Sabbe Kris                                                                                                                                                                                                                                                                                              Code beeldopbouw FPGA                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              15:                    16:                    17:                    18:                    19:                    20:                    21:                    end  begin                   end  begin                   end  begin                   end  begin                   end  begin                   end  begin                   end  begin                   106  datain7[14] <= data7;  datain0[15] <= data0;  datain1[15] <= data1;  datain2[15] <= data2;  datain3[15] <= data3;  datain4[15] <= data4;  datain5[15] <= data5;  datain6[15] <= data6;  datain7[15] <= data7;  datain0[16] <= data0;  datain1[16] <= data1;  datain2[16] <= data2;  datain3[16] <= data3;  datain4[16] <= data4;  datain5[16] <= data5;  datain6[16] <= data6;  datain7[16] <= data7;  datain0[17] <= data0;  datain1[17] <= data1;  datain2[17] <= data2;  datain3[17] <= data3;  datain4[17] <= data4;  datain5[17] <= data5;  datain6[17] <= data6;  datain7[17] <= data7;  datain0[18] <= data0;  datain1[18] <= data1;  datain2[18] <= data2;  datain3[18] <= data3;  datain4[18] <= data4;  datain5[18] <= data5;  datain6[18] <= data6;  datain7[18] <= data7;  datain0[19] <= data0;  datain1[19] <= data1;  datain2[19] <= data2;  datain3[19] <= data3;  datain4[19] <= data4;  datain5[19] <= data5;  datain6[19] <= data6;  datain7[19] <= data7;  datain0[20] <= data0;  datain1[20] <= data1;  datain2[20] <= data2;  datain3[20] <= data3;  datain4[20] <= data4;  datain5[20] <= data5;  datain6[20] <= data6;  datain7[20] <= data7;  datain0[21] <= data0;  datain1[21] <= data1;  datain2[21] <= data2;  datain3[21] <= data3;  datain4[21] <= data4;  datain5[21] <= data5;  datain6[21] <= data6;  datain7[21] <= data7;      Sabbe Kris                                                                                                        end            endmodule  Code beeldopbouw FPGA                                                end                                                end                                                                                        endcase    22:                    23:                    end  begin                   end  begin                   end  107  datain0[22] <= data0;  datain1[22] <= data1;  datain2[22] <= data2;  datain3[22] <= data3;  datain4[22] <= data4;  datain5[22] <= data5;  datain6[22] <= data6;  datain7[22] <= data7;  datain0[23] <= data0;  datain1[23] <= data1;  datain2[23] <= data2;  datain3[23] <= data3;  datain4[23] <= data4;  datain5[23] <= data5;  datain6[23] <= data6;  datain7[23] <= data7;      Sabbe Kris  Code beeldopbouw 2 FPGA  108  Softwarecode om de lus met kleuren rood, groen, blauw, wit en zwart op het beeldscherm  te krijgen     // WARNING: Do NOT edit the input and output ports in this file in a text  // editor if you plan to continue editing the block that represents it in  // the Block Editor! File corruption is VERY likely to occur.    // Copyright (C) 1991‐2007 Altera Corporation  // Your use of Altera Corporation's design tools, logic functions   // and other software and tools, and its AMPP partner logic   // functions, and any output files from any of the foregoing   // (including device programming or simulation files), and any   // associated documentation or information are expressly subject   // to the terms and conditions of the Altera Program License   // Subscription Agreement, Altera MegaCore Function License   // Agreement, or other applicable license agreement, including,   // without limitation, that your use is for the sole purpose of   // programming logic devices manufactured by Altera and sold by   // Altera or its authorized distributors.  Please refer to the   // applicable agreement for further details.      // Generated by Quartus II Version 7.2 (Build Build 175 11/20/2007)  // Created on Thu Mar 13 11:53:25 2008    //  Module Declaration  module beeldopbouw2  (    // {{ALTERA_ARGS_BEGIN}} DO NOT REMOVE THIS LINE!    data0, data1, data2, data3, data4, data5, data6, data7, lees, update,     klok, enable, teller, H_sync, V_sync, blank, uit0, uit1, uit2, uit3, uit4,     uit5, uit6, uit7, uit8, uit9, uit10, uit11, uit12, uit13, uit14, uit15,     uit16, uit17, uit18, uit19, uit20, uit21, uit22, uit23    // {{ALTERA_ARGS_END}} DO NOT REMOVE THIS LINE!  );  // Port Declaration      // {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!    input data0;    input data1;    input data2;    input data3;    input data4;    input data5;    input data6;    input data7;    input lees;    input update;    input klok;    input enable;    input [4:0] teller;    input H_sync;    input V_sync;    input blank;    output uit0;    output uit1;    output uit2;    output uit3;    output uit4;    output uit5;    output uit6;    output uit7;    output uit8;    output uit9;    output uit10;    output uit11;    output uit12;    output uit13;    output uit14;    output uit15;      Sabbe Kris                                                                                                                                                Code beeldopbouw 2 FPGA  109  output uit16;  output uit17;  output uit18;  output uit19;  output uit20;  output uit21;  output uit22;  output uit23;  reg uit0;  reg uit1;  reg uit2;  reg uit3;  reg uit4;  reg uit5;  reg uit6;  reg uit7;  reg uit8;  reg uit9;  reg uit10;  reg uit11;  reg uit12;  reg uit13;  reg uit14;  reg uit15;  reg uit16;  reg uit17;  reg uit18;  reg uit19;  reg uit20;  reg uit21;  reg uit22;  reg uit23;  reg [4:0] telraam;  reg [30:0] teller3;    // {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!  always @(posedge klok)  begin      if (enable==1)      begin        teller3=teller3+1;        if (teller3==16000000)        begin          telraam = telraam+1;          teller3 = 0;        end                case (telraam)          1: begin//rood            uit0 <= 1'b1;            uit1 <= 1'b1;            uit2 <= 1'b1;            uit3 <= 1'b1;            uit4 <= 1'b1;            uit5 <= 1'b1;            uit6 <= 1'b1;            uit7 <= 1'b0;  uit8 <= 1'b0;                      uit9 <= 1'b0;            uit10 <= 1'b1;            uit11 <= 1'b0;            uit12 <= 1'b0;            uit13 <= 1'b0;            uit14 <= 1'b0;            uit15 <= 1'b0;            uit16 <= 1'b0;            uit17 <= 1'b0;            uit18 <= 1'b0;            uit19 <= 1'b0;            uit20 <= 1'b0;            uit21 <= 1'b0;      Sabbe Kris                                                                                                                                                                                                                                                                                              Code beeldopbouw 2 FPGA                                                                                                                                                                                                                                                                                                                                                                                                                                            110    uit22 <= 1'b0;    uit23 <= 1'b0;  end  2:  begin//groen    uit0 <= 1'b0;    uit1 <= 1'b0;    uit2 <= 1'b0;    uit3 <= 1'b0;    uit4 <= 1'b0;    uit5 <= 1'b0;    uit6 <= 1'b0;    uit7 <= 1'b1;    uit8 <= 1'b1;    uit9 <= 1'b1;    uit10 <= 1'b0;  uit11 <= 1'b1;      uit12 <= 1'b1;    uit13 <= 1'b1;    uit14 <= 1'b1;    uit15 <= 1'b0;    uit16 <= 1'b1;    uit17 <= 1'b0;    uit18 <= 1'b0;    uit19 <= 1'b0;    uit20 <= 1'b0;    uit21 <= 1'b0;    uit22 <= 1'b0;    uit23 <= 1'b0;  end   3:  begin//blauw    uit0 <= 1'b0;    uit1 <= 1'b0;    uit2 <= 1'b0;    uit3 <= 1'b0;    uit4 <= 1'b0;    uit5 <= 1'b0;    uit6 <= 1'b0;    uit7 <= 1'b0;    uit8 <= 1'b0;    uit9 <= 1'b0;    uit10 <= 1'b0;    uit11 <= 1'b0;    uit12 <= 1'b0;    uit13 <= 1'b0;    uit14 <= 1'b0;    uit15 <= 1'b1;    uit16 <= 1'b0;    uit17 <= 1'b1;    uit18 <= 1'b1;    uit19 <= 1'b1;    uit20 <= 1'b1;    uit21 <= 1'b1;    uit22 <= 1'b1;    uit23 <= 1'b1;  end   4: begin//wit    uit0 <= 1'b1;    uit1 <= 1'b1;    uit2 <= 1'b1;    uit3 <= 1'b1;    uit4 <= 1'b1;    uit5 <= 1'b1;    uit6 <= 1'b1;    uit7 <= 1'b1;    uit8 <= 1'b1;    uit9 <= 1'b1;    uit10 <= 1'b1;    uit11 <= 1'b1;    uit12 <= 1'b1;      Sabbe Kris                                                                                                                                                                                                                                                                                          endmodule  Code beeldopbouw 2 FPGA                                                                                                                                            end  111        uit13 <= 1'b1;        uit14 <= 1'b1;        uit15 <= 1'b1;        uit16 <= 1'b1;        uit17 <= 1'b1;        uit18 <= 1'b1;        uit19 <= 1'b1;        uit20 <= 1'b1;        uit21 <= 1'b1;        uit22 <= 1'b1;        uit23 <= 1'b1;      end        5: begin//zwart        uit0 <= 1'b0;        uit1 <= 1'b0;        uit2 <= 1'b0;        uit3 <= 1'b0;        uit4 <= 1'b0;        uit5 <= 1'b0;        uit6 <= 1'b0;        uit7 <= 1'b0;        uit8 <= 1'b0;        uit9 <= 1'b0;        uit10 <= 1'b0;        uit11 <= 1'b0;        uit12 <= 1'b0;        uit13 <= 1'b0;        uit14 <= 1'b0;        uit15 <= 1'b0;        uit16 <= 1'b0;        uit17 <= 1'b0;        uit18 <= 1'b0;        uit19 <= 1'b0;        uit20 <= 1'b0;        uit21 <= 1'b0;        uit22 <= 1'b0;        uit23 <= 1'b0;        telraam = 0;      end      endcase  end  if (enable==0)  begin    uit0 <= 1'b0;    uit1 <= 1'b0;    uit2 <= 1'b0;    uit3 <= 1'b0;    uit4 <= 1'b0;    uit5 <= 1'b0;    uit6 <= 1'b0;    uit7 <= 1'b0;    uit8 <= 1'b0;    uit9 <= 1'b0;    uit10 <= 1'b0;    uit11 <= 1'b0;    uit12 <= 1'b0;    uit13 <= 1'b0;    uit14 <= 1'b0;    uit15 <= 1'b0;    uit16 <= 1'b0;    uit17 <= 1'b0;  uit18 <= 1'b0;      uit19 <= 1'b0;    uit20 <= 1'b0;    uit21 <= 1'b0;    uit22 <= 1'b0;    uit23 <= 1'b0;    telraam = 0;  end        Sabbe Kris  Code beeldopbouw 3 FPGA  112  Softwarecode om één pixel op het beeldscherm te besturen vanaf de lichttafel.    // WARNING: Do NOT edit the input and output ports in this file in a text  // editor if you plan to continue editing the block that represents it in  // the Block Editor! File corruption is VERY likely to occur.    // Copyright (C) 1991‐2007 Altera Corporation  // Your use of Altera Corporation's design tools, logic functions   // and other software and tools, and its AMPP partner logic   // functions, and any output files from any of the foregoing   // (including device programming or simulation files), and any   // associated documentation or information are expressly subject   // to the terms and conditions of the Altera Program License   // Subscription Agreement, Altera MegaCore Function License   // Agreement, or other applicable license agreement, including,   // without limitation, that your use is for the sole purpose of   // programming logic devices manufactured by Altera and sold by   // Altera or its authorized distributors.  Please refer to the   // applicable agreement for further details.      // Generated by Quartus II Version 7.2 (Build Build 175 11/20/2007)  // Created on Tue Apr 01 08:31:55 2008    //  Module Declaration  module beeld_pix  (    // {{ALTERA_ARGS_BEGIN}} DO NOT REMOVE THIS LINE!    data0, data1, data2, data3, data4, data5, data6, data7, lees, update,     klok, enable1, enable2, enable3, enable4, teller, H_sync, V_sync, blank,     uit0, uit1, uit2, uit3, uit4, uit5, uit6, uit7, uit8, uit9, uit10, uit11,     uit12, uit13, uit14, uit15, uit16, uit17, uit18, uit19, uit20, uit21,     uit22, uit23    // {{ALTERA_ARGS_END}} DO NOT REMOVE THIS LINE!  );  // Port Declaration      // {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!    input data0;    input data1;    input data2;    input data3;    input data4;    input data5;    input data6;    input data7;    input lees;    input update;    input klok;    input enable1;    input enable2;    input enable3;    input enable4;    input [4:0] teller;    input H_sync;    input V_sync;    input blank;    output uit0;    output uit1;    output uit2;    output uit3;    output uit4;    output uit5;    output uit6;    output uit7;    output uit8;    output uit9;    output uit10;    output uit11;    output uit12;    output uit13;      Sabbe Kris                                                                                                                                                Code beeldopbouw 3 FPGA  113  output uit14;  output uit15;  output uit16;  output uit17;  output uit18;  output uit19;  output uit20;  output uit21;  output uit22;  output uit23;  reg uit0;  reg uit1;  reg uit2;  reg uit3;  reg uit4;  reg uit5;  reg uit6;  reg uit7;  reg uit8;  reg uit9;  reg uit10;  reg uit11;  reg uit12;  reg uit13;  reg uit14;  reg uit15;  reg uit16;  reg uit17;  reg uit18;  reg uit19;  reg uit20;  reg uit21;  reg uit22;  reg uit23;  reg [20:0] teller_V;  reg [20:0] teller_H;  reg [8:0] sab1;  reg [30:0] tel2;  reg d0;  reg d1;  reg d2;  reg d3;  reg d4;  reg d5;  reg d6;  reg d7;  reg d8;  reg d9;  reg d10;  reg d11;  reg d12;  reg d13;  reg d14;  reg d15;  reg d16;  reg d17;  reg d18;  reg d19;  reg d20;  reg d21;  reg d22;  reg d23;  reg d24;  reg d25;  reg d26;  reg d27;  reg d28;  reg d29;  reg d30;  reg d31;  reg d32;      Sabbe Kris                                                                                                                                                Code beeldopbouw 3 FPGA  114  reg d33;  reg d34;  reg d35;  reg d36;  reg d37;  reg d38;  reg d39;  reg [112:0] tel3;  reg [50:0] tel4;  reg [50:0] tel5;  reg [1:0] richting;  reg [50:0] tellertje;  reg [7:0] welkelijn;  // {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!  always @ (posedge klok)  begin    if(lees==1 && teller==0)    begin      d0 <= data0;      d1 <= data1;      d2 <= data2;      d3 <= data3;      d4 <= data4;      d5 <= data5;      d6 <= data6;      d7 <= data7;    end    if(lees==1 && teller==1)    begin      d8 <= data0;      d9 <= data1;      d10 <= data2;      d11 <= data3;      d12 <= data4;      d13 <= data5;      d14 <= data6;      d15 <= data7;    end    if(lees==1 && teller==2)    begin      d16 <= data0;      d17 <= data1;      d18 <= data2;      d19 <= data3;      d20 <= data4;      d21 <= data5;      d22 <= data6;      d23 <= data7;    end    if(lees==1 && teller==3)    begin      d24 <= data0;      d25 <= data1;      d26 <= data2;      d27 <= data3;      d28 <= data4;      d29 <= data5;      d30 <= data6;      d31 <= data7;    end    if(lees==1 && teller==4)    begin      d32 <= data0;      d33 <= data1;      d34 <= data2;      d35 <= data3;      d36 <= data4;      d37 <= data5;      d38 <= data6;      d39 <= data7;    end      Sabbe Kris                                                                                                                                                                                                                                                                                              Code beeldopbouw 3 FPGA    if(enable1 ==1)    begin                                                                                                                                                                                                                                                                              115  tel2 = tel2 + 1;  tel3 = tel3 + 1;  tel4 = 8400*8*(d24*1+d25*2+d26*4+d27*8+d28*16+d29*32+d30*64+d31*128);  tel5 = (d32*1+d33*2+d34*4+d35*8+d36*16+d37*32+d38*64+d39*128)/5;  if(tel2>=(17740800‐tel4))  begin    if(richting==0)    begin      sab1 = sab1+1;    end    if(richting==1)    begin      sab1 = sab1‐1;    end    tel2=0;  end  if(sab1>=111‐tel5)    /////////111 of 27 of 55  begin    richting=1;  end  if(sab1<=0)  begin    richting=0;  end  if(teller_H == 840)  begin    teller_H=0;    teller_V = teller_V+1;  end  if(V_sync == 1)  begin    teller_V=0;  end  if(blank==1)  begin    //teller_V=0;    teller_H=0;  end  teller_H = teller_H+1;  //teller_V = teller_V+1;  if(teller_V >=50 && teller_V <=57)  begin    if ( teller_H >=55+sab1 && teller_H <= 55+sab1+tel5)    begin      uit0 <= d2;      uit1 <= d3;      uit2 <= d4;      uit3 <= d5;      uit4 <= d6;      uit5 <= d0;      uit6 <= d7;      uit7 <= d10;      uit8 <= d11;      uit9 <= d12;  uit10 <= d1;          uit11 <= d8;      uit12 <= d13;      uit13 <= d14;      uit14 <= d15;      uit15 <= d18;      uit16 <= d9;      uit17 <= d16;      uit18 <= d19;      uit19 <= d20;      uit20 <= d21;      Sabbe Kris                                                                                                                                                Code beeldopbouw 3 FPGA                                                                                                                                                                                                            end                                                                          if(enable2 ==1)    begin                                                                                                                                                  else   begin                                                  end  end        end    116  uit21 <= d22;  uit22 <= d23;  uit23 <= d17;  uit0 <= 1'b0;  uit1 <= 1'b0;  uit2 <= 1'b0;  uit3 <= 1'b0;  uit4 <= 1'b0;  uit5 <= 1'b0;  uit6 <= 1'b0;  uit7 <= 1'b0;  uit8 <= 1'b0;  uit9 <= 1'b0;  uit10 <= 1'b0;  uit11 <= 1'b0;  uit12 <= 1'b0;  uit13 <= 1'b0;  uit14 <= 1'b0;  uit15 <= 1'b0;  uit16 <= 1'b0;  uit17 <= 1'b0;  uit18 <= 1'b0;  uit19 <= 1'b0;  uit20 <= 1'b0;  uit21 <= 1'b0;  uit22 <= 1'b0;  uit23 <= 1'b0;    tel2 = tel2 + 1;  tel3 = tel3 + 1;  tel4 = 8400*8*(d24*1+d25*2+d26*4+d27*8+d28*16+d29*32+d30*64+d31*128);  if(tel2>=(17740800‐tel4))  begin    if(richting==0)    begin      sab1 = sab1+1;    end    if(richting==1)    begin      sab1 = sab1‐1;    end    tel2=0;  end  if(sab1>=55)    /////////111 of 27 of 55  begin    richting=1;  end  if(sab1<=0)  begin    richting=0;  end  if(teller_H == 840)  begin    teller_H=0;    teller_V = teller_V+1;  end  if(V_sync == 1)  begin    teller_V=0;  end      Sabbe Kris                                                                                                                                                                                                                                                                                              Code beeldopbouw 3 FPGA                                                                                                                                                          if(blank==1)  begin    //teller_V=0;    teller_H=0;  end                                                                                                                          end  teller_H = teller_H+1;  //teller_V = teller_V+1;  if(teller_V >=50 && teller_V <=57)  begin    if ( teller_H ==55+sab1 || teller_H ==166‐sab1)    begin      uit0 <= d2;      uit1 <= d3;      uit2 <= d4;      uit3 <= d5;      uit4 <= d6;  uit5 <= d0;          uit6 <= d7;      uit7 <= d10;      uit8 <= d11;      uit9 <= d12;      uit10 <= d1;      uit11 <= d8;      uit12 <= d13;      uit13 <= d14;      uit14 <= d15;      uit15 <= d18;      uit16 <= d9;      uit17 <= d16;      uit18 <= d19;      uit19 <= d20;      uit20 <= d21;      uit21 <= d22;      uit22 <= d23;      uit23 <= d17;    end      else   begin    uit0 <= 1'b0;    uit1 <= 1'b0;    uit2 <= 1'b0;    uit3 <= 1'b0;    uit4 <= 1'b0;    uit5 <= 1'b0;    uit6 <= 1'b0;    uit7 <= 1'b0;    uit8 <= 1'b0;    uit9 <= 1'b0;    uit10 <= 1'b0;    uit11 <= 1'b0;    uit12 <= 1'b0;    uit13 <= 1'b0;    uit14 <= 1'b0;    uit15 <= 1'b0;    uit16 <= 1'b0;    uit17 <= 1'b0;    uit18 <= 1'b0;    uit19 <= 1'b0;    uit20 <= 1'b0;    uit21 <= 1'b0;    uit22 <= 1'b0;  uit23 <= 1'b0;    end    end  117      Sabbe Kris                                                                                                                                                                                                          ==166‐sab1)                                                                                  Code beeldopbouw 3 FPGA                                                                                                                                              118  if(enable3 ==1)  begin      tel2 = tel2 + 1;    tel3 = tel3 + 1;    tel4 = 8400*8*(d24*1+d25*2+d26*4+d27*8+d28*16+d29*32+d30*64+d31*128);    if(tel2>=(17740800‐tel4))    begin      if(richting==0)      begin        sab1 = sab1+1;      end      if(richting==1)      begin        sab1 = sab1‐1;      end      tel2=0;    end                                              if(sab1>=27)    /////////111 of 27 of 55  begin    richting=1;  end  if(sab1<=0)  begin    richting=0;  end  if(teller_H == 840)  begin    teller_H=0;    teller_V = teller_V+1;  end  if(V_sync == 1)  begin    teller_V=0;  end  if(blank==1)  begin    //teller_V=0;    teller_H=0;  end            teller_H = teller_H+1;  //teller_V = teller_V+1;  if(teller_V >=50 && teller_V <=57)  begin    if ( teller_H ==55+sab1 || teller_H ==110‐sab1 || teller_H ==111+sab1 || teller_H                                                                                  begin                                        uit0 <= d2;  uit1 <= d3;  uit2 <= d4;  uit3 <= d5;  uit4 <= d6;  uit5 <= d0;  uit6 <= d7;  uit7 <= d10;  uit8 <= d11;  uit9 <= d12;  uit10 <= d1;  uit11 <= d8;  uit12 <= d13;  uit13 <= d14;  uit14 <= d15;  uit15 <= d18;  uit16 <= d9;  uit17 <= d16;  uit18 <= d19;      Sabbe Kris                                                                                                                                                                                                                                                                                              Code beeldopbouw 3 FPGA                                                                                                                                                119        uit19 <= d20;        uit20 <= d21;        uit21 <= d22;        uit22 <= d23;        uit23 <= d17;      end          else     begin      uit0 <= 1'b0;      uit1 <= 1'b0;      uit2 <= 1'b0;      uit3 <= 1'b0;      uit4 <= 1'b0;      uit5 <= 1'b0;      uit6 <= 1'b0;      uit7 <= 1'b0;      uit8 <= 1'b0;      uit9 <= 1'b0;      uit10 <= 1'b0;      uit11 <= 1'b0;      uit12 <= 1'b0;      uit13 <= 1'b0;      uit14 <= 1'b0;      uit15 <= 1'b0;      uit16 <= 1'b0;      uit17 <= 1'b0;      uit18 <= 1'b0;      uit19 <= 1'b0;      uit20 <= 1'b0;      uit21 <= 1'b0;      uit22 <= 1'b0;      uit23 <= 1'b0;    end      end  end      if(enable4 ==1)  begin      tel2 = tel2 + 1;    tel3 = tel3 + 1;    tel4 = (d24*1+d25*2+d26*4+d27*8+d28*16+d29*32+d30*64+d31*128)/2;    if(tel2>=(17740800‐tel4))    begin      if(richting==0)      begin        sab1 = sab1+1;      end      if(richting==1)      begin        sab1 = sab1‐1;      end  tel2=0;        end                                if(sab1>=23)    /////////111 of 27 of 55  begin    richting=0;    sab1=0;  end  if(sab1<=0)  begin    richting=0;  end  if(teller_H == 840)  begin    teller_H=0;    teller_V = teller_V+1;  end  if(V_sync == 1)      Sabbe Kris                                                                                                                                                                                                                                                                                              Code beeldopbouw 3 FPGA                                                                                                                                                                begin    teller_V=0;  end  if(blank==1)  begin    //teller_V=0;    teller_H=0;  end                                                                                                                        teller_H = teller_H+1;  //teller_V = teller_V+1;  if(teller_V >=50 && teller_V <=57)  begin    if ( teller_H ==55+tel4)    begin      uit0 <= d2;      uit1 <= d3;      uit2 <= d4;      uit3 <= d5;      uit4 <= d6;      uit5 <= d0;      uit6 <= d7;      uit7 <= d10;      uit8 <= d11;      uit9 <= d12;      uit10 <= d1;      uit11 <= d8;      uit12 <= d13;      uit13 <= d14;      uit14 <= d15;      uit15 <= d18;      uit16 <= d9;      uit17 <= d16;      uit18 <= d19;      uit19 <= d20;      uit20 <= d21;      uit21 <= d22;      uit22 <= d23;      uit23 <= d17;    end      else   begin    uit0 <= 1'b0;    uit1 <= 1'b0;    uit2 <= 1'b0;    uit3 <= 1'b0;    uit4 <= 1'b0;    uit5 <= 1'b0;    uit6 <= 1'b0;    uit7 <= 1'b0;    uit8 <= 1'b0;    uit9 <= 1'b0;    uit10 <= 1'b0;    uit11 <= 1'b0;    uit12 <= 1'b0;    uit13 <= 1'b0;    uit14 <= 1'b0;    uit15 <= 1'b0;    uit16 <= 1'b0;    uit17 <= 1'b0;    uit18 <= 1'b0;    uit19 <= 1'b0;    uit20 <= 1'b0;    uit21 <= 1'b0;    uit22 <= 1'b0;    uit23 <= 1'b0;  end    120      Sabbe Kris                                                                                                                                        end  endmodule  Code beeldopbouw 3 FPGA  121      end    end          if(enable1 == 0 && enable2 == 0 && enable3 == 0 && enable4 == 0)  begin    sab1=0;    richting=0;    welkelijn=0;    uit0 <= 1'b0;    uit1 <= 1'b0;    uit2 <= 1'b0;    uit3 <= 1'b0;    uit4 <= 1'b0;    uit5 <= 1'b0;    uit6 <= 1'b0;    uit7 <= 1'b0;    uit8 <= 1'b0;    uit9 <= 1'b0;    uit10 <= 1'b0;    uit11 <= 1'b0;    uit12 <= 1'b0;    uit13 <= 1'b0;    uit14 <= 1'b0;    uit15 <= 1'b0;    uit16 <= 1'b0;    uit17 <= 1'b0;    uit18 <= 1'b0;    uit19 <= 1'b0;    uit20 <= 1'b0;    uit21 <= 1'b0;    uit22 <= 1'b0;    uit23 <= 1'b0;  end            Aansturen LED display via art‐net  122  9. Literatuurlijst  Altera (2006). Pinconfiguration Cyclone I [Datasheet]. s.l.: s.n.    Altera (s.d.). Cyclone FPGA family datasheet [Datasheet]. s.l.: s.n.    Altera (s.d.). Serial configuration device EPCS1 [Datasheet]. s.l.: s.n.    Microchip Technology Incorporated, (2005). MPLAB ® C18 C Compiler User’s Guide  [Brochure]. USA: s.n.    Microchip Technology Incorporated, (2005). MPLAB ® C18 C Compiler Getting  Started [Brochure]. USA: s.n.    Microchip Technology Incorporated, (2005). MPLAB ® C18 C Compiler Libraries  [Brochure]. USA: s.n.    Microchip Technology Incorporated, (2007). MPLAB ® ICD 2 In‐Circuit Debugger  User’s Guide [Brochure]. USA: s.n.    Reynaert , H. (2006). Art‐net controlled video. Onuitgegeven eindwerk gegradueerde  in elektriciteit, optie elektronica. Oostende: KHBO.    Showtec, (s.d.). Showtec showmaster 24[Datasheet]. s.l.: s.n.    Texas Instruments (2002). TI Panelbus ™ digital transmitter [Brochure]. s.l.: s.n.    Website Altera, (1995). Geraadpleegd op 30 april 2008, op http://www.altera.com/    Website Barco, (s.d.). Geraadpleegd op 30 april 2008, op http://www.barco.com/     Website Farnell, (s.d.). Geraadpleegd op 30 april 2008, op http://be.farnell.com/     Website Google, (s.d.) Geraadpleegd op 13 mei 2008, op  http://www.google.be/firefox?client=firefox‐a&rls=org.mozilla:nl:official     Website Wikipedia, (s.d.). Geraadpleegd op 13 mei 2008, op  http://nl.wikipedia.org/wiki/Hoofdpagina           Kris Sabbe  3AI1E0  Oostende 2007‐2008