Forum: FPGA, VHDL & Co. DA Wandlung mit Spartan 3AN Board


von Hans-werner M. (hanswerner)


Angehängte Dateien:

Lesenswert?

Ich hänge bei der Ansteuerung des DA-Wandlers des Spartan 3AN Boards 
fest.
Trotz fehlerfreieer Synthese und Simulation zeigt mein Oszilloskope 
leider nicht das erwartete Ergebnis. Ich habe versucht eine 
Dreieeckssignal auszugeben. Das Ergebnis ist aber eine trapezförmige 
Spannung. Warum bleibt die Spannung solange auf dem Maximalwert ? Der 
Spannungsverlauf schwingt zudem ein wenig hin und her. Die Oberwellen 
entstehen wahrscheinlich durch die DA-Wandler selbst. Eine Einkoppelung 
konnte ich nicht feststellen.
Das ganze besteht aus zwei Prozessen. Der eine zählt einen Zähler rauf 
und wieder runter. Der andere steuert über den SPI-Bus den DA-Wandler.
Es wird das 24 Bit Format für die Ansteuerung des DA-Wandlers verwendet. 
Ausgegeben wird ein 8 Bit Wert.
Wann muß bzw. sollte man das 24 Bit Format und wann das 32 Bit Format 
verwenden ? Ich habe leider bur ein Beispiel für das 24 Bit Format 
gefunden.

von Michael (Gast)


Lesenswert?

Hast Du vielleicht einen Screenshot für uns?

Kannst Du den analogen Ausgang und die SPI/I2C/I2S oder was auch immer 
Daten mit anzeigen?

von Hans-werner M. (hanswerner)


Lesenswert?

Bild kommt am Montag. Habe momentan das Oszi nicht zur Hand.

von Hans-werner M. (hanswerner)


Angehängte Dateien:

Lesenswert?

So, hier noch das Bild. Hoffe die Einstellungen sind zu erkennen.

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


Lesenswert?

Ich habe den Verdacht, du machst da was mit dem range falsch :-o

Aus deinem Code:
1
  signal dacData : unsigned(23 downto 0);
2
  signal dacCounter : integer range dacData'range;

Daraus macht die Synthese erst mal:
1
  signal dacCounter : integer range 23 downto 0;
Willst du das?
Das betrifft auch die ganzen Zuweisungen...

Sollte das nicht eher so heißen:
1
  signal dacData : unsigned(23 downto 0);
2
  signal dacCounter : integer range 0 to 2**(dacData'left+1)-1;


Zu deinem Bild:
Irgendwie geht die Spannung ziemlich zackig auf 3,3V Vref, dann gibts 
Probleme. Mir scheint da was mit dem Zählbereich im Argen zu liegen...

von Hans-Werner (Gast)


Lesenswert?

Daraus macht die Synthese erst mal:
signal dacCounter : integer range 23 downto 0;

Richtig.

Willst du das?

Ja.

Sollte das nicht eher so heißen:
signal dacData : unsigned(23 downto 0);
signal dacCounter : integer range 0 to 2**(dacData'left+1)-1;

Nein. dacCounter muß nur über die 24Bits der Ausgabe an den DAC zählen. 
Es werden kein 2 Hoch 24 Bits an den DAC ausgegeben.

Irgendwie geht die Spannung ziemlich zackig auf 3,3V Vref, dann gibts
Probleme.

Zackig ist richtig. Sollte halt stufenweise auf die Maximalspannung 
gehen und dann wieder herunter. Halt eine Dreiecksspannung. Aber warum 
bleibt die Spannung eine ganze Weile auf dem Maximalwert ?

von Duke Scarring (Gast)


Lesenswert?

@Hans-Werner:

Für die Simulation wäre ein SPI-Empfänger-Modell ganz gut (welches nicht 
synthetisierbar sein muß). Damit kannst Du Dir die gesendeten Daten in 
der Simulation anschauen (als Liste oder Waveform) und den Fehler 
eingrenzen.

Duke

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


Angehängte Dateien:

Lesenswert?

>> Willst du das?
> Ja.
Na gut, mit dem richtigen Editor geöffnet und die Zeilenumbrüche korrekt 
eingestellt, sieht man das besser. Das ist soweit also korrekt...  :-/


Eigentlich sieht auch die Simulation erträglich aus...
Da sollte schon was gehen :-/
Ein Hardwareproblem? Passiert auf allen 4 Kanälen das selbe?

von Hans-Werner (Gast)


Lesenswert?

Hallo Duke,

interessante Idee. Verstehe ich nur leider nicht. Was soll denn das 
machen bzw. können ? Wie soll denn das ausschauen ?

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


Lesenswert?

> Was soll denn das machen bzw. können ? Wie soll denn das ausschauen ?
Du baust in VHDL die Schnittstelle des DAC (aus dem Datenblatt) nach, 
und kontrollierst, ob die Daten dort richtig ankommen...

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


Angehängte Dateien:

Lesenswert?

Im einfachsten Fall so etwa:
1
   :
2
   :
3
   --Inputs
4
   signal CLK_50MHZ : std_logic := '0';
5
   signal btn_south : std_logic := '1';
6
7
   --Outputs
8
   signal SPI_SCK : std_logic;
9
   signal SPI_MOSI : std_logic;
10
   signal DAC_CLR : std_logic;
11
   signal DAC_CS : std_logic;
12
13
   signal sr : std_logic_vector(23 downto 0);
14
   signal dacout : std_logic_vector(7 downto 0);
15
   
16
   constant CLK_50MHz_period : time := 20 ns;
17
BEGIN
18
   uut: .....
19
20
   CLK_50MHz <= not CLK_50MHz after CLK_50MHz_period/2;
21
22
   btn_south <= '0' after 100 ns;
23
   
24
   process (SPI_SCK,SPI_MOSI,DAC_CS)
25
   begin
26
      if (DAC_CS = '1') then
27
         dacout <= sr(15 downto 8);
28
      else
29
         if rising_edge(SPI_SCK) then
30
             sr <= sr(22 downto 0) & SPI_MOSI;            
31
         end if;
32
      end if;
33
   end process;
34
35
END;
Man sieht im Screenshot, dass die Daten korrekt empfangen werden...

Man könnte jetzt natürlich noch die ganzen Timingverletzungen mit in die 
TB eintragen, aber weil du ein synchrones Design hast, wäre das 
Overkill.

von Duke Scarring (Gast)


Angehängte Dateien:

Lesenswert?

Übrigens, Modelsim kann Werte auch analog anzeigen (rechte Maustaste -> 
Format -> Analog).

Das macht sich bei DAC-Ausgaben, FIFO-Füllständen, Zählern, Instruction 
Counter etc. pp sehr gut.

Duke

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


Lesenswert?

> Übrigens, Modelsim kann Werte auch analog anzeigen ...
Das sieht man z.B. dort an der Waveform zur DDFS ganz hübsch:
http://www.lothar-miller.de/s9y/categories/31-DDFS

Aber aufpassen mit unsigned-Werten. Zur korrekten Anzeige muß bei 
"Radix" auf Unsigned umgestellt sein. Sonst werden Werte mit gesetztem 
MSB negativ angezeigt.

von Hans-werner M. (hanswerner)


Angehängte Dateien:

Lesenswert?

Habe noch mal gebastelt.
Hatte doch glatt die falschen Pins des Boards angeschlossen.
Wie war das noch ?
Schwarz ist Rot und Plus ist Minus ?
Nun sieht es an allen vier Kanälen so aus.
Scheint irgendwie "gedeckelt" bzw. limitiert.
Also noch kein Dreieck.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Vieleicht übersteuerst du den DA? Oder es liegt an der Hardware gibst du 
das Signal noch auf nen Verstärler/Koppelkondensator? Ich hatte so ein 
"abschneiden" auch mal weil ich am Koppelkondensator nur einen 
Widerstand nach GND nicht aber einen nach VCC dranhatte und sich so das 
Signal verschoben hat.

von Hans-werner M. (hanswerner)


Lesenswert?

Nö, nichts mit Kondensator oder Verstärker.
Übersteuern, wie denn ?
Wenn ich einen 12 Bit DA-Wandler habe, kann ich doch auch 12Bit 
ausgeben.
Einfach von den Pins des Boards auf den Oszi. Der Oszi Eingang hat 50 
Ohm.
Bin kein Meßtechniker.

von Maik F. (sabuty) Benutzerseite


Lesenswert?

Hans-werner M. schrieb:
> Der Oszi Eingang hat 50
> Ohm.

Schonmal mit 1MegOhm probiert? Vllt liefert der DA einfach nicht mehr 
den Strom an 50 Ohm für die Pegel oberhalb deiner "Begrenzung".

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


Lesenswert?

> Wenn ich einen 12 Bit DA-Wandler habe, kann ich doch auch 12Bit ausgeben.
Du schon, aber der ADC nicht ;-)

> Der Oszi Eingang hat 50 Ohm.
Autsch...
Der ADC hat einen maximalen Ausgangstrom von +-15mA. Also ist mit 50 Ohm 
bei 15 mA*50 Ohm = 0,75V Schluss. Passt genau zu deinem Bild.

> Bin kein Meßtechniker.
Ja, das sieht man...

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.