Forum: FPGA, VHDL & Co. 400MHz ADC mit Spartan 6


von Sebastian (Gast)


Lesenswert?

Hallo @ all FPGA User,

Wir benötigen eine schnelle Datenerfassungskarte (400MHz). Nun habe ich 
gesehn das Ti neue ADCs im Angebot hat (Monoflopwandler mit 400 und 
500MHz). Jetzt wollte ich mal einen Spartan 6 ausprobieren. Hierzu will 
ich einfach den 400MHz Wandler direkt (12LVDS Paare) an den FPGA 
anschließen. Über einen externen Quarz von 50MHz ,den ich im FPGA mit 
Hilfe vom DCM auf 400MHz aufbohre wollte ich dann die Ansteuerung des 
ADC vornehmen.

Im Prinzip muß man "nur" denn 400MHz Takt auf den ADC geben und 
gleichzeitig die Ports einlesen. Diese 12 Bits wollte ich dann über eine 
Camera Link Schnittstelle an eine Framgrabberkarte senden.

Ist das realistisch, das man mit dem Spartan 6 eine solche Anwendung 
hinbekommt?

Schalten die LVDS-Ports des SPartan 6 denn überhaupt schnell genug, oder 
muß ich diese an spizielle Ports hängen?

von Christian R. (supachris)


Lesenswert?

Ich glaube der Spartan wird dazu vielleicht nicht so gut geeignet sein, 
denn der BlockRAM zum Beispiel geht nur bis 250MHz....musst du erst mal 
schauen, was die einzelnen Komponenten so mitmachen.

von Sebastian (Gast)


Lesenswert?

Ich meine ja den neuen Spartan6. Da geht der BlockRAM sicherlich 
deutlich schneller als 250MHz. Außerdem kann man ja einen nexternen DDR2 
RAM als Zwischenpuffer nehmen.

von Christian R. (supachris)


Lesenswert?

Ich meine auch den neuen Spartan 6 und dessen Blockram schafft 250MHz. 
Über den neuen Memory Controller und externen RAM sollte es denke ich 
aber klappen. Die PLL geht bis 1050MHz, also ausreichend. Musst halt 
gucken, ob das mit den Inputs klappt, denn der Spartan bietet keine 
kalibrierten, temperaturstabilen Input-Delays.

von Sebastian (Gast)


Lesenswert?

1050MHz ist ja eine Hammergeschwindigkeit ^^. Mich wundert halt nur das 
man den internen Clock bis 1050MHz hochtreiben kann, jedoch der interne 
BlockRam nur bis 250MHz geht.

Jedoch kann man ja mehrere BlockRams parralel betreiben. Wenn man der 
Datenbus des ADCs 12Bit ist, dann erzeugt man einen Fifo den man z.B. 
mit 1000MHz befüllt und alle 250MHz wird dann in die RAMs geschrieben.

Danke schon mal für die Infos Christian.

Hast Du schon mit den neuen Spartan 6 oder Virtex 6 gearbeitet?

von Sebastian (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe mal versucht das ganze auf Papier zu bringen.

Es gibt z.B. von Ti einen 12Bit 500MHz Wandler (ADS5444). Dieser bekommt 
das Signal und einen Clock. Die Frequenz des Clocks beträgt z.B. 400Mhz. 
Der AD-Wandler erzuegt 12LVDS Datenpaare und ein LVDS DATA_READY Signal. 
Diese möchte ich auf einen FIFO geben, der 24LVDS Bits speichern kann. 
Vielleicht gibt es auch eine bessere Möglichkeit als mit dem Fifo. Aus 
dem Fifo kommt dann alle 200MHz 24Bit LVDS Daten, die an den Spartan 6 
gehen. Den Clock kann man über einen FLIPFLOP herunterteilen. Ob dies 
allerdings die beste Methode ist bezweifel ich. Vielleicht hat ja jemand 
einen besseren Vorschlag.

Der Entwurf befindet sich im Anhang

von Christian R. (supachris)


Lesenswert?

Naja, Problem dürfte sein, dass sich die busmatching FIFOs intern nur 
mit BlockRam realisieren lassen. Somit beißt sich die Katze in den 
Schwanz. Nee, gearbeitet hab ich damit noch nicht, aber mal testweise 
ein Virtex 4 Design umgesetzt, um zu schauen, ob man da eventuell auf 
den wesentlich günstigeren Spartan 6 gehen kann. Ist aber nicht so 
einfach, der hat einige Beschränkungen. Zum Beispiel müssen die IDDR und 
ODDR auf einem IOB mit dem gleichen Takt laufen. Beim Virtex gibts 
verschiedene. Dann die angesprochenen suboptimalen IDELAY....naja, 
irgendwo mussten sie ja sparen. Anscheinend lässt sich auch der BlockRAM 
nicht zu beliebig großen Blöcken zusammen hängen (oder es ist noch ein 
Bug im ISE). Die 172 RAM Blöcke des LX75 lassen sich nicht zu einem 128k 
x 18 FIFO zusammen koppeln....64k x 18 geht....

von Sebastian (Gast)


Lesenswert?

Ich habe mir mal die neuste 11.4 gestern runtergeladen und zu Hause mal 
installiert. Ich werde mal versuchen über Weihnachten ein Design zu 
erzeugen und hier zu veröffentlichen.

von Stefan Salewski (Gast)


Lesenswert?

>Über einen externen Quarz von 50MHz ,den ich im FPGA mit
>Hilfe vom DCM auf 400MHz aufbohre wollte ich dann die Ansteuerung des
>ADC vornehmen.

Und der Jitter stört nicht?

von Christian R. (supachris)


Lesenswert?

Warum muss es eigentlich unbedingt ein Spartan 6 sein? Mal abgesehen von 
den 400MHz ist das Ding gerade mal als ES verfügbar....

von Stefan Salewski (Gast)


Lesenswert?

>Warum muss es eigentlich...

Mit Verlaub: 340kByte für so eine hingeschwierte Skizze -- bei anderen 
reicht das für eine komplette Diplomarbeit.

von Helmut S. (helmuts)


Lesenswert?

Stefan Salewski schrieb:
>>Über einen externen Quarz von 50MHz ,den ich im FPGA mit
>>Hilfe vom DCM auf 400MHz aufbohre wollte ich dann die Ansteuerung des
>>ADC vornehmen.
>
> Und der Jitter stört nicht?

Volle Zustimmung.
Einen FPGA-Ausgang als Clock für einen ADC zu verwenden ist ein 
typischer Anfängerfehler.

von Thomas R. (tinman) Benutzerseite


Lesenswert?

Helmut S. schrieb:

> Volle Zustimmung.
> Einen FPGA-Ausgang als Clock für einen ADC zu verwenden ist ein
> typischer Anfängerfehler.

Die meisten DSOs bis 1500 eur (auch Agilent) benutzen auch nix anderes, 
ein FPGA der clock signal für ADCs erzeugt.

Es sind "nur" 100 bis 200Mhz die da benutzt werden, dafür aber an bis 
zum 10 ADCs.

Mir ist schon klar das geräte in der preisklasse keine "reference 
designs" sind, aber auch nicht unbedingt von anfängern gebaut.

von Helmut S. (helmuts)


Lesenswert?

Thomas R. schrieb:
> Helmut S. schrieb:
>
>> Volle Zustimmung.
>> Einen FPGA-Ausgang als Clock für einen ADC zu verwenden ist ein
>> typischer Anfängerfehler.
>
> Die meisten DSOs bis 1500 eur (auch Agilent) benutzen auch nix anderes,
> ein FPGA der clock signal für ADCs erzeugt.
>
> Es sind "nur" 100 bis 200Mhz die da benutzt werden, dafür aber an bis
> zum 10 ADCs.
>
> Mir ist schon klar das geräte in der preisklasse keine "reference
> designs" sind, aber auch nicht unbedingt von anfängern gebaut.

Hallo Thomas,

lies doch mal Seite 23 und vergleiche das mit der Jitter-Spec von 
FPGA-Ausgängen.
http://www.analog.com/static/imported-files/data_sheets/AD9230.pdf

ADCs haben übrigens meistens einen Clock-Ausgang für die Daten. Den 
nimmst du am besten als FPGA-Clock.

von Sebastian (Gast)


Lesenswert?

Vielleicht werde ich es dann erst mal mit dem Virtex5 versuchen. Ti hat 
dort ein Evaluation Board im Angebot. ADS5474 ADX. Dort ist ein Virtex 5 
(XC5VSX50T) verbaut. Dies ist ein sehr interessantes Board.

Es befindet sich ein SMA-Steckverbinder drauf. Dort kann man einen 
externen Clock für die Digitalisierung einspeisen. Der Clock wird dann 
in ein LVDS-Signal gewandelt und wird an den 1. AD angeschlossen. Für 
den 2. AD-Wandler werden einfach die P mit der N des Clock vertauscht. 
Somit erreicht man ein 180° Phasenverschiebung. Demnach digitalisiert 
der 1. AD-Wandler mit der ansteigenden Clock Flanke und der 2. Wandler 
mit der abfallenden Clock Flanke.

Bei Virtex 5 sind die IO/Port schnell genug um 400MHz Daten zu erkennen.

So weit so gut.

Die beiden AD-Wandler besitzen eine Data Ready Ausgang (LVDS), die an 
den FPGA gehen. Die Data Ready Leitungen sind beim FPGA an die 
LVDS-Clockeingänge angeschlossen, so das diese auf den Clock Buffer 
gehen.

BANK 4: AC18 --> IO_L6P_GC_4
BANK 4: AB17 --> IO_L6N_GC_4

1. Jetzt zu meiner Frage wie programmiert man am besten den 
Datenempfang?

Erzeuge ich einen Prozess, der mit jeder anteigenden Flanke die Daten in 
einen BlockRAMadresse schreibt? Oder muss ich diesen Clock noch mit 
einem PLL oder DCM bearbeiten?

von Stefan Salewski (Gast)


Lesenswert?

Autor:  Thomas R. (tinman)
>Die meisten DSOs bis 1500 eur (auch Agilent) benutzen auch nix anderes,
>ein FPGA der clock signal für ADCs erzeugt.

Für ein 8 Bit DSO mag das noch OK sein. Im ersten Postings des 
Threadsstarters stand etwas von (12LVDS Paare), also nehme ich an er 
will 12 Bit. Bei  viel Jitter kann er die unteren aber vergesssen.

von Thomas R. (tinman) Benutzerseite


Lesenswert?

Stefan Salewski schrieb:
>
> Für ein 8 Bit DSO mag das noch OK sein. Im ersten Postings des
> Threadsstarters stand etwas von (12LVDS Paare), also nehme ich an er
> will 12 Bit. Bei  viel Jitter kann er die unteren aber vergesssen.

stimmt, habe nicht aufmerksam genug gelesen.

von Salvador (Gast)


Lesenswert?

Hy Sebastian

Ich hab vor mir eine ähnliche Aufhabe, ich muss ein ADS54RF63 mit einem 
ML506 (XC5VSX50T) verbinden, und das steurenprogram schreiben. Ich habe 
bis jetz nicht so viel gemacht, aber vileicht können wir uns in 
verbindung setzen und bei der aufgabe uns miteinandern helfen.

von Sebastian (Gast)


Lesenswert?

Ich bin jetzt erst mal vom Spartan 6 weg, da der interne SRAM nur mit 
ca. 200 oder 250MHz läuft und die I/O Schaltzeit auch recht knapp war. 
Ich verwende jetzt auch den "XC5VSX50T". Hierzu habe ich von TI ein 
Evaluations-Board bestellt. Dieser enthält den FPGA XC5VSX50T. Ich habe 
auch schon angefangen ein kleines Programm zu schreiben.

Nur als Hinweis. Für diesen FPGA kann man nicht mehr das Webpack 
benutzten sondern benötigt die ISE Software, die so ca. 2000 bis 4000€ 
kostet.

Das mit dem gegenseitigen Austauschen finde ich toll ^^

von Sebastian (Gast)


Lesenswert?

Wie ich sehe hast Du den 12Bit 550MHz AD-Wandler ausgewählt. Ich 
benutzte den 14Bit 400MHz Wandler.

Auf meinem Board ist der XC5VSX50T mit dem Speedgrade -1 verbaut. Hier 
ist die maximale Frequenz für Counter und RAM 450MHz (zur Info). Jedoch 
muß der RAM richtig konfiguriert werden, sonst kann dieser nur zwischen 
200 und 300 MHz betrieben werden.

Wenn auf Deinem Board der FPGA mit dem Speedgrade -3 verbaut ist, dann 
kann der RAM mit maximal 550MHz betrieben werden.

http://www.xilinx.com/support/documentation/data_sheets/ds202.pdf

siehe Seite 48 im Datenblatt (link)

Jedoch muß man auch sagen das der FPGA vom Preis her auch deutlich 
teurer ist als das Speedgrade 1.


Womit ich erst mal begonnen habe:

Ich habe ein Signal mit dem Namen Trigger. Wenn der Trigger von Low auf 
High wechselt, dann möchte ich X-Datenpunkte speichern. Die DAten werden 
dann erst einmal in einem Block Ram gespeichert.


Um dies umzusetzten benötigt man also einen Counter der mitzählt wie 
viele Punkte man bereits ab dem Triggerevent digitalisiert hat. Dieser 
Counter ist auch gleich mein Adresszähler für den RAM. Zudem benötige 
ich auch einem Comparator. Dieser vergleicht halt ob die vorgegebene 
Anzahl an Datenpunkten bereits digitalisiert wurde. Fals die Anzahl noch 
nicht erreicht wurde, wird die EN-Leitung vom Block-Ram auf 1 gesetzt. 
Ist die Anzahl an Datenpunkten erreicht, so wird die EN-Leitung vom 
Block RAM auf 0 gesetzt. Somit werden keine weiteren Daten in den Block 
RAM geschrieben.

Hier sei auch wieder darauf hingewiesen, das der Counter und der 
Comparator mit maximal 450MHz (beim Speedgrade -1 und 550MHz beim 
Speedgrade -3 funktioniert).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.