Vektor 2er / zweier Komplement

Gast #756964
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
Gast #757734
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...
Gast #757863
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;
Gast #758683
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));

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