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
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
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
Ich weiss es nicht. Ich versuch's einfach nur zu verstehen, was da steht. Und? Ich versteh's nicht. :-(
Werden da tatsächlich 4092/4096 abgezogen, oder ein anderer Wert? Ich blick's nicht...
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
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.)
Ines, stimmt's? Es werden nicht 1023/1024 abgezogen, sondern etwas weniger, nämlich 1022/1024. Ja?
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
PS: Wie bist Du denn auf die Werte und Zwischergebnisse gekommen? Hast Du das simuliert oder Theoretisch überlegt? Ines
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); ^^ ||
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!
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?
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.