Forum: FPGA, VHDL & Co. AD-Wandler mit VHDL verwenden


von Eslon (Gast)


Lesenswert?

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.

von J. S. (engineer) Benutzerseite


Lesenswert?

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?

von Dennis L. (eslon)


Lesenswert?

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.

von ralf (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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?

von uwe (Gast)


Lesenswert?

Statemachine die die Werte in ein Register Schreibt Comperator dran 
Größer kleiner und gleich Ausgängen usw.

von uwe (Gast)


Lesenswert?

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.

von Dennis L. (eslon)


Lesenswert?

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.

von Lattice User (Gast)


Lesenswert?

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.

von Kiamur (Gast)


Lesenswert?

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

von Dennis L. (eslon)


Lesenswert?

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.

von Kiamur (Gast)


Lesenswert?

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

von Christian R. (supachris)


Lesenswert?

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?

von Kiamur (Gast)


Lesenswert?

Naja, ich denke, wenn man Anfänger ist, dann sucht man halt auch für die 
"einfachsten" Dinge nach Beispielen . . . Ist doch auch okay . . .

von Christian R. (supachris)


Lesenswert?

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.

von J. S. (engineer) Benutzerseite


Lesenswert?

> Da hat man nur den alten Timing Analyzer in Quartus benutzt
> (weiß gerade nicht mehr wie der hieß).
Er hiess: "classical timing analyzer" :-)

von Dennis L. (eslon)


Lesenswert?

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 ;)

von Dennis L. (eslon)


Lesenswert?

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.

von J. S. (engineer) Benutzerseite


Lesenswert?

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").

von Christian R. (supachris)


Lesenswert?

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...

von Dennis L. (eslon)


Lesenswert?

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.

von Dennis L. (eslon)


Lesenswert?

Wie kann ich das in VHDL vernünftig realisieren +-10 LSB von meinem 
12bit Signal zu rechnen?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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...

von Dennis L. (eslon)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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);

von H. G. (Gast)


Lesenswert?

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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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.

von Dennis L. (eslon)


Lesenswert?

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

von Duke Scarring (Gast)


Lesenswert?

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

von Dennis L. (eslon)


Lesenswert?

Duke Scarring schrieb:
> Wie schaust Du Dir denn die ADC-Werte an?

Noch garnicht, ist aber in Planung

von Duke Scarring (Gast)


Lesenswert?

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?

von Dennis L. (eslon)


Lesenswert?

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.

von H. G. (Gast)


Lesenswert?

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

von Dennis L. (eslon)


Lesenswert?

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.

von Christian R. (supachris)


Lesenswert?

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.

von Dennis L. (eslon)


Lesenswert?

Also momentan sind da etwa 1 und 1,4 Volt in Form von Batterien dran.

von Dennis L. (eslon)


Angehängte Dateien:

Lesenswert?

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 ...

von Christian R. (supachris)


Lesenswert?

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 ;)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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)?

von Dennis L. (eslon)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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?

von Dennis L. (eslon)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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...  ;-)

von Dennis L. (eslon)


Lesenswert?

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 :)

von Christian R. (supachris)


Lesenswert?

Vor dem ADC sind sicher 2 Kondensatoren im Signalzweig. Gibts irgendwo 
einen Schaltplan von dem Board?

von Unbekannter (Gast)


Lesenswert?

Das wird ja ein Grossprojekt, bis der Mann seine Wandlerdaten auslesen 
kann. "Dennis 21" sozusagen.

von Dennis L. (eslon)


Lesenswert?

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.

von Lattice User (Gast)


Lesenswert?

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.

von Lattice User (Gast)


Lesenswert?

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.

von Schröckel (Gast)


Lesenswert?

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.

von rookie (Gast)


Lesenswert?

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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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...

von rookie (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.