Page 1
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
29
Figuur 25 Uitgangspuls 0V naar -2V.
Figuur 26 Uitgangspuls 0V naar -12V.
Page 30
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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