Forum: FPGA, VHDL & Co. Brauche Hilfe ADC->DAC


von Markus (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

arbeite mit einem Entwicklungsboard von Altera.

Darauf ist ein AD 9433 ( 14 BIT ) und DA 904(DAC 12 BIT) verbaut.

-----------------------------------------------------------------------
In einem Beitrag Morin dies so oder so ähnlich geschrieben:

Der ADC  liefert das Format signed: das Bitmuster 100..0 stellt die 
"negativste", d.h.
kleinste Zahl dar und entspricht der min. Eingangsspannung des ADC. Das
Bitmuster 011...1 stellt die "positivste", d.h. größte Zahl dar und
entspricht der max. Eingangsspannung des ADC.

Der DAC erwartet bis auf das MSB, das gleiche Format.
Also reicht es, das oberste Bit zu negieren:

Ausgang (11 downto 0) <= (not Eingang (11)) & (Eingang (10 downto 0));
-----------------------------------------------------------------

Wenn ich das msb negiere und gleich wieder ausgebe, bekomme ich den 
Sinus richtig dargestellt.
Aber wenn ich in einem  Prozess diese negation durchführe, und und durch 
andere Register schiebe(unverändert)  , nicht.
Sinus sieht  aus wie ein großes M.


Wenn ich das Bit 10 noch negiere, bekomme ich den Sinus richtig herum.
Ausgang (11 downto 0) <= (not Eingang (11)) & not (Eingang (10)) & .....


Bin über jede geäußerte Vermutung glücklich.



VIELEN DANK

Markus

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


Lesenswert?

Leider ist deiner Beschreibung nicht zu entnehmen, wie die 14 Bit vom 
ADC auf die 12 Bit vom DAC abgebildet werden...

> Also reicht es, das oberste Bit zu negieren:
> Ausgang (11 downto 0) <= (not Eingang (11)) & (Eingang (10 downto 0));
Ist das MSB Bit 13 vom ADC an den Eingang 11 angeschlossen?

> Wenn ich das msb negiere und gleich wieder ausgebe, bekomme ich den
> Sinus richtig dargestellt.
> Ausgang (11 downto 0) <= (not Eingang (11)) & (Eingang (10 downto 0));
> :
> Wenn ich das Bit 10 noch negiere, bekomme ich den Sinus richtig herum.
> Ausgang (11 downto 0) <= (not Eingang (11)) & not (Eingang (10)) & .....
Wie denn, was denn, wo denn?
Was gilt denn jetzt?

von gonzo (Gast)


Lesenswert?

Wie wäre es, wenn Du auf den ADC-Wert einfach 2048 addierst, den 
Überlauf ignorierst und die obersten 12 der 14 Bit auf den DAC gibst?

von Nephilim (Gast)


Lesenswert?

aus meiner erfahrung heraus würde ich sagen, dass der ADC die 
digitalisierten werte als zweierkomplement ausgibt. dadurch ist nicht 
nur das MSB fürs vorzeichen zuständig. weitere infos zum zweikomplement 
kann man z.B. auf wikipedia finden.

also ein einfaches negieren des MSB hilft nicht wirklich.

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


Lesenswert?

> also ein einfaches negieren des MSB hilft nicht wirklich.
Doch, das reicht aus ;-)
ADC   Kpl MSB    Spannung
0111    1111        7
0110    1110        6
0101    1101        5
0100    1100        4
0011    1011        3
0010    1010        2
0001    1001        1
0000    1000        0
1111    0111       -1
1110    0110       -2
1101    0101       -3
1100    0100       -4
1011    0011       -5
1010    0010       -6
1001    0001       -7
1000    0000       -8

> dadurch ist nicht nur das MSB fürs vorzeichen zuständig.
Die Werte sollen ja nicht invertiert werden, sondern nur einen 
Offset erhalten. Und dafür reicht das erste Bit aus.

von Markus (Gast)


Lesenswert?

Hallo lkmiller,

SORRY dass ich mich erst jetzt wieder melde.

>Ist das MSB Bit 13 vom ADC an den Eingang 11 angeschlossen?



Ausgang (13 downto 0) <= (not Eingang (11)) & (Eingang (10 downto 0)) & 
"11";
.
Ist dass so richtig?


Die 12 Bit durchlaufen Filter .

Drehe ich am Anfang oder am Ende der Verarbeitung das MSB, bevor es über 
den DA raus geht?



DANK

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


Lesenswert?

> Die 12 Bit durchlaufen Filter . Drehe ich am Anfang oder am Ende der
> Verarbeitung das MSB, bevor es über den DA raus geht?
Das kommt auf die Filter drauf an...
Wenn die mit signed Werten rechnen, dann kommt der Offset erst nach der 
Filterung.

von Markus (Gast)


Lesenswert?

>Das kommt auf die Filter drauf an...


Das sind Interpolationsfilter.

Nur 3 Filterkoefizienten.

1/4 1/2 1/4


Also, nur 1 oder 2 mal schieben,  dann addieren.

Ich bin überfragt?

von Markus (Gast)


Lesenswert?

>Wenn die mit signed Werten rechnen, dann kommt der Offset erst nach der
>Filterung.


Ich wollte das MSB gleich drehen.

Den Filter hab ich selbst geschrieben.

Die Vectoren sind vom Typ STD_LOGIC_VECTOR

Soll ich SIGNED oder UNSIGNED verwenden?

DANKE

von Markus (Gast)


Lesenswert?

hab jetzt meine Rechnungen auf signed geändert und das MSB erst dann 
gedreht.

Jetzt bekomme ich das erwartete Signal verrauscht aber es ist mal da.


 schreibt bitte was Ihr denkt.



VIELEN DANK

ich will nicht dumm sterben :)

von Duke Scarring (Gast)


Lesenswert?

@Markus:
>schreibt bitte was Ihr denkt.

Ich würde mir eine ordentliche Testbench dazu schreiben. Für den ADC und 
den DAC kommen VHDL-Modelle hin, die nur als Datenquelle bzw. -senke 
dienen.

Damit kannst Du prüfen, ob Dein Code wie erwartet funktioniert. Im 
nächsten Schritt kannst Du prüfen (LogicAnalyzer) ob die Input-Daten vom 
ADC das erwartete Format haben. Außerdem würde ich am DAC testweise eine 
Rampe oder eine andere bekannte Signalform ausgeben.

Duke

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.