Guten Morgen,
ich studiere Elektrotechnik mit der Fachrichtung Mikrosystemtechnik.
Seit längerer Zeit verfolge ich schon die Thread hier im Forum und bin
wirklich begeistert von der Qualität der Beiträge und auch dem
Engagement was die Leute hier in ihrer Freizeit reinstecken.
Kurz zu mir: Habe Erfahrungen sowohl im Analog- als auch im
Digitaldesign von elektronischen Schaltungen. Eine gewissen
Grundkenntniss im Umgang mit FPGA's und VHDL ist durch Vorlesungen
vorhanden. Jedoch fehlt, wie sollte es im Studium auch anders sein die
Praxiserfahrung.
Muss nun für die Uni ein sehr umfangreiches VHDL/FPGA Projekt
realisieren und wäre um eure Mithilfe sehr dankbar. Es geht mir aber
nicht darum, hier eine fertige Lösung des Projektes zu bekommen, sondern
eher um Denkanstöße, mögliche Lösungswege, Hinweise und Verbesserungen
meiner Implentierung. Ich möchte aus dem Projekt den für mich
größtmöglichen Lerneffekt erzielen, um am Ende sagen zu können, dass ich
sowohl den Umgang mit dem FPGA als auch mit VHDL erlernt habe.
Nun zu meinem Projekt:
Es geht um die Ansteuerung einer Time-of-Flight Kamera welche im
Pulsverfahren funktioniert. Das heißt, es muss ein hochfrequentes
sychrones Taktsignal erzeugt werden. Dies soll mittels eines FPGA's
geschehen. Im Anhang habe ich sowohl das Timing Diagramm als auch einen
ersten Versuchsaufbau dargestellt.
Ich versuche nun mit eigenen Worten kurz zu beschreiben was genau
gemacht werden soll:
Zuerst wird ein Signal (TL1) erzeugt, mit welche eine Laserdiode
angesteuert wird. Die Breite des Signals soll ich im Bereich zwischen 20
- 50 ns bewegen. Mit einer Schrittweite von 500 ps. Danach wird ein
Signal (TV1) erzeugt welches in der Kamera den Shutter 1 öffnet. Dieses
Signal muss die selbe Breite haben wie das Signal TL1 . Das Signal TV1
soll eine nach "links" programmierbare Delayzeit haben, die auch in der
Auflösung von 500 ps einstellbar sein soll. Sobald der Shutter 1
geschlossen ist, wird ein Signal an Shutter 2 angelegt und dieser
geöffnet. Durch das Verhältnis des eintreffenden Lichtes auf die beiden
Shutter kann später die Entfernung bestimmt werden. (Auswertung nicht
Teil des Projektes) Ein dritter Shutter (TV3) ist geöffnet wenn die
beiden Shutter 1 & 2 geschlossen sind.
Hoffe ich konnte verständlich erklären, was implementiert werden soll.
Als Hardware steht mir ein Altera ARRIA V GT Development Board zur
Verfügung und als Software werde ich Quartus II 13.1 benutzen. Eine
Einarbeitung sowohl in die Software als auch in die Hardware hat
stattgefunden.
Bisher fehlt mir aber ein wirklicher Anfang wie ich dieses Problem
umsetzen kann. Wäre dankbar für ein paar Gedankenanstöße um überhaupt
reinzukommen.
Gruß Jan
Du brauchst einen hochgenauen Quarz, ein einstellbares Delay, ein
Oder-Gatter UND-Gatter zum Ereugen des Pulses, ein weiteres
einstellbares Delay ein Oder-Gatter zum Verlängern des Pulses und eines
zum Abschalten. Das Ganze zweimal für die beiden Shutter. In einem ARRIA
V GT müsste das vom Tempo her gerade zu machen sein, auch wenn es von
der Grösse her in einen MAX2 passt :-)
Ohne es je verwendet zu haben: TI wirbt bei seinen TMS320 mit
High-resolution PWM und Micro-Edge-Positioning. Angeblich bis 150 ps
Auflösung. Angesichts dessen, dass die Aufgabe abgesehen von den kleinen
Zeiten recht einfach aussieht, vielleicht einen Blick wert.
Der Arria V GT hat Transceiver deren Transmitter im PMA Mode bis zu 10.3
GBit/s können. Damit ist es "trivial" Pulse mit einer einstellbaren
Breite in 100 ps Schritten zu erzeugen.
Lattice User schrieb:> amit ist es "trivial" Pulse mit einer einstellbaren> Breite in 100 ps Schritten zu erzeugen.
Mit den Xilinx-IO-Delays geht das nominell sogar auf 50ps genau und dies
erfordert nicht einmal einen aktuellen Chip. Wenn man da ein bischen
nachdenkt und klug baut, geht es sogar auf 15ps (getestet), soforen die
Analogtechnik drum herum entsprechend aufgrüstet wird.
Jürgen S. schrieb:> Lattice User schrieb:>> amit ist es "trivial" Pulse mit einer einstellbaren>> Breite in 100 ps Schritten zu erzeugen.> Mit den Xilinx-IO-Delays geht das nominell sogar auf 50ps genau und dies> erfordert nicht einmal einen aktuellen Chip. Wenn man da ein bischen> nachdenkt und klug baut, geht es sogar auf 15ps (getestet), soforen die> Analogtechnik drum herum entsprechend aufgrüstet wird.
Du hast mich falsch verstanden. Wozu sich mit IO Delays und sonstigen
Tricks abplagen, wenn der FPGA den er bereits auf dem Tisch hat eine
viel einfachere Möglichkeit bietet, nämlich ein mit 10 GHz taktbares
80bit Schieberegister.
Ich habe keine Zweifel dass so etwas auch mit Xilinx geht, nur hat er
den Arria V GT bereits.
Ich habe Dich schon richtig verstanden :-)
Mein Beitrag war nur der Vollständigkeit erwähnt, dass die 500ps kein
Hexenwerk sind.
Allerdings muss ich schon noch sagen, dass das 10GHz Schieberegister
auch nicht ganz so einfach anzusteuern sein wird, im Vergleich zu einem
Delay, bei dem das "Abplagen" darin bestünde, das delay reinzuschreiben
:-)
Ok, also euren Aussagen zu entnehmen dürfte die Umsetzung nicht wirklich
ein Problem sein.
Zuerst muss ich ja die beiden Pulse TL1 und TV1 (mit einstellbarem
Delay) erzeugen. Doch wie genau erzeuge ich eine solche Pulse mittels
VHDL? Wird sowas durch eine PWM gemacht oder bin ich da jetzt komplett
auf dem Holzweg?
Und wofür genau soll das 10 GHz taktbare 80bit Schieberegister genutzt
werden?
Gruß Jan
Barni2k7 schrieb:> Ok, also euren Aussagen zu entnehmen dürfte die Umsetzung nicht wirklich> ein Problem sein.>> Zuerst muss ich ja die beiden Pulse TL1 und TV1 (mit einstellbarem> Delay) erzeugen. Doch wie genau erzeuge ich eine solche Pulse mittels> VHDL? Wird sowas durch eine PWM gemacht oder bin ich da jetzt komplett> auf dem Holzweg?
Im Prinzip ja, aber dafür müsstet du den FPGA mit 2 GHz betreiben, was
nicht geht.
>> Und wofür genau soll das 10 GHz taktbare 80bit Schieberegister genutzt> werden?>
Das Schieberegister wird z.B. all 8 ns, d.h. mit einem leicht
beherschbaren 125 MHz Takt mit einem neuen Bitmuster geladen.
z.B. auf 2 GHz und 16 bit Breite konfiguriert, (um 500 ps Auflösung)
sieht es so aus..
0: 0000 0000 0000 0000
1: 1111 1111 1111 1111
2: 1111 1111 1111 1111
3: 1111 1111 1110 0000
4: 0000 0000 0000 0000
Gibt einen 21.5 ns langen Puls.
0: 0000 0000 0000 0000
1: 1111 1111 1111 1111
2: 1111 1111 1111 1111
3: 1111 1111 1111 0000
4: 0000 0000 0000 0000
Gibt einen 22 ns langen Puls.
Wie man den PMA Mode des GT Transceivers konfiguriert steht im
Datashheet bzw siehe MegaWizard (oder wie auch immer das IP Tool in
Quartus heisst)
Du braucht mindestens 3, die zudem einmalig beim Reset synchronisiert
werden müssen. Bin nicht sicher ob das geht.
Ok, ich werde mich den Rest der Woche dann mal mit der erzeugend eines
Pulses mit Hilfe des Schieberegisters auseinandersetzen. Und werde die
Lösung dann hoffentlich am Freitag präsentieren können ;)
Falls ihr noch Anregungen oder Ideen habt immer her damit :)
Gruß Jan
So das ganze hat dann doch etwas länger gedauert. Lag leider eine Woche
krank im Bett.
Habe jetzt ein ein entsprechendes Schieberegister In VHDL beschrieben
und mit einer Testbenche getestet. Das ganze ist aber noch nicht
synthetisierbar, da mit in der eigentlichen Beschreibung die
Realisierung mit den verschiedenen Clocks ( 125MHZ fürs parallele Laden
& 2 GHz für das Schieben) fehlt.
Im Anhang habe ich das Schieberegister, die Testbench und die ModelSim
Ergebnisse.
Gruß Jan
>Im Anhang habe ich das Schieberegister, die Testbench und die ModelSim>Ergebnisse.>Gruß Jan
Ja schön und wie willst du das mit dem Arria V GT Transceiver
verheiraten?
>Sollte das nicht als Core vorliegen??
Denk ich auch...
Gruß Jonas
Ich fürchte, hier müssen nochmals einige Grundlagen des FPGA-Designs
besser verstanden werden, konkret die Unterscheidung virtuelle und reale
Hardwareresourcen und deren Nutzung.
Guten Morgen,
ich kann eure Kritik vollkommen nachvollziehen! Es ging jetzt für mich
im ersten Schritt überhaupt mal darum ein Gefühl dafür zu bekommen wie
so ein Schieberegister in VHDL realisiert werden kann und mal eine erste
Timinig Simulation durchzuführen.
Das meine Beschreibung nicht synthetisierbar ist, bzw so nicht als
Hardware auf dem ARRIA V umsetzbar ist, ist mir bewusst. Der zweite
Schritt wäre sich jetzt zu überlegen wie man dies realisieren kann.
Grade mit dem ARRIA V GT Transceiver habe ich noch nicht so die
wirkliche Ahnung.
jo schrieb:>>konkret die Unterscheidung virtuelle und reale Hardwareresourcen> und deren Nutzung.
Was meinst du genau damit? Hast du vllt ein paar Tips oder Informationen
dazu?
Gruß Jan
1. Ersetz die Variable durch ein Signal.
2. Wenn du die Sache mit dem Gigabit Tranceiver probieren möchtest dann
belies dich erstmal etwas dazu (dafür sollte es einen IP Core geben den
du nutzen kannst) und schau dir an wie man sowas instanziert (COMPONENT,
PORT MAP)
3. Bau dir ne Simulation
4. Synthetisier das ganze und miss mit nem Oszi nach ob dein Ausgang das
richtige tut. Danach kannst du deine Eingangsdaten und damit auch deinen
Ausgangstakt verändern. Bei Xilinx lief das glaube ich über den DRP?
>Was meinst du genau damit? Hast du vllt ein paar Tips oder Informationen>dazu?
Er meinte damit das manche Resourcen eines FPGA's z.B. der Transciever
zwar die Funktion eines Schieberegisters haben, jedoch nicht als sochles
in vhdl zu beschreiben sind, sondern meist über spezielle ip-generatoren
code für diese erzeugt wird...das macht man dann selten zu Fuss, siehe
z.B. DDR-RAM ip-generator usw...
Gruß Jonas
An dieser Stelle muss man sich immer wieder vergegenwärtigen, dass mit
VHDL nur die frei konfigurierbare Logik verwaltet wird. Die harte Logig
wird direkt verwendet.