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
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