Ich würde gerne folgenden A/D-Wandler
Analog Devices
AD9433 (12bit, 125-MSPS)
der auf einem Stratix DSP Board 2 mal verbaut ist nutzen um einen
Analogen IST und SOLL wert umzuwandeln und zu vergleichen.
Der FPGA soll mittels VHDL programmiert werden.
Leider bin ich in Sachen VHDL nicht so fit, für ein paar Ratschläge wär
ich dankbar.
Was willst Du denn genau wissen? - Was Du zu tun ist, ist doch klar:
*AD-Wandler Spec lesen,
*Ansteuerschema mit VHDL erzeugen
*Bits sammeln und zu Wort zusammenbauen
Oder hängt es am Vergleich?
Sind Deine Spannungen stabil?
wenn nicht, sind sie in Phase, haben sie dieselbe Frequenz?
Danke erstmal für die Antwort
Momentan hänge ich noch daran ein Ansteuerschema in VHDL zu erstellen.
Hab die Spec vom AD-Wandler durchgelesen, aber bisher hab ich nur nen
Eingang und die 12 Pins für die jeweiligen Bits als Ausgang, sowie die
Möglichkeit den CLK zu bestimmen bzw. den auf der Platine vorhanden osci
zu nutzen.
Bin nicht ganz sicher ob das alles ist, was ich brauche
Die Spannungen hab ich nicht real, soll aber zwischen 0 und 5 Volt
liegen.
Eslon schrieb:> Leider bin ich in Sachen VHDL nicht so fit
Geht das ein wenig konkreter? Weißt du, wie du den ADC z.B. mit einem uC
ansteuern würdest? Weißt du, wie der ADC überhaupt angesteuert werden
will?
oder subrahieren und die Differenz mit comperatoren betrachten ob in
einem bestimmten bereich bzw. vorzeichen und ne weitere Statemachine um
die Regelung zu machen oder nen kleinen Soft-DSP aus nen paar
DSP-Blöcken.
Lothar Miller schrieb:> Eslon schrieb:>> Leider bin ich in Sachen VHDL nicht so fit> Geht das ein wenig konkreter? Weißt du, wie du den ADC z.B. mit einem uC> ansteuern würdest? Weißt du, wie der ADC überhaupt angesteuert werden> will?
Ähm nein, da liegt ja das Problem, ich weiß nicht wie ich den ADC
ansteuern muss, damit ich dann die Bits entsprechend dem Eingangssignal
rausbekomme.
Dennis Lindner schrieb:> Ähm nein, da liegt ja das Problem, ich weiß nicht wie ich den ADC> ansteuern muss, damit ich dann die Bits entsprechend dem Eingangssignal> rausbekomme.
Der AD9433 muss nicht angesteuert werden. Wenn der eine Clock auf
Encode/!Encode (differentieller Eingang!) hat, liefert er brav Samples
synchron zur Clock ab.
Eslon schrieb:> AD9433 (12bit, 125-MSPS)
Wenn du den mit 125-MSPS ansteuern möchtest, dann ist das eigentliche
"Problem" sicher nicht die Ansteuerung des ADCs sondern das erstellen
der Timing Constraints (-> siehe TimeQuest Timing Analyzer) damit deine
digitalisierten Daten auch korrekt im FPGA ankommen.
Also im Prinzip ist es genau das, was du brauchts:
Einen Clock, der den ADC taktet, zwei 12 bit breite Eingangsregister in
deinem FPGA (-> in VHDL realisiert oder mit Hilfe des Megawizzards) und
eben die richtigen Timing Constraints, damit bei der geswchwindigkeit
auch alles zuverlässig funktioniert.
Wenn es ein "Stratix DSP Board" ist, dann gibt es doch sicherlich
Beispielaplikationen, wie die ADCs angesprochen werden. Dort sind
bestimmt auch schon die Timing Constraint Files mit drin (-> nach *.sdc
suchen).
Gruß,
Maik
Es handelt sich um das Strarix EP1S25 DSP Development Board, hab auch
schon nach entsprechenden Beispielapplikationen gesucht wo ein ADC oder
beide beteiligt sind, aber leider nichts gefunden.
Danke schon mal für die Ratschläge.
Ahhh, es ist also ein Stratix der ersten Generation. Damals (als das
Board wahrscheinlich gebaut wurde) war es mit dem TimeQuest noch nicht
so weit. Da hat man nur den alten Timing Analyzer in Quartus benutzt
(weiß gerade nicht mehr wie der hieß).
Habe gerade diesen Link im Altera Forum gefunden. Vielleicht hilft das
ja:
http://www.alteraforum.com/forum/showthread.php?t=25337
Gruß,
Maik
Da gibts doch nix großartig mit Beispielen zu erklären? Die 12 Bit vom
ADC kommen am FPGA als Vektor an und nach einem Cast auf signed oder
unsigned kannst du den Wert mit einem anderen signed/unsigned
vergleichen. Was ist daran kompliziert?
Setzt voraus, dass die Daten rechtzeitig vor der steigenden Flanke des
CLK anliegen. Geht natürlich auch kompakter, hab aber extra mal den Cast
einzeln gemacht, damit man als Anfänger eher sieht, was passiert.
Vielen Dank,
funktioniert schonmal, auch wenn der Vergleich noch nicht ganz stimmig
ist, aber da muss ich erstma schaun, was die ADCs genau ausspucken.
Aber nichtmehr heute ;)
Also ansich funktioniert das ganze schonmal, nur leider sind die ADCs
wohl nicht so ganz auf dem gleichen Niveau, wenn an meiden ADCs kein
Signal anliegt, müssten sie ja eigentlich das gleiche ausspucken, das
tuen sie aber wohl nicht, bin jetzt nicht sicher woran das liegen kann
oder wie ich die auf ein gleiches niveau bringen kann.
Du solltest erst mal schauen und verfizieren, ob dein timing passt und
die Wandler konsistene Daten ausgeben, die nicht an irgendwelchen
Übernahmeproblemen leiden :-)
Dann legst Du mal eine Rampe an und schaust, ob kontinuierliche Signale
rauskommen.
Wenn Du sicher bist, dass das digital richtig arbeitet, bleibt die
Analogkorrektur:
> nur leider sind die ADCs wohl nicht so ganz auf dem gleichen Niveau
Du brauchst eine gain-offset-Korrektur und bei hohen Frequenzen auch
eine Phasenkorrektur.
Kriterieum : Kanal A - Kanal B ist praktisch immer 0, egal für welche
Frequenzen (Wenn beide dasselbe Signal "sehen").
Jeder ADC hat Rauschen, Offset und andere Störfaktoren. Bei offenen
Eingängen erst recht. Gleiches Niveau bekommst du damit niemals auf Bit
genau hin. Du müsstest dann eine Schranke implementieren, wenn
meinetwegen +-10 LSB, dann gleich oder sowas...
Danke für die Tipps, werd mal schauen ob ich mir die Werte, die die ADCs
ausspucken mal anschauen kann, dann kann ich auch ma sehen wie groß da
der Unterschied ist. Und die Timings werde ich wohl auch noch prüfen.
Dennis Lindner schrieb:> Wie kann ich das in VHDL vernünftig realisieren +-10 LSB von meinem> 12bit Signal zu rechnen?
Wie meinst du das?
RECHNEN an sich ist in VHDL recht einfach: man nimmt die Operatoren +, -
und *. Bei / wirds dann ein wenig trickreicher...
Das war mir soweit schon klar, also kann ich direkt binär rechnen?
Und meinem signed(Signal) + bzw. - 1010 rechnen.
Momentan hab ich noch das Problem, dass mir meine 7-seg-Anzeige nicht
richtig anzeigt, welcher ADC den größeren Wert hat, irgendwie leuchten
beide recht schwach und je nachdem was ich an die Eingänge hänge mal
stärker mal schwächer.
Oder funktionier dieser größer bzw. kleiner Vergleich nicht richtig?
Wenn ich das richtig verstanden habe sind die 12bit die aus den ADC
kommen ja im Zweierkomplement, kann VHDL damit richtig umgehen oder muss
ich da noch was ändern.
Dennis Lindner schrieb:> Wie kann ich das in VHDL vernünftig realisieren +-10 LSB von meinem> 12bit Signal zu rechnen?
Du meinst "digit" - es gibt nur 1 einziges LSB, das man weglassen
könnte.
Aber sag mal lieber Dennis: Wie alt bist Du? Ist das nicht wieder irgend
so eine Schulaufgabe?
Dennis Lindner schrieb:> Oder funktionier dieser größer bzw. kleiner Vergleich nicht richtig?> Wenn ich das richtig verstanden habe sind die 12bit die aus den ADC> kommen ja im Zweierkomplement, kann VHDL damit richtig umgehen oder muss> ich da noch was ändern.
Das funktioniert problemlos.
Allerdings mußt du an den Grenzen aufpassen, denn
"0111_1111_1111" (=max positiv) PLUS "0000_0000_1010" (=10) gibt
"1000_000_1001"
Und das ist ein Dezimalwert von -2039!!
Das ist aber kein Problem von VHDL, sondern hängt mit der
Zweierkomplementdarstellung an sich zusammen.
Gerald Hellinghaus schrieb:> Ist das nicht wieder irgend so eine Schulaufgabe?
Klar doch. Ferien sind zu Ende.
Danke erstmal für die vielen Antworten !
Und nein mit Schule hat es nix zu tun, hätt ich VHDL in der Schule
gelernt, würde mir das ganze hier jetzt sicher einfacher fallen :D
Dennis Lindner schrieb:> Noch garnicht, ist aber in Planung
Aha. Und wie siehst Du dann, das die verschieden sind? Über drei LEDs
(kleiner, gleich, größer)?
Duke
P.S.: Hast Du Chipscope (oder was ähnliches) zur Verfügung?
Ich habe mir eine Ausgabe auf die 7-Segment-Anzeige gelegt, der Fall
dass sie gleich sind hab ich noch nicht drin, da dieser momentan noch
nicht eintritt, da die ADCs wohl kaum auf 1 Digit genau gleich sind.
Ich glaube in Quartus gibts die Möglichkeit sich die Signale, bzw. In-
und Outputs anzusehen, hab das aber bisher noch nicht zum Laufen
bekommen.
Mach' dir mal mit signal tap eine Datenausgabe beider Kanäle und
schreibe sie über Export in eine Datei. Die kann man dann mit Excel
aufmachen und ansehen. Dann bekommst Du auch einen Eindruck vom Rauschen
Das versuch ich gerade, Problem ist im SignalTab momentan mein Trigger,
wollte eigentlich nicht einen der ADC Ausgänge als Trigger nehmen, aber
anders macht er das momentan nicht.
Und dann sieht es so aus, als wenn alle Digits springen, also nicht
kontinuierlich auf 1 oder 0 liegen. Vorallem die vorderen Digits sollten
doch konstant bei 1 oder 0 liegen, denn meine Eingangssignale sind auch
konstant.
Dennis Lindner schrieb:> Vorallem die vorderen Digits sollten> doch konstant bei 1 oder 0 liegen, denn meine Eingangssignale sind auch> konstant.
Ohne zu wissen, wie deine analoge Eingangsstufe vor dem ADC aussieht,
und was da angeschlossen ist, kann man das nicht mit Bestimmtheit sagen.
Ich hab die Daten von SignalTab nicht in Excel bekommen, ging nur als
txt.
Da sieht man ganz gut wie die Bits von den ADCs auf 0 springen.
Ich weiß nicht woran das liegt ...
Dennis Lindner schrieb:> Also momentan sind da etwa 1 und 1,4 Volt in Form von Batterien dran.
Ich würde sagen, der ADC sieht in beiden Fällen den Wert 0. Nur ist auf
dem einen Kanal ADC2 ein wenig mehr Rauschen drauf...
Was bekommst du, wenn du die Eingänge kurzschließt? Welche Spannung
liegt tatsächlich an den Eingangspins vom ADC an (hier reicht ein
Multimeter)?
Hmm wenn ihr sagt, dass die Werte um 0 herum schwanken, dann hab ich die
aber wohl verkehrt herum gelesen, denn z.B ADC_1[0] ist mein LSB.
Jetzt blick ich nimmer durch
Außerdem sollten die Werte garnicht um 0 liegen hab doch min. 1 Volt an
jedem Eingang hängen, genau kann ich es gerade nicht sagen hab gerade
kein Multimeter zur Hand.
Dennis Lindner schrieb:> denn z.B ADC_1[0] ist mein LSB.
Ja, das sehe ich auch so.
Und von +1 = 0000_0000_0001
über 0 = 0000_0000_0000
nach -1 = 1111_1111_1111
ist es nicht weit.
> Außerdem sollten die Werte garnicht um 0 liegen hab doch min. 1 Volt an> jedem Eingang hängen, genau kann ich es gerade nicht sagen hab gerade> kein Multimeter zur Hand.
Ich meine damit, dass du direkt an den DIFFERENTIELLEN ADC-Eingängen des
ADCs messen solltest. Dir ist schon klar, dass du da ZWISCHEN den
ADC-Pins messen mußt? Wie hast du deine ca. 1V da eigentlich
angeschlossen?
Ok danke, jetzt hab ichs mit dem Zweierkomplement.
Wie meinst du das mit dem angeschlossen, hab an die entsprechenden
Eingänge auf der Platine jeweils ne Batterie rangehängt, damit ich keine
offenen Eingänge habe.
Mal schaun ob ich da rankomme um an den Pins der Eingänge zu messen, du
meinst doch direkt am ADC Chip oder? Dann brauch ich ne sehr kleine
Spitze zum messen.
Dennis Lindner schrieb:> du meinst doch direkt am ADC Chip oder?
Ja.
> Dann brauch ich ne sehr kleine Spitze zum messen.
Ja.
Und: miss zwischen den beiden Eingangspins und jeweils vom Eingangspin
gegen Masse. Insgesamt solltest du also 3 Messwerte pro Kanal anbieten
können. Klar ist das dann redundant, aber so kann gleich mal die
Qualität der Messung kontrolliert werden... ;-)
So wie es aussieht funktioniert der ADC nicht mit Gleichstrom oO
Dann stimmen aber zumindest die Werte, die ich von den ADCs bekomme,
weil bisher war ja quasi 0 Volt dran :)
Christian R. schrieb:> Vor dem ADC sind sicher 2 Kondensatoren im Signalzweig. Gibts irgendwo> einen Schaltplan von dem Board?
Wenn ich mich jetzt nicht irre sind an den Eingängen der ADC 2 Trafos
geschaltet. Ein kompletten Schaltplan von dem Board hab ich noch nicht
gefunden.
Dennis Lindner schrieb:> So wie es aussieht funktioniert der ADC nicht mit Gleichstrom oO
Der AD9433 ist für HF-Signalverarbeitung gedacht, und nicht um poppelige
Gleichspannungen zu messen. Selbst für Audio ist er denkbar ungeeignet.
Von Wald und Wiesen ADCs unterscheidet er sich neben der hohen
Samplingfrequenz durch die differentiellen Eingänge, d.h. er misst die
Differenz zwsichen dem Plus- und dem Minuseingang.
Dennis Lindner schrieb:> Wenn ich mich jetzt nicht irre sind an den Eingängen der ADC 2 Trafos> geschaltet.
Das sind mit Sicherheit Baluns um ein single ended HF Signal in ein
symmetrisches Signal für den differentiellen Eingang des ADCs zu
konvertieren.
Lattice User schrieb:> Der AD9433 ist für HF-Signalverarbeitung gedacht, und nicht um poppelige>> Gleichspannungen zu messen.
Dann glaube ich aber nicht, dass dort Trafos am Eingang sitzen.
kenn mich mit FPGAs noch nicht so aus.
Komme aus der 80c51 Ecke.
Ich würde gerne einen simplen AD-Wandler wir z.B. in einem 89c51
implentiert ist, per FPGA nachbilden.
Brauche ich dazu einen ext. Baustein (z.B. AD9433) wie oben erwähnt?
Habe folgendes gefunden:
http://www.xilinx.com/support/documentation/ip_documentation/xps_deltasigma_adc.pdf
Abei für den Einstieg alles andere als schnell zu begreifen.
Gibts nicht irgend ein Buch / pdf Xilinx FPGAs for Dummies oder so?
rookie schrieb:> Ich würde gerne einen simplen AD-Wandler wir z.B. in einem 89c51> implentiert ist, per FPGA nachbilden.
Das ist jetzt leider eine komplett unterschiedliche Technologie.
AD-Wandler per sukzessiver Approximation sind auf uC (auch dem 8051)
über Ladungsteiler realisiert: ein Eingangskondensator wird aufgeladen
und dann dessen Ladung über eine Kondensatorkette auf die einzelnen Bits
verteilt. So eine Kondensatorkette findest du nicht als Bauteil auf
einem FPGA (Ausnahmen bestätigen hier bestenfalls die Regel).
Ich würde dir vorschlagen, mit einem EVAL-Board erste Schritte in der
Lauflicht-Fraktion vorzunehmen. Und dabei im Kopf behalten: ein FPGA hat
nur Flipflops und Gatter. Damit muss sich alles aufbauen lassen, was du
aufbauen willst...