AD-Wandler mit VHDL verwenden

Gast #2301333
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.
#2307587
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.
Gast #2308977
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.
#2309065
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.
Gast #2309082
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.
Gast #2309170
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
Gast #2309216
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
#2309319
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.
#2313196
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.
Persönliche Seite #2313215
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").
#2314781
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.
Moderator (Firma: Titel) Persönliche Seite #2314804
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.
#2314939
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.
Gast #2314982
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
#2315171
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.
Moderator (Firma: Titel) Persönliche Seite #2315356
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)?
#2315387
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.
Moderator (Firma: Titel) Persönliche Seite #2315402
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?
#2315420
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.
Moderator (Firma: Titel) Persönliche Seite #2315447
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...  ;-)
Gast #2315822
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.
Gast #2515048
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?
Moderator (Firma: Titel) Persönliche Seite #2515144
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren