Forum: FPGA, VHDL & Co. @FPGA-User


von Thomas (Gast)


Lesenswert?

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

von Hagen (Gast)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

Habe jetzt leider keine Zeit mehr, das auszuprobieren, aber ich sage
jetzt schon mal:
Danke, Hagen!!

Gruss,
Thomas

von Thomas (Gast)


Lesenswert?

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

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Hagen
Hallo FPGA-User

Habe euch ein Bildchen mitgeschickt...

Thomas

von FPGA-User (Gast)


Lesenswert?

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.

von Hagen (Gast)


Lesenswert?

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

von FPGA-User (Gast)


Lesenswert?

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 ?

von Thomas (Gast)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

@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

von Hagen (Gast)


Lesenswert?

@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
Noch kein Account? Hier anmelden.