www.mikrocontroller.net

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


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

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

Gruss,
Thomas

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Hagen
Hallo FPGA-User

Habe euch ein Bildchen mitgeschickt...

Thomas

Autor: FPGA-User (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: FPGA-User (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.