Hallo FPGA-User Kannst du dich noch an die Geschichte mit dem IIR erinnern? Frage: Wie schreibe ich das Ganze denn in VHDL um, wenn nur postitive Werte verarbeitet werden müssen? Also im Bereich von 0000000000 = 0,0 Volt ... 1111111111 = 5,0 Volt ? Der A/D-Wandler liefert nämlich nur Werte im Bereich von 0V bis 5V, welche dann als 10bit Werte bereitgestellt werden. Es gibt keine negativen Werte vom AD-Wandler - und der davor geschaltete Sensor liefert auch nur positive Spannnungen... Gruss, Thomas
den Wert 2.5 Volt vom Eingangswert subtrahieren und mit dem so signed Wert weiterrechenen. Nach ende der Berechung wieder das Resultat mit 2.5V normalisieren. Gruß Hagen
Habe jetzt leider keine Zeit mehr, das auszuprobieren, aber ich sage jetzt schon mal: Danke, Hagen!! Gruss, Thomas
Hallo Hagen Hallo FGPA-User Funktioniert irgendwie nicht. Habe "c" bei einer max. Amplitude von 250 noch mit 250 addiert. Damit krieg ich keine negativen Werte mehr, sondern nur positive Werte von 0 bis 500... ...bei yn aber dennoch negative Werte. Wo ist der Trick? Thomas
Hallo Thomas, mach es so, wie es Hagen schon beschrieben hat. Also Dein Eingangssignal vom A/D-Wandler ist zunächst 0V : 0x000 5V : 0x3FF Jetzt sollte es reichen, das MSB zu invertieren und dieses Signal einem signed-vektor zuzuweisen, z.B.: x_n <= (not ad_in(9)) & ad_in(8 downto 0); -- x_n : signed Damit wird : 0V = -512 5V = 511 Die Frage ist nun, was Du mit dem Ausgangssignal des IIR-Filters machen willst. Wenn hier eine Weiterverarbeitung ohne Vorzeichen einfacher ist, würde ich 512 addieren und auf unsigned oder std_logic_vector gehen. Vielleicht kannst Du aber auch direkt mit signed weiterarbeiten. Schreib mal, was danach passieren soll. Wichtig wäre noch, ein typisches A/D-Wandlersignal mal zu simulieren, damit man sieht, ob Einschwingvorgänge o.ä. Probleme machen. Du müsstest also entweder so einen Signal- verlauf mal durch eine Funktion nachbilden, oder per TEXTIO ein ext. File (z.B. Samples von einem Dig.-Scope) einlesen.
>>Jetzt sollte es reichen, das MSB zu invertieren >>und dieses Signal einem signed-vektor zuzuweisen, z.B.: >>x_n <= (not ad_in(9)) & ad_in(8 downto 0); -- x_n : signed >>Damit wird : >>0V = -512 >>5V = 511 kleine Fehlerteufel ;) 1.) um sicher zugehen, den Eingangswert mit (512 / 2) subtrahieren 2.) Damit wird 0.0V = -256 2.5V = 0 5.0V = +256 3.) den Ausgangswert dann wieder mit (512 / 2) addieren Aber mal ne persönliche Frage zurück: Das sind alles im Grunde enorm triviale Geschichten, will sagen das wenn man schon damit Probleme hat wird es wohl schwierig die richtigen Probleme die ansonsten noch mit VHDL, Schaltungen, Hardware etc. entstehen, zu lösen. Das soll jetzt keinerlei Kritik sein, und ich werde es immer begrüßen wenn man sich selber die Ziel so hoch steckt wie nur möglich. Ich meine aber auch das man die Ziele wiederum nicht zu hoch setzten sollte, das bringt nämlich nur Frust. Gruß Hagen
Hallo Hagen, dem 2.Teil schließe ich mich an, aber zum 1. Teil: Hab ich jetzt vielleicht 'n BlackOut oder wo liegt der Fehler, wenn ich das MSB des A/D-Wandlers invertiere um auf 2er Komplement zu gehen ?
Hallo FGPA-User (Hallo Hagen) Zunächst mal: Danke für euren Support!!! Ich stütze mich immer auf dein Design. Du schreibst dort in der Testbench: c <= integer(250.0 * sin(phase)); c ist vom Typ integer. Später konvertierst du: xn <= conv_signed(c, 10); ...und gibst xn "auf" den Filter. Muss man nicht schon in dieser Zeile: c <= integer(250.0 * sin(phase)); ...etwas verändern? Ich will ja auf deinen Code aufbauen. Deswegen tu ich mich mit dieser Zeile etwas schwer: x_n <= (not ad_in(9)) & ad_in(8 downto 0); -- x_n : signed Gruß, Thomas
@Hagen: Vielleicht hast du Recht. Bin kein Ingenieur und auch kein Techniker, sondern einfach nur ein stinknormaler Elektriker. Trotzdem will ich das "Problem" lösen. Für Euch einfach - für mich alles etwas schwieriger. Ihr versteht? Gruss, Thomas
@Thomas: oh ich verstehe dich ganz genau ! bin ja nicht anders, und
halte so eine Einstellung für gundsätzlich positiv. Allerdings musste
auch ich lernen, indem ich eben sozusagen versagte, das man die eigenen
Ziele auch von Zeit zu Zeit einfach zu hoch ansetzt.
@FPGA-User:
>>aber zum 1. Teil: Hab ich jetzt vielleicht 'n BlackOut oder...
nö überhaupt nicht. In diesem Falle funktioniert das wunderprächtig.
Nur habe ich meine "Ansprüche" auf ein "tieferes,
allgemeingültiges" Niveau runtergeschraubt, denn falls zb.
0V = 0
5V = 400
wäre dann funktioniert deine, für uns triviale Logik, eben nicht mehr.
Und wenn ich einen Tipp abgeben sollte, so wird der Fitter, bei einer
Subtraktion mit 256 den gleichen effizienten Code wie in deinem
Vorschlag erzeugen (wir erinnern uns an's Bitzählen ;)
Gruß Hagen
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.