Forum: FPGA, VHDL & Co. signed, unsigend, std_logic ...


von Mark (Gast)


Lesenswert?

Hallo Freunde des VHDL

Ich blick's überhaupt nicht mehr.
Wer kann mir helfen?

Also, ich habe einen 10 bit breiten Wert, der die Werte 0 bis 1023
haben kann. Nennen wir Ihn x.

Von diesem Wert muss ich einen anderen Wert abziehen, der ebenfalls die
Werte 0 bis 1023 annehmen kann. Nenn wir Ihn y.

So, jetzt kommt's:
Das Ergebnis soll aber vom Typ SIGNED sein, aber ebenfalls nur 10 bit
breit sein.

Hä?
Das Ergebnis, wenn es denn als SIGNED darzustellen ist, muss doch 11
bit breit sein, oder?

Wie schreibt man das dann?
Danke!

Mark

von Michael (Gast)


Lesenswert?

Hi,

ich bin nicht ganz sicher, ob ich Deine Frage richtig verstanden habe.

Für die richtige Breite Deines Registers musst Du schon selbst sorgen:

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_signed.ALL;
...
PORT(   x,y : IN std_logic_vector(9 DOWNTO 0);
        o   : OUT std_logic_vector(10 DOWNTO 0)
);
...
 o <= ('0' & x) - ('0' & y);
...

sollen x und y auch negativ sein, so musst Du anstatt der Null jeweils
das MSB nocheinmal vorne anhängen.

VG Michael

von FPGA-User (Gast)


Lesenswert?

x = 10 bit = 0 ... 1023
y = 10 bit = 0 ... 1023

egal ob x + y oder x - y, das Ergebnis muss 1 bit breiter sein
als x bzw. y,

also z = 11 bit = 0 ... 2047 oder - 1024 ... + 1023

je nachdem, ob als signed oder unsigned betrachtet.

Da x und y positiv sein sollen, kann man einfach mit 1 MSB = '0'
erweitern, also vereinfacht geschrieben :

z <= ('0' & x) - ('0' & y); -- x und y sind immer positiv (MSB=0)

von Mark (Gast)


Lesenswert?

Danke Michael.
Danke FPGA-User.

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.