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
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...
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; |
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));
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.