Forum: FPGA, VHDL & Co. Vektor 2er / zweier Komplement


von graf zahl (Gast)


Lesenswert?

Hallo Forum,

VHDL ist nicht mein Lieblingsgebiet, daher bräuchte ich einen Ratschlag.

Ich habe einen Filter (MATLAB HDL Coder) der einen 14bit signed Eingang 
(std_logic_vector) und einen 12Bit signed Ausgang (std_logic_vector) 
hat. Der ADC liefert tatsächlich Daten im 2er Komplement. Der DAC 
erwartet jedoch kein 2er Komplement sondern quasi unsigned. Nun die 
Frage: Wie gestaltet man am geschicktesten die Umwandlung? Wünschenswert 
wäre (aus verschiedenen Gründen), wenn dies hinter dem Filter geschieht 
(also nicht intern).

Habe selber schon hier und da geschaut, aber irgendwie habe ich das 
Gefühl dass ich zu verquer denke...reicht etwa eine to_unsigned 
Wandlung? Oder doch "händisch" mit 'invertieren + 1'?

  http://www.synthworks.com/papers/vhdl_math_tricks_mapld_2003.pdf

von Mark (Gast)


Lesenswert?

Hallo,

welches Format erwartet denn Dein DAC? Oder gib gleich den Typ an.
Ich nehme an, Du musst einfach nur einen Offset addieren,
dann sollte es passen, aber ohne Datenblatt kann man vieles
annehmen...

von graf zahl (Gast)


Lesenswert?

Statt des 2er Komplements die 'lineare'. Habe es nun händisch gemacht, 
nachdem ich ein wenig mit to_unsigned etc. rumgespielt habe (hat alles 
nicht das gewünschte Ergebnis gebracht - es scheint mir als wären es nur 
Synthese"direktiven").

1
  signal Wert:       std_logic_vector(11 downto 0);
2
  signal tempSIGNAL: std_logic_vector(11 downto 0);
3
  
4
  tempSIGNAL <= (  Wert(11) & not( Wert(10 downto 0) )  ) + 1;

von Morin (Gast)


Lesenswert?

Servus! Ich kann hier nur einen Denkanstoß geben, da ich mir beim besten 
Willen nicht vorstellen kann, wieso ein Wandler jemals mit signed-Werten 
arbeiten würde. Deshalb mache ich folgende Annahme, die du unbedingt 
verifizieren solltest:

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

- DAC (unsigned): Das Bitmuster 000...0 stellt die kleinste Zahl dar und 
entspricht der min. Ausgangsspannung des DAC. Das Bitmuster 111...1 
stellt die größte Zahl dar und entspricht der max. Ausgangsspannung des 
DAC.

Nochmals: Das ist eine VERMUTUNG! da ich mir beim besten Willen nix 
anderes vorstellen kann. Falls diese Vermutung stimmt, hilft folgender 
Trick (wobei die unterschiedlichen Bit-zahlen jetzt mal ignoriert werden 
und nur die Umwandlung nach dem Filter von signed->unsigned in 12 Bit 
beschrieben wird):

Eingang des Zahlenkonverters: Die Folge 1000...0, 1000...1, ..., 
011...10, 011...11 entspricht steigenden Spannungen
Ausgang des Zahlenkonverters: Die Folge 000...0, 000...1, ..., 111...10, 
111...11 entspricht steigenden Spannungen

Also reicht es, das oberste Bit zu negieren:

ausgang (11 downto 0) <= (not eingang (11)) & (eingang (10 downto 0));

von graf zahl (Gast)


Angehängte Dateien:

Lesenswert?

Nun arbeitet der Wandler leider mit signed Werten (siehe Anhang). Ist 
natürlich alles nur eine reine Interpretationssache. Danke für die 
Denkanstöße, es läuft jedoch bereits  ;)

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.