Afstudeer verslag

54
HiSPARC Pulsgenerator Naam: Jaap Otto Student nummer: 204784 E-mail: [email protected] Instituut: Hogeschool van Amsterdam Opleiding: E-technologie Major/minor Embedded Systems / Mechatronica Bedrijf: NIKHEF Amsterdam Begeleider: Hans Verkooijen Begeleider opleiding:A.E. van Griethuijsen Datum: 11 Juni 2007

Transcript of Afstudeer verslag

Page 1: Afstudeer verslag

HiSPARC

Pulsgenerator

Naam: Jaap Otto

Student nummer: 204784

E-mail: [email protected]

Instituut: Hogeschool van Amsterdam

Opleiding: E-technologie

Major/minor Embedded Systems / Mechatronica

Bedrijf: NIKHEF Amsterdam

Begeleider: Hans Verkooijen

Begeleider opleiding:A.E. van Griethuijsen

Datum: 11 Juni 2007

Page 2: Afstudeer verslag

2

Samenvatting (summary english below)

In dit verslag zal ik mijn afstudeeropdracht beschrijven. Deze heb ik gemaakt tijdens mijn

afstudeerstage gedurende vijf maanden bij het NIKHEF in Amsterdam.

Voor het afregelen van eerder ontworpen elektronica,het HiSPARC project, is er een speciale

pulsgenerator nodig. Deze moet een puls kunnen maken met een stijgtijd van 10ns en een

amplitude van maximaal -12V instelbaar in stapjes van 0,01V. Tevens moet de pulsduur en de

pulshoogte in te stellen zijn met een PC over USB.

Het eerste gedeelte van dit verslag behandelt het doel van de pulsgenerator. Waar gaat deze

gebruikt worden?, waarom is deze nodig?

Het tweede en grootste gedeelte richt zich op het ontwerpen van de hardware. Dit bleek

lastiger dan gedacht en koste daardoor meer tijd. Met name de grote spanningzwaai en de

snelle stijgtijd is lastig te realiseren. Veel van de problemen worden veroorzaakt doordat de

gebruikte componenten niet ideaal zijn. Hierdoor kan het plaatsen van een component het ene

probleem oplossen en een ander probleem veroorzaken. In de hardware wordt de

ontwikkeling stap voor stap besproken zodat alle gemaakte keuzes duidelijk worden.

Het laatste stuk behandelt de software. Er zijn twee stukken software die besproken worden.

LabView is de interface die gemaakt is tussen de gebruiker en de PC. Hiermee worden de

waardes ingesteld en verstuurd naar de FPGA.

De FPGA bevat VHDL code. Deze leest de binnenkomende data van de PC en verstuurt deze

naar de pulsgenerator.

Summary

In this report I will describe the assignment I performed during a five month internship at

NIKHEF in Amsterdam.

To adjust previous build electronics called HiSPARC a special pulse generator is needed. It

must make a pulse with a rise time of 10ns and a maximum amplitude of -12V which is

adjustable in 0,01V steps. The pulse width and the amplitude must be adjustable with the use

of a PC and USB.

In the first part of this report the purpose of the pulse generator will be explained. Questions

will be answered like: Where will it be used? and why is it needed?.

The second and largest part of the report will describe the design of the hardware. This was

more difficult then expected and therefore took more time. Especially the large voltage swing

and fast rise time was difficult to realise. Many of the encountered problems were caused by

not idealistic electronic components. Knowing this, placing a component can solve one

problem and introduce a new one. In chapter 7, the design of the hardware will be explained

piece by piece so every decision will become clear.

The last part explains the software. There are two parts of software that will be described.

LabView is the interface between the user and the PC. With this the pulse generator can be

operated and the data will be sent to a FPGA.

The FPGA is programmed with VHDL-code. It will read all the incoming data and send it to

the pulse generator.

Page 3: Afstudeer verslag

3

Inhoudsopgave

Samenvatting 2

Voorwoord 4

Verklarende woordenlijst 5

1. Inleiding 6

2. Opdracht omschrijving 7

3. Kosmische straling 9

4. HiSPARC 10

4.1 HiSPARC II elektronica 10

5. Ontwerpen 11

6. Simulatie 12

7. Hardware 14

7.1 Puls 14

7.2 Op-amp 15

7.3 FET driver 18

7.4 Amplitude 22

7.5 Offset 23

7.6 Overige hardware 24

7.6.1 FPGA 24

7.6.2 USB interface 24

7.6.3 Voeding 24

7.6.4 Buffer 24

8. Software 25

8.1 LabView 25

8.2 VHDL code 26

8.2.1 CLOCK_DIV 26

8.2.2 USB_RDCLK 26

8.2.3 USB_ENCODER 27

8.2.4 DAC_ENCODER 27

8.2.5 PULSE_GEN 27

9 Resultaat 28

10 Conclusie 31

Nabeschouwing 32

Literatuurlijst 33

Bijlage A Totaal schema. 36

Bijlage B Aansluitschema FT245R USB to FIFO I.C. 37

Bijlage C LabView user interface 39

Bijlage D LabView code. 40

Bijlage E VHDL source code. 41

Page 4: Afstudeer verslag

4

Voorwoord

Ik heb mijn afstudeerstage gelopen bij het Nationaal Instituut voor Kernfysica en Hoge-

EnergieFysica (NIKHEF).

Het NIKHEF is een collaboratie tussen het Fundamenteel Onderzoek der Materie (FOM), de

Vrije Universiteit Amsterdam, de Universiteit van Amsterdam, de Radboud Universiteit

Nijmegen en de Universiteit Utrecht. Gezamenlijk voeren zij verschillende experimenten uit

in subatomaire en hoge energie fysica.

Het NIKHEF is tevens actief betrokken bij verschillende internationale experimenten over de

gehele wereld. Het NIKHEF ontwerpt en bouwt zowel elektronica, software als mechanische

onderdelen voor de complexe detectoren die nodig zijn bij de studie naar de kleinste deeltjes

in het universum.

Ten slotte wil ik het NIKHEF en in het bijzonder Hans Verkooijen bedanken om mijn

afstuderen hier mogelijk te maken en de begeleiding tijdens het afstuderen.

Bij het lezen van dit verslag is enige kennis van elektronica noodzakelijk.

Page 5: Afstudeer verslag

5

Verklarende woordenlijst

Afkortingen

ADC Analog Digital Converter

DAC Digital Analog Converter

DC Direct Current

EEPROM Electrical Erasable Programmable Read Only Memory

FET Field Effect Transistor

FIFO First In First Out

FOM Fundementeel Onderzoek der Materie

GBW Gain Bandwidth product

HiSPARC High School project on Astrophysics Research with Cosmics

IC Integrated Circuit

NIKHEF Nationaal Instituut voor Kernfysica en Hoge-EnergieFysica

PMT Photo Multiplier Tube

SMD Surface Mounted Device

USB Universal Serial Bus

VHDL VHSIC Hardware Description Language

VHSIC Very High Speed Integrated Circuit

Woorden

Airshower Regen van deeltjes

Laagenergetisch Deeltje dat zeer weinig energie bevat.

Lineariteit De mate waarin iets lineair verloopt (volgens een rechte lijn)

Superponeren Er bij optellen.

Page 6: Afstudeer verslag

6

1. Inleiding

Dit verslag beschrijft mijn afstudeerstage bij het Nationaal Instituut voor Kernfysica en Hoge-

EnergieFysica (NIKHEF). Hier heb ik gedurende vijf maanden gewerkt aan het ontwerpen

van een pulsgenerator. Deze zal worden gebruikt voor het testen en afregelen van een eerder

ontwikkeld experiment genaamd: “High School project on Astrophysics Research with

Cosmics” (HiSPARC) zie verdere informatie hoofdstuk 4 bladzijde 10.

Een standaard pulsgenerator kan niet voldoen aan de gestelde eisen (zie hoofdstuk 2 bladzijde

7). De pulsen moeten snel zijn (10ns) en een amplitude van -12V hebben.

Het ontwikkelen van de pulsgenerator bestaat uit een aantal stappen welke in chronologische

volgorde beschreven zullen worden:

Ontwerpen

Simuleren

Hardware

Labview

VHDL schrijven

print ontwerpen

Page 7: Afstudeer verslag

7

2. Opdracht Omschrijving

De elektronica van een nieuw project genaamd HiSPARC II moet getest worden op lineariteit.

Deze elektronica moet de binnenkomende signalen analyseren. Deze signalen komen uit een

Photo Multiplier Tube (PMT). Doormiddel van een 12 bits analoog naar digitaal converter

(ADC) kunnen de gegevens worden opgeslagen, dit komt overeen met 4095 stapjes. De ADC

heeft een bereik van 0V tot -2V. Er zijn dus stapjes mogelijk van ~0,5mV. Bij grote

uitzondering kan er ook een evenement optreden met een amplitude groter dan -2V. Deze kan

oplopen tot meer dan -10V. Deze waardes worden niet precies opgeslagen, wel worden ze

geregistreerd met een tijdstempel. Dit wordt gedaan doormiddel van twee comparatoren die

met een programmeerbare drempelspanning (threshold) op -5V en op -10V zijn afgeregeld.

Als de amplitude van de PMT de -5V of de -10V passeert, klapt deze om en wordt dit moment

geregistreerd met een nauwkeurig tijdstempel. Met behulp van de pulsgenerator kan deze

drempelspanning opgezocht worden en vervolgens bekeken worden in hoe verre deze

afhankelijk is van de pulsduur.

Voor de te maken opdracht moeten de signalen die uit een PMT komen nagebootst worden.

Deze signalen hebben geen vaste waardes, wel een bereik waar de meeste invallen.

Met de uiteindelijke pulsgenerator moet dit gehele bereik instelbaar zijn zodat de HiSPARC II

Elektronica zo goed mogelijk is in te stellen en te testen.

Het PTM signaal

Figuur 1 Plot van een PMT signaal.

In figuur 1 is een plot te zien van de verschillende waardes van het PMT signaal. Door de

oscilloscoop in persistence mode te zetten is het mogelijk ieder gemeten signaal weer te

geven. De kleur in de plot veranderd geleidelijk van paars naar rood naarmate er meer

signalen op het zelfde punt gemeten worden.

Page 8: Afstudeer verslag

8

Uit de plot is te halen dat de pulsduur varieert tussen 20ns tot 70ns. Deze kan echter op lopen

tot enkele μs.

De eerste flank ligt rond de 10ns.

De amplitude varieert tussen 0 en -2,5 Volt. Dit is niet goed uit de grafiek te halen omdat de

trigger is afgesteld 600mV. Tevens treedt er soms een bijzondere gebeurtenis op waarbij de

amplitude kan oplopen tot -10 Volt, dit is ook niet uit de plot af te lezen.

Hiermee zijn er een aantal eisen die gesteld kunnen worden aan de te maken puls.

- De eerste flank moet ± 10ns zijn.

- De pulsduur moet instelbaar zijn tussen 20ns en 5μs.

- De amplitude moet instelbaar zijn tussen 0V en -12V in stapjes van ongeveer 10mV

Hier komen een aantal andere voorwaarden bij.

De pulsgenerator moet zijn uitgangsspanning kunnen leveren aan de 50 ohm ingang van de

HiSPARC II Elektronica. Bij een uitgangspanning van 10V moet er 200mA (gepulseerd)

geleverd kunnen worden. Dit moet dus geleverd kunnen worden door de generator.

Een van de te testen functies is in hoe verre de ADC in de HiSPARC II Elektronica lineair is,

hiervoor moet de amplitude nauwkeurig in gelijke stapjes in te stellen zijn.

Het geheel moet met behulp van een PC te bedienen zijn over USB. De generator haalt zijn

voeding uit de USB vandaan waardoor hij niet meer als 500mA mag opnemen.

Page 9: Afstudeer verslag

9

3. Kosmische straling

Van de constante regen van kosmische deeltjes bezitten er een aantal zeer veel energie. Van

een groot deel van deze straling weten we waar het vandaan komt. Zo zenden sterren en de

zon continu laagenergetische deeltjes uit. Zware sterren die aan het eind van hun leven uiteen

spatten, een zogenaamde supernova, zendt een golf van hoogenergetische deeltjes uit. Maar

een aantal deeltjes die de aarde bereiken blijken nog veel meer energie te bezitten. De

oorsprong van deze deeltjes is nog steeds onbekend en moet van buiten de Melkweg komen.

Doordat zo‟n deeltje zeer veel energie bezit zal het bij het passeren van de dampkring botsen

op andere secundaire deeltjes (zuurstofatomen en stikstofatomen) welke op hun beurt weer op

andere deeltjes botsten. Gevolg hiervan is een zogenaamde airshower (regen van deeltjes).

Blauw: elektronen/positronen

Cyaan: fotonen

Rood: neutronen

Oranje: protonen

grijs: mesonen

groen: muonen

Figuur 2 Een gesimuleerde airshower.

De meeste van deze secundaire deeltjes bereiken de aarde niet. Ze vervallen, worden

verstrooid of ze worden opgenomen in de dampkring. Alleen de deeltjes met zeer veel

energie, of een lange „levensduur‟ zullen de grond bereiken. Dit zijn meestal muonen.

Hoe meer energie het primaire deeltje had hoe groter het oppervlak op de aarde dat

gebombardeerd wordt met deeltjes.

Het belangrijkste doel van het HiSPARC is het zoeken naar het antwoord op de vraag: “Waar

komen deze deeltjes vandaan?”

Om deze vraag te beantwoorden moeten deze airshowers gedetecteerd worden over een groot

oppervlak. Het is echter niet noodzakelijk het gehele oppervlak te voorzien van meetpunten.

Om een gebied van 100 KM2

te bedekken zijn 10 tot 15 meetpunten, met een onderlinge

afstand van 1 KM genoeg. Door alle data om te zetten in modellen zoals te zien is in figuur 2

kan de richting van het primaire deeltje achterhaald worden.

Page 10: Afstudeer verslag

10

4. HiSPARC

High School project on Astrophysics Research with Cosmics (HiSPARC) is een project

waarbij middelbare scholen samen met wetenschappelijke instellingen een netwerk vormen

om kosmische straling met extreem hoge energie te kunnen meten.

Door dit onderzoek probeert men meer te weten te komen over de kosmische deeltjes regen

waaraan onze aarde wordt blootgesteld. Tevens is het mogelijk voor scholieren actief hieraan

mee te werken en hierover profiel werkstukken maken voor het eindexamen.

Op de daken van de hogescholen die mee doen wordt een meetopstelling geplaatst welke

bestaat uit drie scintillatoren en fotomultipliers tubes (PMT). De scintillator zal de kosmische

deeltjeslading omzetten in een lichtsignaal welke door de PMT wordt omgezet in een

elektrisch signaal. De verschillende elektrische signalen worden verwerkt door HiSPARC II

Elektronica welke het zal doorsturen naar een PC. De verschillende gemeten waardes van de

verschillende scholen worden verzameld en verder uitgewerkt.

Figuur 3: Een PMT (Photo Multiplier Tube) met scintillator.

4.1 HiSPARC II Elektronika

Hisparc II Elektronica is eigenlijk twee kanaals 400MHz digitale oscilloscoop.

Deze unit zal de elektrische signalen digitaliseren doormiddel van een ADC voorzien van een

zeer nauwkeurig tijdstempel. Deze gegevens worden door gezonden naar een PC.

Omdat de aarde constant gebombardeerd wordt met deeltjes moet er een onderscheid gemaakt

worden tussen gewone deeltjes en deeltjes afkomstig uit een airshower. Om dat onderscheid

te kunnen maken zijn er drie detectoren bij elkaar geplaatst met een bekende afstand tot

elkaar. Mocht er een airshower optreden dan worden alle detectoren nagenoeg tegelijk

geraakt. Door te kijken naar de tijdverschillen van de detectoren onderling kan er een richting

bepaald worden. De deeltjes bewegen zich voort met de lichtsnelheid, de tijdverschillen zitten

dus in de nanoseconden. HiSPARC II Elektronica voorziet deze events van een zeer

nauwkeurig tijdstempel.

De grote van de airshower is ook afhankelijk van de energie van het deeltje. Hoe groter de

energie hoe groter de amplitude die uit de photomultiplier komt.

Tevens zegt de grootte van de amplitude iets over het soort deeltje. Om de lading van de

deeltjes precies te bepalen wordt de amplitude van de binnen komende pulsen op 0,5mV

nauwkeurig gemeten. Hiervoor wordt een 12 bits ADC gebruikt met een meetbereik van 0V

tot 2V.

Hierin vallen de meeste deeltjes. Grotere pulsen worden geregistreerd met behulp van

comparatoren.

Muon

Scintillator

Foto multiplier

Page 11: Afstudeer verslag

11

5. Ontwerpen

Als eerste ontwerp is er uitgegaan van een simpele schakeling. De pulsduur wordt ingesteld

met een FPGA. De FPGA heeft drie verschillende uitgangen waarmee 0 – 2V, 5V en 10V

geselecteerd kunnen worden. Deze worden aangesloten op de inverterende ingang van een op-

amp. Door meerdere uitgangen tegelijk aan te sturen kunnen de verschillende spanning en

gemaakt worden. De uitgang van de op-amp gaat naar een multiplexer waarmee de puls

gemaakt kan worden. De op-amp heeft maar een beperkte uitgang stroom, vandaar dat

hiervoor een transistor gebruikt wordt voor het leveren van de 200mA.

+

_

+

_

+

_

1

FPGA

FPGA

DACFPGA

Mult iplexer

Op-amp

Op-amp

Op-amp

Uitgang

U1

U2

FPGA

Figuur 4 Eerste globale ontwerp.

Page 12: Afstudeer verslag

12

6. Simulatie

Voor het simuleren van de schakeling is het programma Multisim gebruikt. Hiermee is het

mogelijk een schakeling op te bouwen en de werking ervan te testen. De componenten

worden omschreven in Spicemodellen. Hierin staan alle eigenschappen, zoals onder andere de

slewrate, offset en bias stroom van de componenten zodat er een realistische simulatie

ontstaat. Ook kunnen er realistische modellen van oscilloscopen worden gebruikt

Bij het simuleren kwamen er een aantal zaken aan het licht. Zo bleken niet alle componenten

in de componenten bibliotheek te zijn opgenomen. Het zelf ontwerpen van spicemodellen

bleek niet naar behoren te werken. Omdat we niet precies wisten of de fout in ons zelf

ontworpen model zat of in het schema is er gekozen voor een soortgelijk vervangend

component.

De fout bleef, alleen door het veranderen van de instellingen was de fout te onderdrukken. Het

probleem was dat door het veranderen van de instellingen er met een aantal zaken geen

rekening gehouden wordt. Hierdoor werd het resultaat van de simulatie minder betrouwbaar.

Door een timestep error bleek het gezamenlijk testen van de verschillende delen van de

hardware ook niet te werken, waardoor alles in delen getest moest worden.

Vermoedelijk zat het probleem bij het berekenen van de potentialen van de verschillende

knooppunten. Deze waardes moeten steeds opnieuw berekend worden totdat er bijna geen

verandering meer optreed. De schakeling is dan stabiel. Omdat dit met grote stappen niet

mogelijk was hebben we zeer kleine stapjes genomen. Hierdoor duurde het erg lang totdat er

een eind situatie gevonden was, als deze al gevonden werd.

Voor het rekenen aan condensatoren wordt er een lekweerstand overgeplaatst, deze is zeer

hoog-ohmig. Dit vergt veel rekentijd en kan leiden tot een timestep error. Dit is op te lossen

door de lekweerstanden te verkleinen, dit leidt echter weer tot verkeerde resultaten.

Zo ook bij ons, de resultaten die we in de praktijk vonden bleken niet overeen te komen met

de simulatie. Meer hierover kunt u lezen verder in dit verslag.

Page 13: Afstudeer verslag

13

Figuur 5 Simulatie van een deel van de schakeling. Op de oscilloscoop is de ingang (geel: 5ns/div 5V/div)

en de uitgang (blauw: 5ns/div 5V/div) te zien. In het schema is een multiplexer, een op-amp en een

transistor opgenomen. Met de multiplexer is de achter flank in te stellen. De op-amp zorgt voor drie maal

versterking. De transistor levert de benodigde stroom.

Page 14: Afstudeer verslag

14

7. HARDWARE

7.1 Puls

Het lastige van de opdracht zit in het feit dat er een enorme spanningszwaai gegenereerd moet

worden in een vrij korte tijd. Deze ook nog eens in te stellen is in stapjes van 3mV. Er zijn

een aantal mogelijkheden om dit te realiseren. Het is een kwestie van uitproberen, aanpassen

en afstellen voor het maken van de juiste schakeling. De schakeling is op te delen in een

aantal delen. Elk deel kan afzonderlijk ontworpen worden, het is echter verstandig met het

moeilijkste gedeelte te beginnen. Het andere kan hier dan op aangepast worden zodat de

schakeling zo ideaal mogelijk wordt. We beginnen daarom met het maken van de grote

spanningszwaai en letten daarbij op de snelheid van de flanken. De uiteindelijk gebruikte

schakeling is te vinden als bijlage A.

Voor het maken van de grote spanningszwaai kan een op-amp gebruikt worden. Door een

juist gekozen gain kan met een relatieve lage ingangsspanning op de uitgang een grote zwaai

gemaakt worden. Aan de uitgang wordt een transistor geplaatst voor het leveren van de

gewenste stroom.

+

_3K3

10K

E

B

C

50 ohm load

V+

V-

0V-4V in

-15V

R2

R1

Figuur 6 Eerste ontwerp.

In figuur 5 Is de gain:

VVK

KVin

R

RVout 124

33

10

1

2

Formule 1

Hiermee kan er met een regelbare spanning van 0 tot 4V en een gain van 3 een zwaai van 0V

tot -12V gemaakt worden.

Transistor

De PNP transistor op de uitgang is een emittervolger. Dat wil zeggen: De spanning op de

emitter zal hetzelfde zijn als op de basis min een junctie van ~0,7V. De op-amp zal de

inverterende ingang proberen gelijk te houden aan de niet-inverterende ingang, in dit geval

0V. Bij een spanning op de inverterende ingang zal de op-amp zijn uitgang negatief maken

om de stroom door R1 te compenseren. Om dit te realiseren zal de uitgang een stroom moeten

gaan leveren waardoor de transistor in geleiding komt. Er zal nu ook een stroom door de

collector, emitter en load gaan lopen.

Page 15: Afstudeer verslag

15

7.2 Op-amp

Het mag duidelijk zijn dat positieve voedingsspanning V+ hoger dan 0V en de negatieve

voedingsspanning V- minstens -12V moet zijn. Sommige op-amps zijn echter niet rail to rail.

Dit houdt in dat de uitgangsspanning niet tot aan de voedingsspanning kan komen maar

enkele volts lager, waardoor bij een V- van -12V de uitgang nooit -12V kan worden. Er dient

hier rekening mee gehouden te worden.

De op-amp moet zeer snel zijn omdat deze van 0V naar -12V moet in 10 nsec. Dit houdt in

dat hij een slew-rate van 1200V/μsec moet hebben. De bandbreedte van een puls afkomstig

uit een photomultiplier is 100MHz. De bandbreedte van de op-amp moet dus ook minstens

100MHz zijn. De op-amp wordt later ook gebruikt in het definitieve ontwerp en om alles zo

klein mogelijk te maken willen we een SMD behuizing (Surface Mounted Device). Er zijn

niet veel op-amps die aan al deze eisen kunnen voldoen. Vooral de hoge slewrate en hoge

voedingsspanning combinatie is lastig te vinden. Echter de LM7171 van National

Semiconductors heeft een slewrate van 4100V/µsec (Figuur 7 en 8) een ±15V

voedingsspanning en GBW (Gain BandWidth product) van 200Mhz (Figuur 9).

Figuur 7 Slewrate Figuur 8 Slewrate Figuur 9 GBW

Het grote nadeel van deze schakeling is dat er een stroom geleverd moet worden aan de

transistor om deze in geleiding te brengen en voordat de transistor uit gaat moet de

opgebouwde lading in de transistor eerst wegvloeien door de 50ohm load. Dit alles kost tijd,

waardoor de flanken niet snel genoeg zijn. De schakeling moet dus anders.

Page 16: Afstudeer verslag

16

In plaats van een spanningsvolger (emittervolger) kan er ook een schakelaar gebruikt worden.

Deze schakelaar schakelt een instelbare stroom voor een bepaalde tijd op de load-weerstand.

Als schakelaar wordt er een N-channel FET toegepast. Een P-channel FET is wel mogelijk

maar niet verstandig. Bij gebruik van een P-channel FET zit de source aan de load-weerstand.

Omdat er een grote capaciteit tussen de gate en de source zit, ontstaat er een grote doorspraak

van gate naar source (de uitgang). De capaciteit tussen de gate en drain is velen malen kleiner.

Het schema verandert dan wel enigszins, omdat de FET hier geschakeld wordt, waardoor hij

niet op genomen is in de terugkoppelkring van de op-amp.

GS

D

+

_3K3

10K

V+

V-

R2

R1

Puls in

50 ohm load

0V-4V in

0V.....-12V

Uitgang

Figuur 10 Transistor is vervangen voor FET.

In figuur 10 is er een N-channel FET gebruikt voor het schakelen van de load. Deze wordt

direct met een puls aan gestuurd. Met de op-amp kan de gewenste amplitude worden

ingesteld. Om de FET aan te sturen hoeft er niet eerst stroom in gestopt te worden, maar er

moet wel lading opgebouwd worden. De schakeling is erg snel. Er treed nu echter wel een

ander probleem op.

Met de formule: TIUCQ is te berekenen hoeveel stroom er geleverd moet worden

om de FET binnen een gestelde tijd open te krijgen. De lading is te halen uit de datasheet1:

Figuur 11 Gate lading.

1 De gebruikte FET is SPP04N80C3 van Infineon

Page 17: Afstudeer verslag

17

De spanning is in ons geval 15,3V (12V + 3,3V puls). Uit figuur 11 Is te halen dat de Q dan

ongeveer 30nC is. Een van de eisen van de pulsgenerator is dat de puls in 10ns omlaag moet.

De tijd is dus 10nsec. Nu is uit te rekenen:

An

nCI

T

Q3

sec10

30

Formule 2.

Dit houdt in dat er 3A geleverd moet worden om de FET binnen 10ns open te krijgen. Dit is

erg lastig en is vaak niet te leveren. Ten gevolge hiervan ontstaat er een lelijke „deuk‟ op de

uitgang en dit kost wederom tijd.

Een tweede effect wat optreedt, is zogenaamde doorspraak, wederom veroorzaakt door de

kleine capaciteit tussen gate en drain, de reverse transfer capacitance. Zie ook onderstaande

schema‟s.

GS

DC

Ingang Uitgang

Figuur 12 Schema FET met gate-drain capaciteit. Figuur 13 Vervangschema FET met

doorspraak.

Op het moment dat de puls begint en als de puls stopt ontstaat er een piekspanning die door de

FET heen gaat, door de gate-drain capaciteit. Deze pieken worden gesuperponeerd op de al

aanwezige spanning op de uitgang en verstoren het uitgangssignaal.

Page 18: Afstudeer verslag

18

7.3 FET driver

Omdat er veel stroom nodig is om de FET te besturen wordt er een FET driver gebruikt. De

gebruikte driver2 kan 1.5A leveren en is tevens erg snel.

GS

D

+

_3K3

10K

V+

V-

R2

R1

Puls in

50 ohm load

0V-4V in

0V.. ...-12V

3V3

-15V

FET

driver

Uitgang

Figuur 14 FET driver.

Om de FET aan te krijgen moet de gate spanning ongeveer 2V hoger zijn ten opzichte van de

source spanning. De source spanning is in dit geval regelbaar van 0V tot -12V. Dit houdt in

dat als de source spanning heel klein is en dit is mogelijk omdat er ook pulsen zijn van 3mV,

de gate een positieve spanning moet hebben. We hebben 5V uit de USB en 3V3 van een

spannings regulator tot onze beschikking. Omdat we de spanningszwaai niet te groot willen

maken gebruiken we de 3V3.

Om de FET uit te krijgen moet de gate spanning gelijk, liefst lager zijn ten opzichte van de

source. De source kan -12V zijn dit houdt in dat de uitgang van de buffer minstens -12V moet

worden. Een spanning -15V is hiervoor ideaal.

Dit alles heeft tot gevolg dat het mogelijk is dat er 15V3 (-12V + 3V3) over de gate – source

staat. De eerder gebruikte FET met zeer lage capaciteit is hier niet tegen bestand. Alleen de

zwaardere types kunnen deze spanning verdragen, maar hebben als nadeel dat de reverse

transfer capacitance aanzienlijk groter is.

Voor spanningen boven de 1V lijkt dit goed te werken, maar de grote spanningzwaai en hoge

gate-drain capaciteit hebben een groot nadeel. Op de inschakel en uitschakel momenten

ontstaat er een piekspanning van ± 100mV boven op het originele signaal. Dit zijn de eerder

genoemde doorspraak pieken die nu door het gebruik van de FET driver zijn toegenomen,

omdat deze een snelle stuurflank geeft.

Deze pieken zijn gedeeltelijk te onderdrukken door het plaatsen van een low-pass fiter tussen

de uitgang van de driver en de gate van de FET, maar heeft als gevolg dat de pulsduur

toeneemt en er niet mooi meer uitzien. Het schema moet dus wederom anders.

2 TC4426 van Microship

Page 19: Afstudeer verslag

19

+

_

10K

50 ohm load

V+

V-

0V - 4V in

-15V

100 ohm

3K3

Buffer

-15V

+ 15V + 15VR1

R2

R3

Figuur 15 Uitgang buffer.

Er bleek ook een buffer3 te bestaan die continu 300mA kan leveren met een hoge slewrate van

1800 V/μs en tevens kan hij een grote capacitieve belasting aansturen.

Omdat de slewrate afhangt van de voedingsspanning, zie figuur 7 en 8 op bladzijde 15, is de

voeding van de op-amp en de buffer verhoogt naar -15V en +15V.

Al bij de eerste keer inschakelen van de voeding blijkt dat de schakeling oscilleerde.

Dit komt doordat de terugkoppeling weerstand (R2) 10K ohm is in plaats van de aanbevolen

560 ohm uit de datasheet van de op-amp.

Deze zou dus kleiner moeten. Als deze kleiner wordt moet R1 mee veranderd worden om de

juiste versterking te behouden. Hierdoor wordt de ingangsimpedantie van de schakeling te

laag.

Een andere optie is de puls op de niet-inverterende ingang aan te sluiten en de op-amp met

een versterking van een maal aan te sluiten. De terugkoppeling kan nu 560 ohm worden

waardoor de schakeling stabieler wordt. Om tevens uit te sluiten dat de oscillatie ontstaat door

de voedingsspanning is er in de -15V en +15 lijn voor de op-amp en de buffer een ferroxcube

geplaatst. Samen met de al aanwezige 100nF en 10 μF vormt dit een zogenaamde pi-filter. Zie

ook figuur 16 hieronder.

+

_

10K

50 ohm load

V+

V-0V - -12V in

100 ohm Buffer

R2

R3

-15V10uF -15V

10uF

Ferroxcube

Ferroxcube

100nF100nF

+ 15V

100nF

10uF Ferroxcube + 15V

100nF

10uF Ferroxcube

Figuur 16 Uitgang buffer met phi-filter.

Dit alles leek te helpen, echter gaat het wederom mis bij hogere voltages. Vooral rond de 12V

is het instabiel en begint de schakeling te oscilleren. Ook het verlagen van de

voedingsspanning naar -15V en +5V heeft geen invloed op de ontstane oscillatie.

3 LMH6321 High speed buffer van National Semiconductors

Page 20: Afstudeer verslag

20

Echter kwamen we onze eerste meevaller tegen. Doordat we zoveel verschillende

mogelijkheden hebben bekeken en uitgeprobeerd, hebben we ons niet gerealiseerd dat de

op-amp nu eigenlijk overbodig is. Deze was immers eerst gebruikt voor het maken van -12V

Deze kan dus zonder probleem nu verwijderd worden. De puls komt dan direct op de buffer te

staan. Er moet nu wel een regelbare puls gemaakt worden van 0V tot -12V.

Voor het maken van deze puls gebruiken we weer een N-channel FET, in combinatie met

twee condensatoren.

100nF

GS

D

100pF 50 ohm load

100 ohm Buffer

R2

-15V

10uF

Ferroxcube

100nF

+ 15V

100nF

10uF

Ferroxcube

0V -12V

N-channel

FET

Puls in

C1C2

50 ohm load3

K3

R1

Figuur 17 maken van de regelbare puls

Om de puls zo snel mogelijk te maken is het verstandig zo min mogelijk elektronica te

gebruiken en om storingen tegen te gaan moeten de afstanden zo kort mogelijk zijn. Het gaat

hierbij om de afstand van de ingang van de FET tot de ingang van de buffer. Om deze reden

zijn er zo veel mogelijk SMD componenten gebruikt.

In figuur16 is te zien dat er op de drain van de FET en dus ook over de condensator C1, een

regelbare spanning staat van 0V tot 12V. De condensator C2 laat geen gelijkspanning door, de

spanning op de ingang van de buffer hangt dus via 3,3K ohm (R1) aan de ground. Op het

moment dat er een puls op de gate van de FET wordt gezet, wordt C1 kort gesloten naar de

ground en zal de spanning heel snel dalen, de weerstand tussen drain en source is immers erg

klein. Deze spanningsdaling laat C2 wel door echter loopt deze nu van 0V naar -12V. Ook nu

hebben we last van de verschillende capaciteiten van de FET.

De gebruikte FET4 heeft een extreem lage reverse transfer capacitance. Deze is 1.3pF,

vergeleken met 6pF van een gemiddelde FET is dit een hele verbetering tevens passen we

enkele trucs toe.

Om eventuele nadelige effecten van deze capaciteit als nog te verkleinen en daarmee de puls

die de buffer in gaat zo „mooi‟ mogelijk te maken, zetten we op de gate een zogenaamde

biasspanning. Hiermee wordt de spanningzwaai op de gate verkleind, door de onderkant van

de puls aan te passen. De gate van deze FET begint te geleiden op ongeveer 0,7V. Door op de

gate van de FET een kleine biasspanning aan te sluiten net onder deze 0,7V zal deze net niet

geleiden. De capaciteit is echter al voor een deel opgeladen, hierdoor zal de uitgang er beter

uitzien. De biasspanning wordt gemaakt met de weerstanden: R6, R7, R8.

4 FDV301N N-channel FET van Fairchild

Page 21: Afstudeer verslag

21

Een ander probleem was de doorspraak van de puls van de gate naar de drain. Om dit tegen te

gaan hebben we de schakeling uitgebreid met nog een FET5, dit maal een P-channel.

De FET zorgt ervoor dat de puls op de N-channel FET zo klein mogelijk is, de doorspraak is

dan ook klein. Om dit te realiseren moet de grote van de puls op een minimum afgeregeld

worden. De FET veranderd nu de bovenkant van de puls.

In het onderstaande figuur 18, is het eerder uitgelegde gedeelte over de buffer weggelaten.

100nF

GS

D

100pF

0V - 12V

N-channel

FET

Puls in

C1

C2

GS

D

+ 5V

-15V

3

31

0K

3

K3

8

K2

B

E

C

1

5K

100nF

NPN

transistor

P-channel

+ 5V

100K

8

20

4

K7

100nF

R1

R2

R3

R4

R5

R6

R7

R8

Naar buffer

C3C4

Figuur 18 Schema van puls gedeelte.

De condensatoren C1 en C2 scheiden de DC instelspanning van de verschillende circuits.

De puls wordt aangesloten op de gate van de FET. De drain van de P-channel FET is in rust

via R5 aangesloten aan de ground. De source is doormiddel van R1, R2 en de transistor

afgeregeld op ~3V. Een simpele spanningsafdeling is hier niet mogelijk omdat er 100mA

geleverd moet worden tijdens de puls en als er geen puls is niet onnodig veel stroom moet

wegvloeien. Bij 3V zal de FET nog net naar behoren werken en dus de doorspraak tot een

minimum beperkt zijn.

5 IRLML6302 P-channel FET van International Rectifier

Page 22: Afstudeer verslag

22

7.4 Amplitude

Voor het maken van de regelbare 12V spanning is een simpele op-amp schakeling gebruikt in

combinatie met een DAC6 en een twee afregel weerstanden.

+

_

1

5

23

4

LMH6640

0V - 4V

from DAC

33K

100nF

+ 15V

-15V

10uF 100nF

100ohm

6K8

1

0K

100nF

6

8

5

00

K150K

-15V

+ 15V

3

30

100nF

GS

D

100pF

N-channel

Puls in

Naar Buffer

R1 R2

R3

R4

R5

R6

R7

R8

C1

C2

C3 C4

C5C6

Figuur 19 Schema regelbare 0 tot 12V spanning.

In het bovenstaande figuur 19 zijn de eerder uitgelegde gedeeltes weggelaten. De

condensatoren C1, C3 en C4 dienen als ontkoppeling. C2 zorgt voor stabiliteit. De op-amp

moet condensator C3 opladen. Dit zou de regeling verstoren als C2 en R7 er niet in zaten. Het

duurt vrij lang voordat de maximale uitgangsstroom van de op-amp condencator C3 geladen

heeft. Hierdoor kan de op-amp niet goed meer regelen. Door de uitgang van de op-amp met

een weerstand (R7) aan C3 te koppelen, kan er een snelle regeling gemaakt worden via C2.

rondom de op-amp zijn er nu twee tegenkoppelingen: een langzame via R6 en een snelle via

C2. Over weerstand R8 komt de regelbare spanning te staan. Door deze waarde te veranderen

of door C5 te veranderen kan de achterflank enigszins geregeld worden. Het was de bedoeling

de achterflank te regelen. Hiervoor zou een digitale weerstand of condensator gebruikt moeten

worden. Deze zijn helaas niet beschikbaar voor deze snelle signalen (ze zijn te capacitief). Het

regelen van de achterflank is komen te vervalen.

Uit de DAC komt een spanning van 0 tot 4V. Dit wordt drie maal versterkt door de op-amp

tot 12V. Met de weerstanden combinatie R3, R5 en R6 is de versterking af te regelen zodat de

uitgangsspanning 12V is. De uitgang van de DAC heeft een kleine offset. Dit houdt in dat

deze niet helemaal 0V kan worden. Er is dus altijd een kleine puls aanwezig. Het is de

bedoeling de puls in stapjes van 3mV te kunnen regelen en voornamelijk in het gebied 0 tot 2

V, willen we dit zo nauwkeurig mogelijk doen. Dan is een offset van enkele millivolts niet

gewenst.

Met R1, R2 en R4 kan er een offset weggeregeld worden van ±33mV.

6 Texas Instruments, TLV5638 Dual 12-bit digital analog converter.

Page 23: Afstudeer verslag

23

7.5 Offset

Op de uitgang van de schakeling ontstaat een offset spanning als gevolg van biasstromen en

offsetspanning van het gebruikte buffer. Deze offset verschilt per schakeling/buffer en is

temperatuur afhankelijk. Zie ook tabel 1 en figuur.

Tabel 1buffer input offset spanning en input offset stroom

Figuur 20 de buffer offset is afhankelijk van meerdere factoren

Om de offset weg te kunnen regelen hebben we een tweede DAC gebruikt die via labview is

in te stellen. Hierdoor kan de offset altijd aangepast worden aan de omstandigheden. In het

schema is er slechts een kleine aanvulling nodig.

Wederom is er een gedeelte van het schema weggelaten.

-15V

3

K3

4

70

k

5

6K

100nF

100nF

GS

D

100p F

N-channel

0 - 4V

from DAC

Naar

bufferC1

C2

R1 R2 R3

C3

0 - 12V

Puls in

Figuur 21 Schema offset.

Met de weerstanden R1 en R3 wordt de spanningzwaai (0 tot 4V) uit de DAC gereduceerd tot

0 tot 200mV (nog steeds in 4095 stapjes). De offset kan ook negatief zijn, om dit te

compenseren moet de offset dus regelbaar zijn tussen ongeveer -100mV en +100mV. De

weerstand R2 zorgt voor deze verschuiving. Condensator C3 dient als ontkoppel condensator

Page 24: Afstudeer verslag

24

7.6 Overige hardware

7.6.1 FPGA

FPGA staat voor: Field Programmable Gate Array.

De gebruikte FPGA is een Altera Acex. Bij het ontwerpen van het echte definitieve schema

zal er een Altera Cyclone I 7 met bijbehorende EEPROM

8 voor het opslaan van het

programma code worden gebruikt, deze is op dit moment nog niet beschikbaar op een

testbord.

De gebruikte Altera Acex is gemonteerd op een oude print die gebruikt werd bij een test

opstelling. Het grote voordeel hiervan is dat bijna alle uitgangen van de FPGA naar buiten

zijn gevoerd en er dus eenvoudig wat op aan gesloten kan worden. Tevens zijn er een aantal

schema‟s van het bord beschikbaar. De Altera Acex is, enkele jaren geleden voor dit test bord

gekozen omdat deze beschikte over voldoende aansluitingen voor de toenmalige test. Er

hoefde niet veel VHDL (code) in, dus de FPGA hoefde niet veel opslag ruimte te bevatten. De

prijs wordt voornamelijk bepaald door de hoeveelheid opslagruimte, de gebruikte FPGA is

dus goedkoop. Een andere belangrijke reden is de goede ervaringen met Altera.

7.6.2 USB interface

De communicatie tussen PC en de pulsgenerator verloopt over USB. Om met de FPGA te

kunnen communiceren, moeten de USB signalen omgezet worden naar 8 bits data woorden.

Hiervoor is er een chip beschikbaar, de FT245R USB FIFO I.C. . De laatste versie bestaat uit

een enkel IC waar alle benodigde weerstanden, condensatoren en oscillator al zijn in

geplaatst. Het bevat 4 aansluitingen voor de USB, waaronder 5V voor zijn eigen voeding.

Verder heeft het 12 aansluitingen voor de besturing(4) en data(8) van de inwenige FIFO.

Omdat de pulsgenerator vanuit de USB gevoed gaat worden moet de USB 5V voedingslijn

door de computer uit te zetten zijn, in verband met eventuele overbelasting. Hiervoor moet er

een externe FET geplaatst worden welke door de USB-FIFO chip uit geschakeld kan worden.

Zie bijlage B voor het aansluitschema.

7.6.3 Voeding

De gehele schakeling wordt door USB gevoed. Deze levert 5V. Er is echter ook +3V, +15V

en -15V nodig. De 3V kan gemaakt worden met een regulator. De +15V en -15V wordt

gemaakt door twee DC-DC9 converters.

7.6.4 Buffer

De gebruikte FPGA geeft een uitgangsspanning van 2,5V. De FPGA die gebruikt gaat worden

heeft 3,3V als uitgangsspanning. De schakeling is op 3,3V berekend. Dit heeft tot gevolg dat

bij 2,5V de achterliggende elektronica (DAC‟s) niet goed reageert. De verstuurde data komt

niet goed aan. Dit komt doordat er een minimale spanning van 2,4V gebruikt wordt als

logische „1‟. De 2,5V uit de FPGA ligt net op de grens hiervan. Om data verlies te voorkomen

is er een buffer10

geplaatst tussen de uitgangen van de FPGA en de ingangen van de DAC‟s.

7 Altera Cyclone I, EP1C3T100C7N.

8 EEPROM (Electrically Erasable Programmable Read-Only Memory), EPCS1SI8N.

9DC-DC converter IE0515S van xppower.

10 74LV07A van Philips

Page 25: Afstudeer verslag

25

8. Software

8.1 LabView

Om de pulsgenerator via de computer te kunnen besturen is er een eenvoudige interface

gemaakt met LabView. De definitieve software moet uiteindelijk van de HiSPARC website te

downloaden zijn als executable file.

De software bevat een aantal tekstvelden waar de gewenste waardes in gevuld kunnen

worden, de pulsduur kan doormiddel van een slider ingesteld worden.

Doormiddel van een dropdown menu kan de juiste USB poort geselecteerd worden.

LabView zorgt voor een conversie tussen de ingevulde waardes en de te versturen data.

Zo kan de amplitude opgegeven worden in Volt in stapjes van 3mV van 0V tot 12V. Dit

wordt gedeeld zodat het overeen komt met de 4095 stapjes van de DAC.

Het zelfde gebeurd met de offset waardes. Deze varieert van -100mV tot +100mV en wordt

wederom omgezet in 4095 stappen.

De pulsduur bevat 255 stappen van 20nsec dit komt overeen met 0 tot 5,1μs pulsbreedte.

Er vind geen foutcontrole plaats omdat er elke 250μs de data opnieuw wordt verzonden. Een

eventuele fout wordt dus na 250μs vervangen door een nieuwe waarde. Tevens komt er geen

communicatie terug van de pulsgenerator, hierdoor blijft het besturen eenvoudig.

Elke ingevulde waarde wordt omgezet in een 16-bit hexadecimale string welke weer wordt

omgezet in twee datablokken van 1 Byte.

De drie instelbare waardes worden in een array gezet en voorzien van een start-, Identifier- en

een stopbyte.

StartIdenti-

fierData Data Stop

99 11 0F FF 66

Figuur 22 Opbouw van een data blok voor instellen van de amplitude.

Het start (hex99) en stop (hex66) byte zijn steeds het zelfde. De identifier verteld of de

volgende 2 bytes iets zeggen over de offset (hex10), amplitude (hex11) of pulsduur (hex12).

In voorbeeld figuur 22 wordt de amplitude op zijn maximale waarde gezet (hex0F FF).

De data in de array wordt elke 250μs in zijn geheel verstuurd. Dit houdt in dat zowel de

waardes van de twee DAC‟s (offset en amplitude) als de pulsduur steeds opnieuw verstuurd

worden.

De 15 Bytes (3x5 Bytes) die zijn opgeslagen in de array worden, voordat ze verzonden

worden, omgezet in een string. Doormiddel van drie communicatie blokken (visa genaamd)

wordt de data naar een USB poort gestuurt. Het eerst blok, Visa Open, opent de connectie en

bevat de mogelijkheid een USB poort te selecteren. Het volgende blok, Visa Write, schrijft de

eerder gemaakte data string naar de geselecteerde USB poort. Het laatste blok, Visa Close,

sluit de connectie. Het visa Open en Visa Close kunnen allebei een foutbericht geven als er

iets mis gaat in de communicatie.

Zie bijlage C voor de user interface en bijlage D voor de volledige code.

Page 26: Afstudeer verslag

26

8.2 VHDL code

De VHDL code is geschreven is het programma Ease. Hiermee is het mogelijk de software op

te delen in blokken en in deze blokken de benodigde code te schrijven. Groot voordeel

hiervan is dat het geheel overzichtelijk blijft. De gehele code is te vinden in bijlage E

Hieronder volgt een korte beschrijving wat elk blok doet.

Figuur 23 Blokschema VHDL code

8.2.1 CLOCK_DIV

In het blok CLOCK_DIV wordt doormiddel van delen de 50MHz die binnen komt opgedeeld

tot ongeveer 6MHz voor de USB en 0,75Hz voor het maken van de puls. De 6MHz wordt

gemaakt door deze 50MHz 8 maal te delen. Vervolgens wordt deze verder gedeeld tot

0,75Hz.

8.2.2 USB_RDCLK

Zolang er data is in de USB FIFO, dit wordt aan gegeven met RXFn, wisselt USB_RD steeds

van laag naar hoog.

Page 27: Afstudeer verslag

27

8.2.3 USB_ENCODER

Hierin wordt de binnenkomende USB data in stukken bekeken en de bijbehorende acties

ondernomen. De data wordt eerst op nul gezet vervolgens wordt er gewacht op een

kloksignaal en een startbyte (Hex99). Als deze aanwezig is dan wordt er een teller opgehoogd

en gekeken of er een geldige identifier aanwezig is. Is dit het geval dan wordt de volgende

databyte opgeslagen in de bijbehorende tijdelijke variabele (offset, amplitude, pulsbreedte)

het eerste databyte wordt higherbyte genoemd. De volgende databyte heet lowerbyte en wordt

ook opgeslagen. De eerder gestarte teller heeft nu de waarde vier bereikt, bij elke ingelezen

byte wordt deze één opgehoogd. Er wordt nu dus een stopbyte verwacht (Hex66). Is deze er,

dan wordt de ingelezen data doorgestuurd naar het volgende blok en worden de tellers weer

op nul gezet. Ook als er geen geldige waardes worden ingelezen worden de tellers gereset.

8.2.4 DAC_ENCODER

Eerst worden de databytes uit het USB_ENCODER ingelezen. Dan wordt de 0,75Hz klok

gesynchroniseerd met de 6MHz klok. Vervolgens wordt de data op de achterflank van elke

klokpuls omgezet van parallel naar serieel en naar buiten gestuurd op de lijnen: SDA_OUT,

SCL_OUT en CSn_OUT.

8.2.5 PULS_GEN

Als eerste wordt de 0,75Hz klok gesynchroniseerd met de 50MHz klok. Er wordt gewacht tot

een voorflank van de 0,75Hz klok is geweest welke de puls start. Dan wordt de waarde die is

gekozen voor de pulsbreedte vergeleken met een teller. Zijn deze gelijk dat wordt de puls

gestopt. Zijn deze verschillend, dat wordt de teller opgehoogd en wordt er opnieuw

vergeleken.

Page 28: Afstudeer verslag

28

9. Resultaat

Met de gemaakte puls generator is het volgende mogelijk:

Er kan een puls gegenereerd worden waarvan de pulsduur is in te stellen van 0 tot

5100ns in stapjes van 20ns.

De amplitude van de puls kan ingesteld worden van 0V tot -12V in stapjes van 0,01V.

De stijgtijd is ongeveer 10ns (zie ook figuur 24, 25 en 26 hieronder).

De offset op de uitgang van de pulsgenerator kan zeer nauwkeurig worden

weggeregeld.

De uitgang is berekend op een belasting van 50ohm.

De pulsduur, amplitude en offset zijn in te stellen met behulp van een PC met

LabView.

De communicatie verloopt via USB.

De gehele schakeling kan gevoed worden door USB er is dus geen externe voeding

nodig.

Doordat er gekozen is voor snelheid is het regelen van de achterflank komen te

vervallen.

Figuur 24 Uitgangspuls 0V naar -90mV.

Page 29: Afstudeer verslag

29

Figuur 25 Uitgangspuls 0V naar -2V.

Figuur 26 Uitgangspuls 0V naar -12V.

Page 30: Afstudeer verslag

30

De huidige test opstelling werkt, maar zijn nog een aantal stappen die nog ondernomen

moeten worden.

Het schema moet officieel getekend worden zodat deze als print gemaakt kan worden.

Vervolgens moet deze print geassembleerd worden en ingebouwd in een behuizing. De

software moet een executable file worden zodat deze eenvoudig is te installeren.

Page 31: Afstudeer verslag

31

10. Conclusie

Het ontwerpen van de hardware bleek moeilijker dan gedacht. Bij het simuleren van de

schakeling, zo ver dat mogelijk was, leek alles prima te werken. Later bleek dat de simulatie

niet nauwkeurig was waardoor er in het echte ontwerp een aantal hardnekkige problemen zich

voor deden. Zo bleek de combinatie van een hoge spanning en een snelle stijgtijd lastiger dan

gedacht. De capaciteit tussen gate en drain speelde hierin een grote rol. Het opladen hiervan

kost energie wat niet snel genoeg geleverd kan worden. Tevens zorgt deze capaciteit voor een

doorspraak die op de uitgang zichtbaar is.

Om dit op te lossen is de schakeling meerdere malen veranderd. Uiteindelijk is het beoogde

resultaat wel gehaald.

Page 32: Afstudeer verslag

32

Nabeschouwing

Tijdens mijn afstuderen heb ik veel geleerd en heb ik dingen die ik al wist toegepast in de

praktijk. Twee voorbeelden hiervan zijn de FET en de op-amp. Beide zijn uitgebreid

behandelt op de MTS en HTS. Een van de eerste dingen die je leert over deze componenten is

dat ze niet ideaal zijn. Voor het gemak, bij het maken van rekensommen en schema‟s, ga je

hier echter wel vanuit.

In een van de eerste ontwerpen van de pulsgenerator had ik een zeer snelle op-amp nodig en

een FET. En volgens de datasheets leken de gekozen op-amp en FET een prima keuze. Pas na

het solderen bleek hoeveel invloed de kleine gate-drain capaciteit kan hebben.

De waardes die gegeven worden in de datasheets zijn vaak de best gemeten waardes. Pas na

het goed bekijken van de grafieken blijkt welke waardes van toepassing zijn op je eigen

situatie. Zo zijn zij vaak afhankelijk van de frequentie, spanning of manier van aansluiten.

Ook het simulatie programma Multisim is verre van ideaal. In mijn geval heeft het simuleren

bijna niet geholpen. Voor zo ver het mogelijk was het schema te testen leek het goed te

werken, maar wederom was het in de praktijk anders. Waarschijnlijk komt dit doordat het

programma geen stabiel punt kon vinden waardoor er een hoop fouten gegenereerd werden.

Door het veranderen van een aantal parameters werkte het programma wel, maar werden er

een aantal belangrijke punten niet meegenomen in het berekenen van de schakeling.

Verder heb ik gewerkt met LabView. Dit is een mooi programma met zeer veel

mogelijkheden. Het is voornamelijk bedoeld voor het maken van grafische interfaces.

Hiermee is het mogelijk hardware te bedienen en uit te lezen. De binnen komende data kan

dan verder verwerkt worden.

Een ander aspect die maar zeer weinig wordt behandeld op school is het fout zoeken. Waarom

doet de schakeling het niet? Klopt het wat er gebeurd? Wat zie ik op mijn oscilloscoop? Klopt

het wat ik zie op mijn oscilloscoop? En natuurlijk de belangrijkste vraag: Hoe los ik het op?

Sommige van deze vragen zijn op te lossen door te meten. Andere zijn ingewikkelder en vaak

een kwestie van ervaring. Van dit laatste heb ik aardig wat opgedaan. Leren is één ding, het in

de praktijk toepassen is iets anders.

Page 33: Afstudeer verslag

33

Literatuurlijst

Datasheets:

Analog Divices

1. AD8184 - 4 to 1 video multiplexer

2. ADG1204 - 4 to 1 multiplexer

3. ADG1236 - Dual SPST Switch

4. ADG2111 - Quad SPST Switches

5. AD5337 - 10 Bit DAC

Fairchild

1. BC856 - PNP Epitaxial Silicon Transistor

2. FDV301N - Digital FET, N-channel

FTDI

1. FT245R - USB FIFO I.C.

Infineon

1. SPP04N80C3 - Cool MOS power Transistor

International Rectifier

1. IRLML2502 - HEXFET power MOSFET

2. IRLML6302 - power MOSFET

Microchip

1. TC4426 - 1.5A Dual Hight-speed Power MOSFET Drivers

National Semiconductor

1. LM7171 - Very high-speed, hight current, Voltage Feedback amplifier

2. LM8261 - Single high output current and unlimited cap load Op-amp

3. LM8262 - Dual high output current and unlimited cap load Op-amp

4. LMH6321 - 300mA High-speed buffer

5. LMH6640 – Single 16V rail to rail hight output Op-amp

Phillips

1. BB147 - VHF variable capacitance diode

2. BC817 - 500mA NPN general purpose transistor

3. 74LVC07A - Hex buffer with open-drain outputs

Siemens

1. BC639 - NPN Silicon AF Transistor

Texas Instruments

1. SN74LVC07A - Hex buffers/drivers with open drain outputs

2. TLV5638 - Low power Dual 12 Bit DAC with internal reference

XP

1. IE0515S - 5V to 15V DC-DC converter

Page 34: Afstudeer verslag

34

Websites

Componenten leveranciers

http://www.rs-components.nl

http://www.farnell.com/

Informatie over het HiSPARC project

http://www.hisparc.nl/

http://www.hisparc.nl/docs/HermanAwater.pdf

Hoofdsite van NIKHEF

www.nikhef.nl

informatie over het maken van Spicemodellen.

http://zone.ni.com/devzone/cda/tut/p/id/3173

http://vlsilab.fiu.edu/projects/Electronic_Work_Bench_Tutorial/Work_Bench.pdf

Boeken

LabVIEW 7 Express student edition, R.H. Bishop, United States of America, 2006

Software

Multisim

Simulatie programma voor het simuleren van schakelingen.

LabView

Programma voor het maken van een gebruiksvriendelijke interface tussen PC en de

elektronica.

Ease

Een programma waarmee VHDL geschreven kan worden. Door het werken met blokken blijft

de code overzichtelijk.

Altera Quartus II 5.0

Programma dat de geschreven VHDL code omzet naar poorten en flip-flops (synthetiseren).

Als de code is omgezet wordt deze zo efficiënt mogelijk in de gekozen FPGA gepast. Er kan

een voorkeur gegeven worden op snelheid of op grootte. Als alles is omgezet en past wordt

het naar de FPGA gestuurd worden.

Page 35: Afstudeer verslag

35

Overzicht Bijlagen

Bijlage A Totaal schema. Blz. 36

Bijlage B aansluitschema FT245R USB to FIFO I.C. Blz. 37

Bijlage C LabView user interface Blz. 39

Bijlage D LabView code. Blz. 40

Bijlage E VHDL source code. Blz. 41

Page 36: Afstudeer verslag

36

Bijlage A Totaal schema

V-

V+

Vin

Vo

ut

GN

D

CL

2 3

45

6

7

+15

V

-15

V

+15

V

100

ohm

2 2 K

-15

V

3 K 3

4 7 0 k

5 6 K

100

nF

100

nF

100

nF

100

nF

10uF

10uF

Fe

rroxcu

be

Fe

rroxcu

be

56p

FG

SD

+_

1

5 234

LMH

66

40

To D

AC

OU

TB

33K

100

nF

+15

V

-15

V

10uF

100

nF

100

oh

m

6K8

1 0 K

100

nF

100

pF

6 8

+5V

GS D

100

K

8 2 04 K 7

+5V

-15

V

3 3

1 0 K

3 K 3 8 K 2

B

EC

1 5 K

100

nF

100

nF

10uF

100

nF

5 0

Bc

63

9 N

PN

FD

V30

1N

N-c

ha

nne

l

IRLM

L630

2

P-c

ha

nne

l

LMH

63

21

Ph

ilip

s

LOA

D

To D

AC

OU

TA

5 0 0 K1

50

K

-15

V

+15

V

3 3 0

+2.5

V

GN

D

1A

1Y

2A

2Y

3A

3Y

4A

4Y

5A

5Y

6A

6Y

7

14

To F

PG

A (D

in)

To F

PG

A (sc

lk)

To F

PG

A (C

S)

To F

PG

A (p

uls

)

+5V

4 7 0

4 7 0

4 7 0

1 0 0

74LV

C07

A

buff

er

GN

D

VD

D

REF

Din

Sc

lk

CS

OU

TA

OU

TB

8

7 6

21 3 45

+5V

DA

C O

UTB

DA

C O

UTA

To p

uls

inp

ut

TLV

56

38

DA

C

Puls

inp

ut

+3V

Page 37: Afstudeer verslag

37

Bijlage B aansluitschema FT245R USB FIFO I.C.

7.3 USB Bus Powered with Power Switching Configuration Figure 15 - Bus Powered with Power Switching Configuration USB Bus powered circuits need to be able to power down in USB suspend mode in order to meet the <= 500μA total USB suspend current requirement (including external logic). Some external logic can power itself down into a low current state by monitoring the PWREN# signal. For external logic that cannot power itself down in this way, the FT245R provides a simple but effective way of turning off power to external circuitry during USB suspend.

Figure 15 shows how to use a discrete P-Channel Logic Level MOSFET to control the power to external logic circuits. A suitable device would be an International Rectifier (www.irf.com) IRLML6402, or equivalent. It is recommended that a “soft start” circuit consisting of a 1kΩ series resistor and a 0.1μF capacitor are used to limit the current surge when the MOSFET turns on. Without the soft start circuit there is a danger that the transient power surge of the MOSFET turning on will reset the FT245R, or the USB host / hub controller. The values used here allow attached circuitry to power up with a slew rate of ~12.5V per millisecond, in other words the output voltage will transition from GND to 5V in approximately 400 microseconds.

Alternatively, a dedicated power switch I.C. with inbuilt “soft-start” can be used instead of a MOSFET. A suitable power switch I.C. for such an application would be a Micrel (www.micrel.com) MIC2025-2BM or equivalent.

Page 38: Afstudeer verslag

38

Please note the following points in connection with power controlled designs –

i) The logic to be controlled must have its own reset circuitry so that it will automatically reset itself when power is re-applied on coming out of suspend. ii) Set the Pull-down on Suspend option in the internal EEPROM. iii) The PWREN# pin should be used to switch the power to the external circuitry. iv) For USB high-power bus powered device (one that consumes greater than 100mA, and up to 500mA of current from the USB bus), the power consumption of the device should be set in the max power field in the internal EEPROM. A high-power bus powered device must use this descriptor in the internal EEPROM to inform the system of its power requirements. v) For 3.3V power controlled circuits the VCCIO pin must not be powered down with the external circuitry (the

PWREN# signal gets its VCC supply from VCCIO). Either connect the power switch between the output of the

3.3V regulator and the external 3.3V logic or power VCCIO from the 3V3OUT pin of the FT245R.

Page 39: Afstudeer verslag

39

Bijlage C LabView user interface.

Met VISA resource name kan de gebruikte USB poort geselecteerd worden. dac value en dac

value 2 geven de waarde van de DAC weer in stapjes van 0 tot 4095. hi byte en low byte

geven de twee data bytes weer. In string komt de volledige hexadecimale string te staan die

verzonden wordt. Error in en Error out geven eventuele fout meldingen door die ontstaan zijn

bij de communicatie. Met stop wordt het programma gestopt.

De uiteindelijke software zal alleen de instelvakjes bevatten.

Page 40: Afstudeer verslag

40

Bijlage D LabView code.

De LabView software wordt opgebouwd uit een aantal blokken die elk hun eigen functie

hebben. Voorbeelden hiervan zijn: vermenigvuldigen, vergelijken, nummer to hex string, built

array maar ook drukknoppen en displays die uit eindelijk op de gebruikers interface te zien

zijn. Elk blok word verbonden met data lijnen de kleur van de lijn geeft aan welk soort data

het bevat. Zo staat oranje voor double 64 bit, roze voor string, blauw voor 32 bit integer en

groen voor boolean.

Page 41: Afstudeer verslag

41

Bijlage E VHDL Source code ---------------------------------------------------------------------------

-----

-- This VHDL file is generated by EASE/HDL from HDL Works B.V.,

-- the 'Graphical Systems Design Tool'.

--

-- Ease 5.2 Revision 10.

-- Design library : design.

-- Host name : ricinus.

-- User name : hansvk.

-- Time stamp : Wed Apr 25 12:54:25 2007.

--

-- Designed by :

-- Company : HDL Works.

-- Design info :

---------------------------------------------------------------------------

-----

---------------------------------------------------------------------------

-----

-- Entity declaration of 'CLOCK_DIV'.

-- Last modified : Wed Apr 25 10:14:25 2007.

---------------------------------------------------------------------------

-----

library ieee ;

use ieee.numeric_std.all ;

use ieee.std_logic_unsigned.all ;

use ieee.std_logic_1164.all ;

entity CLOCK_DIV is

port(

CLK50MHz : in std_logic;

CLK6MHz : out std_logic;

CLKHz75 : out std_logic;

RSTn : in std_logic);

end CLOCK_DIV ;

---------------------------------------------------------------------------

-----

-- Architecture 'rtl' of 'CLOCK_DIV'

-- Last modified : Wed Apr 25 10:14:25 2007.

---------------------------------------------------------------------------

-----

architecture rtl of CLOCK_DIV is

-- Hier worden de klok signalen van de 50MHz afgeleid.

-- De CLK6.25MHz wordt voor de USB interface gebruikt

signal deler : std_logic_vector (2 downto 0);

signal secondedeler : std_logic_vector (22 downto 0);

begin

CLK6MHz <= deler(2);

CLKHz75 <= secondedeler(22);

process (CLK50MHz,RSTn)

begin

Page 42: Afstudeer verslag

42

if RSTn = '0' then

deler <= (others => '0');

elsif (CLK50MHz'event and CLK50MHz ='1') then

deler <= deler + 1;

end if;

end process;

process (deler(2))

begin

if (deler(2)'event and deler(2) ='1') then

secondedeler(0) <= not secondedeler(0);

end if;

end process;

process (secondedeler(0))

begin

if (secondedeler(0)'event and secondedeler(0) ='1') then

secondedeler(1) <= not secondedeler(1);

end if;

end process;

process (secondedeler(1))

begin

if (secondedeler(1)'event and secondedeler(1) ='1') then

secondedeler(2) <= not secondedeler(2);

end if;

end process;

process (secondedeler(2))

begin

if (secondedeler(2)'event and secondedeler(2) ='1') then

secondedeler(3) <= not secondedeler(3);

end if;

end process;

process (secondedeler(3))

begin

if (secondedeler(3)'event and secondedeler(3) ='1') then

secondedeler(4) <= not secondedeler(4);

end if;

end process;

process (secondedeler(4))

begin

if (secondedeler(4)'event and secondedeler(4) ='1') then

secondedeler(5) <= not secondedeler(5);

end if;

end process;

process (secondedeler(5))

begin

if (secondedeler(5)'event and secondedeler(5) ='1') then

secondedeler(6) <= not secondedeler(6);

end if;

end process;

process (secondedeler(6))

begin

if (secondedeler(6)'event and secondedeler(6) ='1') then

secondedeler(7) <= not secondedeler(7);

end if;

Page 43: Afstudeer verslag

43

end process;

process (secondedeler(7))

begin

if (secondedeler(7)'event and secondedeler(7) ='1') then

secondedeler(8) <= not secondedeler(8);

end if;

end process;

process (secondedeler(8))

begin

if (secondedeler(8)'event and secondedeler(8) ='1') then

secondedeler(9) <= not secondedeler(9);

end if;

end process;

process (secondedeler(9))

begin

if (secondedeler(9)'event and secondedeler(9) ='1') then

secondedeler(10) <= not secondedeler(10);

end if;

end process;

process (secondedeler(10))

begin

if (secondedeler(10)'event and secondedeler(10) ='1') then

secondedeler(11) <= not secondedeler(11);

end if;

end process;

process (secondedeler(11))

begin

if (secondedeler(11)'event and secondedeler(11) ='1') then

secondedeler(12) <= not secondedeler(12);

end if;

end process;

process (secondedeler(12))

begin

if (secondedeler(12)'event and secondedeler(12) ='1') then

secondedeler(13) <= not secondedeler(13);

end if;

end process;

process (secondedeler(13))

begin

if (secondedeler(13)'event and secondedeler(13) ='1') then

secondedeler(14) <= not secondedeler(14);

end if;

end process;

process (secondedeler(14))

begin

if (secondedeler(14)'event and secondedeler(14) ='1') then

secondedeler(15) <= not secondedeler(15);

end if;

end process;

process (secondedeler(15))

begin

if (secondedeler(15)'event and secondedeler(15) ='1') then

Page 44: Afstudeer verslag

44

secondedeler(16) <= not secondedeler(16);

end if;

end process;

process (secondedeler(16))

begin

if (secondedeler(16)'event and secondedeler(16) ='1') then

secondedeler(17) <= not secondedeler(17);

end if;

end process;

process (secondedeler(17))

begin

if (secondedeler(17)'event and secondedeler(17) ='1') then

secondedeler(18) <= not secondedeler(18);

end if;

end process;

process (secondedeler(18))

begin

if (secondedeler(18)'event and secondedeler(18) ='1') then

secondedeler(19) <= not secondedeler(19);

end if;

end process;

process (secondedeler(19))

begin

if (secondedeler(19)'event and secondedeler(19) ='1') then

secondedeler(20) <= not secondedeler(20);

end if;

end process;

process (secondedeler(20))

begin

if (secondedeler(20)'event and secondedeler(20) ='1') then

secondedeler(21) <= not secondedeler(21);

end if;

end process;

process (secondedeler(21))

begin

if (secondedeler(21)'event and secondedeler(21) ='1') then

secondedeler(22) <= not secondedeler(22);

end if;

end process;

end rtl ; -- of CLOCK_DIV

---------------------------------------------------------------------------

-----

-- Entity declaration of 'USB_RDCLK'.

-- Last modified : Sat Apr 07 21:52:02 2007.

---------------------------------------------------------------------------

-----

library ieee ;

use ieee.numeric_std.all ;

use ieee.std_logic_unsigned.all ;

use ieee.std_logic_1164.all ;

Page 45: Afstudeer verslag

45

entity USB_RDCLK is

port(

CLK6MHz : in std_logic;

RSTn : in std_logic;

RXFn : in std_logic;

USB_RD : out std_logic);

end USB_RDCLK ;

---------------------------------------------------------------------------

-----

-- Architecture 'rtl' of 'USB_RDCLK'

-- Last modified : Sat Apr 07 21:52:02 2007.

---------------------------------------------------------------------------

-----

architecture rtl of USB_RDCLK is

-- Hier wordt het leessignaal voor de USB interface gemaakt.

-- Bij het opstarten (reset) is het signaal hoog en het kan aktief (laag)

worden als RXFn laag is.

-- Het USB_RD signaal wisselt constant van hoog naar laag en vise versa

zolang RXFn laag is.

-- M.a.w. zolang er data in het USB fifo zit.

signal rdtemp : std_logic;

begin

USB_RD <= rdtemp;

process (CLK6MHz,RSTn)

begin

if RSTn = '0' then

rdtemp <= '1';

elsif (CLK6MHz'event and CLK6MHz='1') then

if RXFn = '0' then

rdtemp <= not rdtemp;

end if;

end if;

end process;

end rtl ; -- of USB_RDCLK

---------------------------------------------------------------------------

-----

-- Entity declaration of 'USB_ENCODER'.

-- Last modified : Wed Apr 18 11:05:46 2007.

---------------------------------------------------------------------------

-----

library ieee ;

use ieee.numeric_std.all ;

use ieee.std_logic_unsigned.all ;

use ieee.std_logic_1164.all ;

entity USB_ENCODER is

port(

RSTn : in std_logic;

USB_DATA : in std_logic_vector(7 downto 0);

USB_RD : in std_logic;

Page 46: Afstudeer verslag

46

amplitudedac : out std_logic_vector(11 downto 0);

offsetdac : out std_logic_vector(11 downto 0);

pulsewidth : out std_logic_vector(7 downto 0));

end USB_ENCODER ;

---------------------------------------------------------------------------

-----

-- Architecture 'rtl' of 'USB_ENCODER'

-- Last modified : Wed Apr 18 11:05:46 2007.

---------------------------------------------------------------------------

-----

architecture rtl of USB_ENCODER is

-- Hier worden de USB berichten ontrafeld.

signal berichtenteller : std_logic_vector (2 downto 0); -- De teller telt

het aantal bytes in een bericht

signal berichtenID : std_logic_vector (7 downto 0); -- Hier wordt de

identifier van het bericht opgeslagen

signal offsetdac_tmp_high : std_logic_vector (7 downto 0); -- Dit is data

na ID 10h (higher byte)

signal offsetdac_tmp_low : std_logic_vector (7 downto 0); -- Dit is data na

ID 10h (lower byte)

signal amplitudedac_tmp_high : std_logic_vector (7 downto 0); -- Dit is

data na ID 11h (higher byte)

signal amplitudedac_tmp_low : std_logic_vector (7 downto 0); -- Dit is data

na ID 11h (lower byte)

signal pulsewidth_tmp : std_logic_vector (7 downto 0); -- Dit is data na ID

12h

begin

process (USB_RD,RSTn,USB_DATA,berichtenID)

begin

if RSTn = '0' then

berichtenteller <= "000";

berichtenID <= "00000000";

offsetdac_tmp_high <= "00000000";

offsetdac_tmp_low <= "00000000";

amplitudedac_tmp_high <= "00000000";

amplitudedac_tmp_low <= "00000000";

pulsewidth_tmp <= "00000000";

offsetdac <= "000000000000";

amplitudedac <= "000000000000";

pulsewidth <= "00000000";

elsif (USB_RD'event and USB_RD='1') then

if berichtenteller = "000" and USB_DATA = "10011001" then -- Hier

begint een nieuw bericht, Wacht op het Startbyte 99h

berichtenteller <= "001"; -- Tel het Startbyte

elsif berichtenteller = "001" and (USB_DATA = "00010000" or USB_DATA

= "00010001" or USB_DATA = "00010010") then

-- Het programma komt hier als er een geldige identifier was en

berichtenteller "001" is

berichtenID <= USB_DATA; -- Het ID wordt opgeslagen

berichtenteller <= "010"; -- Tel het IDbyte

elsif berichtenteller = "010" then -- Het higher data byte komt

eraan

berichtenteller <= "011"; -- Tel het databyte

case (berichtenID) is

when "00010000" => offsetdac_tmp_high <= USB_DATA;

Page 47: Afstudeer verslag

47

when "00010001" => amplitudedac_tmp_high <= USB_DATA;

when "00010010" => pulsewidth_tmp <= USB_DATA; -- Wordt bij de

toekenning van het lower byte weer overschreven

when others => -- Do nothing

end case;

elsif berichtenteller = "011" then -- Het lower data byte komt eraan

berichtenteller <= "100"; -- Tel het databyte

case (berichtenID) is

when "00010000" => offsetdac_tmp_low <= USB_DATA;

when "00010001" => amplitudedac_tmp_low <= USB_DATA;

when "00010010" => pulsewidth_tmp <= USB_DATA;

when others => -- Do nothing

end case;

elsif berichtenteller = "100" and USB_DATA = "01100110" then --

Wacht op het Endbyte 66h

berichtenteller <= "000"; -- De teller wordt weer op nul gezet voor

een volgend bericht

-- Het bericht is gelukt en de tijdelijke waarden kunnen

overgenomen worden

offsetdac(11 downto 8) <= offsetdac_tmp_high(3 downto 0);

offsetdac(7 downto 0) <= offsetdac_tmp_low;

amplitudedac(11 downto 8) <= amplitudedac_tmp_high(3 downto 0);

amplitudedac(7 downto 0) <= amplitudedac_tmp_low;

pulsewidth <= pulsewidth_tmp;

else -- Geen Startbyte gedetecteerd of geen juiste idendentifier of

geen Endbyte

berichtenID <= "00000000"; -- Zet de berichten idendentifier weer

op nul

berichtenteller <= "000"; -- Zet de berichtenteller weer op nul

end if;

end if;

end process;

end rtl ; -- of USB_ENCODER

---------------------------------------------------------------------------

-----

-- Entity declaration of 'DAC_ENCODER'.

-- Last modified : Wed Apr 25 10:24:25 2007.

---------------------------------------------------------------------------

-----

library ieee ;

use ieee.numeric_std.all ;

use ieee.std_logic_unsigned.all ;

use ieee.std_logic_1164.all ;

entity DAC_ENCODER is

port(

CLK6MHz : in std_logic;

CLKHz75 : in std_logic;

CSn_OUT : out std_logic;

RSTn : in std_logic;

SCL_OUT : out std_logic;

SDA_OUT : out std_logic;

amplitudedac : in std_logic_vector(11 downto 0);

offsetdac : in std_logic_vector(11 downto 0));

end DAC_ENCODER ;

Page 48: Afstudeer verslag

48

---------------------------------------------------------------------------

-----

-- Architecture 'rtl' of 'DAC_ENCODER'

-- Last modified : Wed Apr 25 10:24:25 2007.

---------------------------------------------------------------------------

-----

architecture rtl of DAC_ENCODER is

signal offsetdac_takeover : std_logic_vector (11 downto 0); -- Overnemen

van offset data

signal amplitudedac_takeover : std_logic_vector (11 downto 0); -- Overnemen

van amplitude data

signal dac_value_changed : std_logic; -- Flag als offsetdac ongelijk is aan

offsetdac_changed of als amplitudedac ongelijk is aan amplitudedac_changed;

signal sdata_counter : std_logic_vector (5 downto 0); -- Deze counter telt

de seriele bits tijdens vullen DACs

signal start_pulse : std_logic ; -- De start van de puls wordt gemaakt op

de negatieve flank van het CLKHz75 signaal

signal start_pulse_del : std_logic ; -- Voor het starten is er nog een

vertraagt signaal nodig

signal start_pulse_del2 : std_logic ; -- Voor het starten is er nog een

vertraagt signaal nodig

begin

SCL_OUT <= CLK6MHz;

process(CLK6MHz,RSTn)

begin

if RSTn = '0' then

start_pulse <= '0';

start_pulse_del <= '0';

start_pulse_del2 <= '0';

elsif (CLK6MHz'event and CLK6MHz = '1') then

start_pulse <= CLKHz75; -- De start van de puls wordt gemaakt op het

CLKHz75 signaal

start_pulse_del <= start_pulse; -- Dit is nodig om de achterflank van

CLKHz75 te bepalen

start_pulse_del2 <= start_pulse_del; -- Dit is nodig om de

achterflank van CLKHz75 te bepalen

end if;

end process;

-- Vergelijk de binnenkomende offset en amplitude data met de overgenomen

data

-- en zet een flag als ze verschillend zijn.

process (CLK6MHz,RSTn)

begin

if RSTn = '0' then

dac_value_changed <= '0';

offsetdac_takeover <= (others => '0');

amplitudedac_takeover <= (others => '0');

elsif (CLK6MHz'event and CLK6MHz ='1') then

if sdata_counter = "110011" then -- Einde van vullen DACs

dac_value_changed <= '0';

elsif start_pulse_del = '0' and start_pulse_del2 = '1' then -- Op een

neergaande flank van CLKHz75

dac_value_changed <= '1';

offsetdac_takeover <= offsetdac;

amplitudedac_takeover <= amplitudedac;

Page 49: Afstudeer verslag

49

end if;

end if;

end process;

process (CLK6MHz,RSTn)

begin

if RSTn = '0' then

sdata_counter <= (others => '0');

elsif (CLK6MHz'event and CLK6MHz ='1') then

if dac_value_changed = '0' then

sdata_counter <= (others => '0');

else

sdata_counter <= sdata_counter + "000001";

end if;

end if;

end process;

-- Invullen van seriele data bits

process (sdata_counter,amplitudedac_takeover,offsetdac_takeover)

begin

case sdata_counter is

when "000000" => SDA_OUT <= '0'; CSn_OUT <= '1'; -- Rust situatie,

geen data

when "000001" => SDA_OUT <= '1'; CSn_OUT <= '0'; -- Bit 15; R1 Write

data to control register

when "000010" => SDA_OUT <= '0'; CSn_OUT <= '0'; -- Bit 14; Speed

control Slow mode

when "000011" => SDA_OUT <= '0'; CSn_OUT <= '0'; -- Bit 13; Power

controlbit Normal operation

when "000100" => SDA_OUT <= '1'; CSn_OUT <= '0'; -- Bit 12; R0 Write

data to control register

when "000101" => SDA_OUT <= '0'; CSn_OUT <= '0'; -- Bit 11; don't

care

when "000110" => SDA_OUT <= '0'; CSn_OUT <= '0'; -- Bit 10; don't

care

when "000111" => SDA_OUT <= '0'; CSn_OUT <= '0'; -- Bit 9; don't care

when "001000" => SDA_OUT <= '0'; CSn_OUT <= '0'; -- Bit 8; don't care

when "001001" => SDA_OUT <= '0'; CSn_OUT <= '0'; -- Bit 7; don't care

when "001010" => SDA_OUT <= '0'; CSn_OUT <= '0'; -- Bit 6; don't care

when "001011" => SDA_OUT <= '0'; CSn_OUT <= '0'; -- Bit 5; don't care

when "001100" => SDA_OUT <= '0'; CSn_OUT <= '0'; -- Bit 4; don't care

when "001101" => SDA_OUT <= '0'; CSn_OUT <= '0'; -- Bit 3; don't care

when "001110" => SDA_OUT <= '0'; CSn_OUT <= '0'; -- Bit 2; don't care

when "001111" => SDA_OUT <= '1'; CSn_OUT <= '0'; -- Bit 1; REF1

Select internal reference 2.048V

when "010000" => SDA_OUT <= '0'; CSn_OUT <= '0'; -- Bit 0; REF0

Select internal reference 2.048V

when "010001" => SDA_OUT <= '0'; CSn_OUT <= '1'; -- Rust situatie,

geen data

when "010010" => SDA_OUT <= '0'; CSn_OUT <= '0'; -- Bit 15; Write

data for DAC B buffer

when "010011" => SDA_OUT <= '0'; CSn_OUT <= '0'; -- Bit 14; Write

data for DAC B buffer

when "010100" => SDA_OUT <= '0'; CSn_OUT <= '0'; -- Bit 13; Write

data for DAC B buffer

when "010101" => SDA_OUT <= '1'; CSn_OUT <= '0'; -- Bit 12; Write

data for DAC B buffer

when "010110" => SDA_OUT <= amplitudedac_takeover(11); CSn_OUT <=

'0'; -- Bit 11; amplitudedac

when "010111" => SDA_OUT <= amplitudedac_takeover(10); CSn_OUT <=

'0'; -- Bit 10; amplitudedac

Page 50: Afstudeer verslag

50

when "011000" => SDA_OUT <= amplitudedac_takeover(9); CSn_OUT <= '0';

-- Bit 9; amplitudedac

when "011001" => SDA_OUT <= amplitudedac_takeover(8); CSn_OUT <= '0';

-- Bit 8; amplitudedac

when "011010" => SDA_OUT <= amplitudedac_takeover(7); CSn_OUT <= '0';

-- Bit 7; amplitudedac

when "011011" => SDA_OUT <= amplitudedac_takeover(6); CSn_OUT <= '0';

-- Bit 6; amplitudedac

when "011100" => SDA_OUT <= amplitudedac_takeover(5); CSn_OUT <= '0';

-- Bit 5; amplitudedac

when "011101" => SDA_OUT <= amplitudedac_takeover(4); CSn_OUT <= '0';

-- Bit 4; amplitudedac

when "011110" => SDA_OUT <= amplitudedac_takeover(3); CSn_OUT <= '0';

-- Bit 3; amplitudedac

when "011111" => SDA_OUT <= amplitudedac_takeover(2); CSn_OUT <= '0';

-- Bit 2; amplitudedac

when "100000" => SDA_OUT <= amplitudedac_takeover(1); CSn_OUT <= '0';

-- Bit 1; amplitudedac

when "100001" => SDA_OUT <= amplitudedac_takeover(0); CSn_OUT <= '0';

-- Bit 0; amplitudedac

when "100010" => SDA_OUT <= '0'; CSn_OUT <= '1'; -- Rust situatie,

geen data

when "100011" => SDA_OUT <= '1'; CSn_OUT <= '0'; -- Bit 15; Write

data for DAC A buffer and update A and B

when "100100" => SDA_OUT <= '0'; CSn_OUT <= '0'; -- Bit 14; Write

data for DAC A buffer and update A and B

when "100101" => SDA_OUT <= '0'; CSn_OUT <= '0'; -- Bit 13; Write

data for DAC A buffer and update A and B

when "100110" => SDA_OUT <= '0'; CSn_OUT <= '0'; -- Bit 12; Write

data for DAC A buffer and update A and B

when "100111" => SDA_OUT <= offsetdac_takeover(11); CSn_OUT <= '0'; -

- Bit 11; offsetdac

when "101000" => SDA_OUT <= offsetdac_takeover(10); CSn_OUT <= '0'; -

- Bit 10; offsetdac

when "101001" => SDA_OUT <= offsetdac_takeover(9); CSn_OUT <= '0'; --

Bit 9; offsetdac

when "101010" => SDA_OUT <= offsetdac_takeover(8); CSn_OUT <= '0'; --

Bit 8; offsetdac

when "101011" => SDA_OUT <= offsetdac_takeover(7); CSn_OUT <= '0'; --

Bit 7; offsetdac

when "101100" => SDA_OUT <= offsetdac_takeover(6); CSn_OUT <= '0'; --

Bit 6; offsetdac

when "101101" => SDA_OUT <= offsetdac_takeover(5); CSn_OUT <= '0'; --

Bit 5; offsetdac

when "101110" => SDA_OUT <= offsetdac_takeover(4); CSn_OUT <= '0'; --

Bit 4; offsetdac

when "101111" => SDA_OUT <= offsetdac_takeover(3); CSn_OUT <= '0'; --

Bit 3; offsetdac

when "110000" => SDA_OUT <= offsetdac_takeover(2); CSn_OUT <= '0'; --

Bit 2; offsetdac

when "110001" => SDA_OUT <= offsetdac_takeover(1); CSn_OUT <= '0'; --

Bit 1; offsetdac

when "110010" => SDA_OUT <= offsetdac_takeover(0); CSn_OUT <= '0'; --

Bit 0; offsetdac

when others => SDA_OUT <= '0'; CSn_OUT <= '1';

end case;

end process;

end rtl ; -- of DAC_ENCODER

Page 51: Afstudeer verslag

51

---------------------------------------------------------------------------

-----

-- Entity declaration of 'PULSE_GEN'.

-- Last modified : Wed Apr 25 10:24:25 2007.

---------------------------------------------------------------------------

-----

library ieee ;

use ieee.numeric_std.all ;

use ieee.std_logic_unsigned.all ;

use ieee.std_logic_1164.all ;

entity PULSE_GEN is

port(

CLK50MHz : in std_logic;

CLKHz75 : in std_logic;

RSTn : in std_logic;

pulse_out : out std_logic;

pulsewidth : in std_logic_vector(7 downto 0));

end PULSE_GEN ;

---------------------------------------------------------------------------

-----

-- Architecture 'rtl' of 'PULSE_GEN'

-- Last modified : Wed Apr 25 10:24:25 2007.

---------------------------------------------------------------------------

-----

architecture rtl of PULSE_GEN is

--signal pulsewidth_intern: std_logic_vector(7 downto 0); -- Dit is de

binnenkomende pulsewidth, maar stand 0 wordt 1 (pulsbreedte 0 bestaat niet)

signal pulsewidth_intern_count: std_logic_vector(7 downto 0); -- Deze

waarde wordt op de langzame klok (~1s) geupdate met pulsewidth_intern

signal pulsewidth_counter: std_logic_vector(7 downto 0); -- Deze teller

telt de breedte van de puls in 20ns stapjes

signal start_pulse : std_logic ; -- De start van de puls wordt gemaakt op

het CLKHz75 signaal

signal start_pulse_del : std_logic ; -- Voor het starten is er nog een

vertraagt signaal nodig

signal start_pulse_del2 : std_logic ; -- Voor het starten is er nog een

vertraagt signaal nodig

begin

-- pulsewidth_intern <= "00000001" when pulsewidth = "00000000" else

pulsewidth;

process(CLK50MHz,RSTn)

begin

if RSTn = '0' then

start_pulse <= '0';

start_pulse_del <= '0';

start_pulse_del2 <= '0';

elsif (CLK50MHz'event and CLK50MHz = '1') then

start_pulse <= CLKHz75; -- De start van de puls wordt gemaakt op het

CLKHz75 signaal

start_pulse_del <= start_pulse; -- Dit is nodig om de voorflank van

CLKHz75 te bepalen

Page 52: Afstudeer verslag

52

start_pulse_del2 <= start_pulse_del; -- Dit is nodig om de voorflank

van CLKHz75 te bepalen

end if;

end process;

process(CLK50MHz,RSTn)

begin

if RSTn = '0' then

pulsewidth_counter <= "00000000";

pulsewidth_intern_count <= "00000000";

pulse_out <= '1';

elsif (CLK50MHz'event and CLK50MHz = '1') then

if start_pulse_del = '1' and start_pulse_del2 = '0' then -- Op een

opgaande flank van CLKHz75

pulsewidth_counter <= "00000000"; -- Reset de pulsewidth_counter

pulsewidth_intern_count <= pulsewidth; -- Update

pulsewidth_intern_count

elsif pulsewidth_counter /= pulsewidth_intern_count then -- Als de

eindwaarde nog niet bereikt is

pulsewidth_counter <= pulsewidth_counter + "00000001"; -- Tellen

totdat de eindwaarde bereikt is

pulse_out <= '0';

else

pulsewidth_counter <= pulsewidth_counter; -- Anders stoppen op de

eindwaarde

pulse_out <= '1';

end if;

end if;

end process;

-- pulse_out <= '1' when (pulsewidth_counter /= pulsewidth_intern_count)

and (pulsewidth_counter /= "00000000") else '0';

end rtl ; -- of PULSE_GEN

---------------------------------------------------------------------------

-----

-- Entity declaration of 'Pulser'.

-- Last modified : Wed Apr 18 11:29:10 2007.

---------------------------------------------------------------------------

-----

library ieee ;

use ieee.numeric_std.all ;

use ieee.std_logic_unsigned.all ;

use ieee.std_logic_1164.all ;

entity Pulser is

port(

CLK50MHz : in std_logic;

CSn_OUT : out std_logic;

RSTn : in std_logic;

RXFn : in std_logic;

SCL_OUT : out std_logic;

SDA_OUT : out std_logic;

USB_DATA : in std_logic_vector(7 downto 0);

USB_RD : out std_logic;

pulse_out : out std_logic);

end Pulser ;

Page 53: Afstudeer verslag

53

---------------------------------------------------------------------------

-----

-- Architecture 'structure' of 'Pulser'

-- Last modified : Wed Apr 18 11:29:10 2007.

---------------------------------------------------------------------------

-----

architecture structure of Pulser is

component CLOCK_DIV

port(

CLK50MHz : in std_logic;

CLK6MHz : out std_logic;

CLKHz75 : out std_logic;

RSTn : in std_logic);

end component ;

component USB_RDCLK

port(

CLK6MHz : in std_logic;

RSTn : in std_logic;

RXFn : in std_logic;

USB_RD : out std_logic);

end component ;

component USB_ENCODER

port(

RSTn : in std_logic;

USB_DATA : in std_logic_vector(7 downto 0);

USB_RD : in std_logic;

amplitudedac : out std_logic_vector(11 downto 0);

offsetdac : out std_logic_vector(11 downto 0);

pulsewidth : out std_logic_vector(7 downto 0));

end component ;

component DAC_ENCODER

port(

CLK6MHz : in std_logic;

CLKHz75 : in std_logic;

CSn_OUT : out std_logic;

RSTn : in std_logic;

SCL_OUT : out std_logic;

SDA_OUT : out std_logic;

amplitudedac : in std_logic_vector(11 downto 0);

offsetdac : in std_logic_vector(11 downto 0));

end component ;

component PULSE_GEN

port(

CLK50MHz : in std_logic;

CLKHz75 : in std_logic;

RSTn : in std_logic;

pulse_out : out std_logic;

pulsewidth : in std_logic_vector(7 downto 0));

end component ;

signal USB_RD_net : std_logic;

signal CLK6MHz0 : std_logic;

signal pulsewidth : std_logic_vector(7 downto 0);

signal offsetdac : std_logic_vector(11 downto 0);

signal amplitudedac : std_logic_vector(11 downto 0);

Page 54: Afstudeer verslag

54

signal CLKHz75 : std_logic;

begin

USB_RD <= USB_RD_net;

u0: CLOCK_DIV

port map(

CLK50MHz => CLK50MHz,

CLK6MHz => CLK6MHz0,

CLKHz75 => CLKHz75,

RSTn => RSTn);

u1: USB_RDCLK

port map(

CLK6MHz => CLK6MHz0,

RSTn => RSTn,

RXFn => RXFn,

USB_RD => USB_RD_net);

u2: USB_ENCODER

port map(

RSTn => RSTn,

USB_DATA => USB_DATA,

USB_RD => USB_RD_net,

amplitudedac => amplitudedac,

offsetdac => offsetdac,

pulsewidth => pulsewidth);

u3: DAC_ENCODER

port map(

CLK6MHz => CLK6MHz0,

CLKHz75 => CLKHz75,

CSn_OUT => CSn_OUT,

RSTn => RSTn,

SCL_OUT => SCL_OUT,

SDA_OUT => SDA_OUT,

amplitudedac => amplitudedac,

offsetdac => offsetdac);

u4: PULSE_GEN

port map(

CLK50MHz => CLK50MHz,

CLKHz75 => CLKHz75,

RSTn => RSTn,

pulse_out => pulse_out,

pulsewidth => pulsewidth);

end structure ; -- of Pulser