signed, unsigend, std_logic ...

Gast #252302
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
Gast #252303
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
Gast #252304
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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren