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


von Thomy (Gast)


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

von Ines (Gast)


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

von Thomy (Gast)


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

von Ines (Gast)


Lesenswert?

Und, tut er's?

von Thomy (Gast)


Lesenswert?

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

von Thomy (Gast)


Lesenswert?

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

von Ines (Gast)


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

von Thomy (Gast)


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

von Thomy (Gast)


Lesenswert?

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

von Ines (Gast)


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

von Ines (Gast)


Lesenswert?

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

Ines

von Thomy (Gast)


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);
                                                ^^
                                                ||

von Ines (Gast)


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!

von Thomy (Gast)


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?

von Ines (Gast)


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

von Thomy (Gast)


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

von Ines (Gast)


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

von Thomy (Gast)


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

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.