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.
Eigentlich brauchst Du nur einen Zähler und die Bits mit IF/CASE einzeln erzeugen lassen. Die Synthese baut Dir daraus schon die optimale Schaltung.
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?
Statemachine die die Werte in ein Register Schreibt Comperator dran Größer kleiner und gleich Ausgängen usw.
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?
Naja, ich denke, wenn man Anfänger ist, dann sucht man halt auch für die "einfachsten" Dinge nach Beispielen . . . Ist doch auch okay . . .
OK, dann vielleicht für den Start so:
1 | library IEEE; |
2 | use IEEE.STD_LOGIC_1164.ALL; |
3 | use IEEE.NUMERIC_STD.ALL; |
4 | |
5 | entity ADC_Compare is |
6 | Port ( CLK : in STD_LOGIC; |
7 | ADC_1 : in STD_LOGIC_VECTOR (11 downto 0); |
8 | ADC_2 : in STD_LOGIC_VECTOR (11 downto 0); |
9 | Greater : out STD_LOGIC; |
10 | Equal : out STD_LOGIC; |
11 | Less : out STD_LOGIC); |
12 | end ADC_Compare; |
13 | |
14 | architecture Behavioral of ADC_Compare is |
15 | |
16 | Signal ADC_1_Value, ADC_2_Value : signed(11 downto 0) := (others => '0'); |
17 | |
18 | begin
|
19 | |
20 | SampleValues : Process(CLK) |
21 | Begin
|
22 | if rising_edge(CLK)then |
23 | ADC_1_Value <= signed(ADC_1); |
24 | ADC_2_Value <= signed(ADC_2); |
25 | end if; |
26 | End Process; |
27 | |
28 | Greater <= '1' when ADC_1_Value > ADC_2_Value else '0'; |
29 | Equal <= '1' when ADC_1_Value = ADC_2_Value else '0'; |
30 | Less <= '1' when ADC_1_Value < ADC_2_Value else '0'; |
31 | |
32 | end Behavioral; |
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.
> Da hat man nur den alten Timing Analyzer in Quartus benutzt > (weiß gerade nicht mehr wie der hieß). Er hiess: "classical timing analyzer" :-)
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: > Und meinem signed(Signal) + bzw. - 1010 rechnen. Ja. Rechne einfach so:
1 | signal obererwert, untererwert : signed(adcwert'width); |
2 | |
3 | obererwert <= signed(adcwert) + to_signed(10,adcwert'width); |
4 | untererwert <= signed(adcwert) - to_signed(10,adcwert'width); |
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: > werd mal schauen ob ich mir die Werte, die die ADCs > ausspucken Wie schaust Du Dir denn die ADC-Werte an? Duke
Duke Scarring schrieb: > Wie schaust Du Dir denn die ADC-Werte an? Noch garnicht, ist aber in Planung
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.
Also momentan sind da etwa 1 und 1,4 Volt in Form von Batterien dran.
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 ...
Is doch ziemlich gut, die Signale schwanken nur ein paar Werte um 0 herum. Du solltest dir vielleicht mal das Zweierkomplement zu Gemüte führen ;)
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 :)
Vor dem ADC sind sicher 2 Kondensatoren im Signalzweig. Gibts irgendwo einen Schaltplan von dem Board?
Das wird ja ein Grossprojekt, bis der Mann seine Wandlerdaten auslesen kann. "Dennis 21" sozusagen.
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...
sukzessiver Approximation muss ja nich sein. ADC per Delta-Sigma-Modulation geht dass nich?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.