Forum: FPGA, VHDL & Co. Unsigned to Signed manuell in VHDL aus Vektorebene


von Bastler82 (Gast)


Lesenswert?

Nachdem ich mich fürs Rechnen in VHDL schon vor Jahren an die "moderne" 
Arbeitsweise mit integer und der numeric gewöhnt habe, darf ich nun 
wieder mal SV mit std_logic machen (der Verwedung der alten Bibs in 
existentem Code wegen). So muss ich z.B. einen unsigned16 (von 0 ... 
65535) auf einen signed16 verwandeln und habe deshalb einfach 32768 
abgezogen. Stimmt das so:

1) out16 <= std_logic_vector (unsigned(in) - 32768)

oder muss ich über den Umweg das signed gehen?

2) out16 <= std_logic_vector (signed(in) - 32768)

Ich bin mir wegen der Spiegelung der Werte bei unsigend nicht sicher. 
Bei einer reinen Negation mache ich das nämlich immer mit "not". Von 
daher ist das meines Erachtens falsch und ich brauche ein Bit mehr?

3) out17 <= std_logic_vector (signed('0' & in) - 32768)

Das müsste in jedem Fall funktionieren. Diesbezüglich bin ich mir nur 
nicht sicher, welche Bits ich beim Übergang von 17Bit zu 16Bit weglassen 
soll.

3a) out16 <= out17 (15 downto 0) schneidet ja das 17. (Negativ-) Bit 
weg. Deshalb würde ich es so machen wollen:

3b) out16 <= out17 (16) & out17 (14 downto 0)

Oder ist das falsch gedacht?



???

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Bastler82 schrieb:
> So muss ich z.B. einen unsigned16 (von 0 ... 65535) auf einen signed16
> verwandeln und habe deshalb einfach 32768 abgezogen. Stimmt das so:
Vorneweg: ein unsigned16 passt nicht in einen signed16.

> out16 <= out17 (15 downto 0) schneidet ja das 17. (Negativ-) Bit weg.
Es gibt nicht nur das "eine" Vorzeichen Flag.
Denn sonst wäre ja bei 8 Bit der Wert "eins" = "00000001"
und der Wert "minus eins" das selbe,
nur mit "negativ-Bit" ="10000001". Und das stimmt so ja nicht.
Und vor allem gäbe es eine positive und eine negative "null":
+0 = "00000000"  und
-0 = "10000000"

> Oder ist das falsch gedacht?
Ja. Du unterschlägst eine Hälfte des Zahlenbereichs.
Es ist einfach so, dass eine signed "zehn" und eine unsigned "zehn" 
genau gleich aussehen. Da muss man nichts subtrahieren.
Und ein unsigned "vierzigtausend" passt gar nicht in einen gleich großen 
signed Vektor...

von Markus F. (Gast)


Lesenswert?

Bastler82 schrieb:
> welche Bits ich beim Übergang von 17Bit zu 16Bit weglassen
> soll.
Wieso willst Du überhaupt eins weglassen?

Kannst Du den ganzen Kram nicht einfach simulieren und schauen,ob das 
rauskommt, was Du haben willst?

Ich hab mir das jetzt dreimal durchgelesenm verstehe aber nicht, was Du 
egentlich tun willst.

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.