www.mikrocontroller.net

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


Autor: Thomy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo FPGA-User

Ich stehe nicht nur auf dem Schlauch, ich bin viel mehr hoffnungslos
erledigt und kann nicht einmal mehr 1 und 1 zusammenzählen.

Bitte sagt mir, was diese Zeilen hier machen:

input ist 10 bit breit.
a und b sind 20 bit breit.
Ok, in der ersten Zeile wird der Input auf 20 bit einfach erweitert. Am
Wert ändert sich ja dann nix.


a <= conv_signed(input, b'LENGTH);
b <= a + b - conv_signed(b(b'HIGH downto b'HIGH-9), b'LENGTH);
c <= b(b'HIGH downto b'HIGH-9);

Was kriegt c?

Helft mir, bitte.

Thomy

Autor: Ines (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Thomas,

mal 'ne Gegenfrage: Was soll der Code denn tun? Vielleicht kann man
dann auch einfacher erklären, WIE er das dann tut.

Gruß
Ines

Autor: Thomy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ines

Gott sei Dank meldest Du Dich.
Der Code soll einfach nur zu dem erweiterten Input, also zu a, den Wert
von b addieren. Aber nicht ganz b, sondern "nur" (4092/4096)*b  oder
gekürzt (1023/1024)*b. Ich blick's nicht...

Thomy

Autor: Ines (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und, tut er's?

Autor: Thomy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiss es nicht.
Ich versuch's einfach nur zu verstehen, was da steht.
Und?
Ich versteh's nicht.
:-(

Autor: Thomy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Werden da tatsächlich 4092/4096 abgezogen, oder ein anderer Wert?
Ich blick's nicht...

Autor: Ines (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, ich wollte nur sicherstellen, dass ich jetzt nicht irgendwas
erkläre, was gar nicht funktioniert. Also, ich gehe einfach mal davon
aus, dass es korrekt arbeitet.

conv_signed(b(b'HIGH downto b'HIGH-9), b'LENGTH):
b ist 20 Bit lang. Von diesen 20 Bit nimmst Du die oberen zehn und
schiebst sie um zehn Bit nach unten, d.h. Du teilst b durch 1024.
=> 1/1024 * b

b - conv_signed(b(b'HIGH downto b'HIGH-9), b'LENGTH):
b - 1/1024 * b = 1023/1024 * b;

Der Rest ist denke ich klar, oder? Sonst meldest Du Dich halt noch
mal.

Gruß
Ines

Autor: Thomy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ines, setz doch mal den dezimalen Wert 458752 für b ein. Wenn ich dann
diese komische Zeile mir ansehe, dann bekomme ich den dezimalen Wert
896. Jetzt teile ich 896 durch 458752 und bekomme 0,001953125.
Nennen wir diesen Wert x. So und jetzt 1 minus x ist dann 0,998046875,
was 1022/1024 entspricht, aber nicht 1023/1024.
Stimmt's oder steh' ich immer noch auf dem Schlauch?
(Danke übrigens für deine Hilfe.)

Autor: Thomy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ines, stimmt's?
Es werden nicht 1023/1024 abgezogen, sondern etwas weniger, nämlich
1022/1024.
Ja?

Autor: Ines (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ganz konnte ich Deiner Rechnung jetzt zwar auf die schnelle nicht
folgen, aber ich gleube, ich sehe da einen Hacken - übrigens hast Du
mich mit der 896 drauf gebracht, weil eigentlich wollten wir ja 458752
/ 1024 = 448, also die Hälfte von 896 haben -.
Ich fürchte, da spinnt uns irgendwie das Vorzeichenbit rein. Kann das
sein? Ich denke mal drüber nach.

Ines

Autor: Ines (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: Wie bist Du denn auf die Werte und Zwischergebnisse gekommen? Hast
Du das simuliert oder Theoretisch überlegt?

Ines

Autor: Thomy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab's mir theoretisch überlegt.
Wieso spinnt uns das Vorzeichenbit rein?

Was anderes:
Wir schieben doch gar nicht um 10 Stellen nach unten, sondern nur um 9
Stellen. Oder?

b <= a + b - conv_signed(b(b'HIGH downto b'HIGH-9), b'LENGTH);

Müsste es nicht so lauten:

b <= a + b - conv_signed(b(b'HIGH downto b'HIGH-10), b'LENGTH);
                                                ^^
                                                ||

Autor: Ines (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, mit Deiner Variante schiebt man nur um 9 Bits. "b'HIGH downto
b'HIGH-9" sind 10 Bits, richtig? Und diese oberen zehn Bits schieben
wir auf die unteren zehn Bits des 20Bit-Vektors.

Ich glaube übrigens - jetzt nachdem ich darüber nachgedacht habe - dass
der Code schon das tut, was er tun soll. Das mit dem Vorzeichenbit war
Schmarrn. Ich hatte mich von Deiner Überlegung irritieren lassen.
Probier doch mal eine Simulation. Am besten weißt Du den Teil
"conv_signed(b(b'HIGH downto b'HIGH-9), b'LENGTH)" mal einem
weiteren Signal zu, um es beobachten zu können.

Gruß
Ines

PS: Ich kann erst morgen wieder antworten. Bis dann!

Autor: Thomy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich Hirsch! Du hast natürlich Recht!

Du schreibst:
"b'HIGH downto
b'HIGH-9" sind 10 Bits, richtig? Und diese oberen zehn Bits schieben
wir auf die unteren zehn Bits des 20Bit-Vektors.

Habe mich voll irritieren lassen.
Von wegen ...downto 9. Da steht eindeutig ...downto b'HIGH-9, also
downto 10. (Lesen müsste man können.)

Stimmt's, Ines?

Autor: Ines (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen Thomas,

na, na, wer wird den gleich so hart mit sich ins Gericht gehen :-)
Hauptsache Du hast es jetzt durchstiegen. Funktioniert's denn?

Ines

Autor: Thomy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ines

Ja, ich denk schon.
Noch eine Verständnisfrage:
Wenn ich einen UNSIGNED 10 bit breiten Vektor auf SIGNED umstellen
will, dann muss ich doch eine '0' mit & davorsetzen.
Wenn ich davon einen weiteren 10 bit breiten UNSIGNED Vektor, welcher
ebenfalls auf SIGNED umgestellt werden soll, subtrahieren will, dann
muss ich doch ebenfalls vor dem zweiten Vektor eine '0' mit & beim
MSB erweitern.
Das Ergebnis dieser Subtraktion soll auch vom Typ SIGNED sein und ist
A) 10 Bit breit
B) 11 Bit breit
oder
C) 12 Bit breit
?

Kannst du mich da mal aufklären. Habe Schwierigkeiten mit UNSIGNED,
SIGNED, und eine damit verbundene Subtraktion/Addition zweier solcher
Vektoren bezogen auf die breite des Ergebnisvektors. (Schlechtes
Deutsch...)

Thomy

Autor: Ines (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorweg, ich arbeite eigentlich nicht mit SIGNED und UNSIGNED, aber ich
probier mich mal in einer Antwort:

> Wenn ich einen UNSIGNED 10 bit breiten Vektor auf SIGNED umstellen
> will, dann muss ich doch eine '0' mit & davorsetzen.
Na ja, das kommt darauf an, was Du willst. Wenn Du einfach eine '0'
vorne anstellst, dann wird ja das Vorzeichenbit vom UNSIGNED-Wert zu
einem echten Zahlenwert.
Wenn Du aber den Betrag den UNSIGNED haben willst, dann musst Du
einfach das oberste Bit auf '0' setzen, ohne den Vektor zu
vergrößern. Im Gegenteil, Du kannst ihn sogar um dieses Bit kürzen, da
es ja sowieso '0' ist.
Was würde den "conv_signed()" hier machen?

> Das Ergebnis dieser Subtraktion soll auch vom Typ SIGNED sein ...
Und wie willst Du dann negative Ergebnisse abfangen? Sollen die auf 0
begrenzt werden?

Ines

Autor: Thomy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ines

Hast Recht.
Ich lass das mit dem SIGNED und UNSIGEND.
Mir ist das alles zu "kompliziert" und undurchsichtig...

Ich habe mich schon sowieso viel zu weit in das Gebiet VHDL und
programmierbare Logik getraut - das sollte ich nicht tun und lieber den
Profis überlassen.

NOCHMALS DANKE FÜR DEINE HILFE.

Thomy

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.