std_logic_vector zu signed

Gast #252561
Lesenswert?

Hallo,

wie kann man einen std_logic_vector erweitern? Das Problem ist, dass in
diesem Vector einen Wert mit Vorzeichen gespeichert ist und ich ihn für
weitere Berechnungen erweitern muss. Irgenwie sollte es doch eine
Funktion geben die folgendes macht:

signal value_short : std_logic_vector(7 downto 0);
signal value_long  : std_logic_vector(9 downto 0);

if value_short(7) = '0' then
  value_long <= "00" & value_short;
else
  value_long <= "11" & value_short;
end if;

gruss seek
Gast #252564
Lesenswert?

meinst du etwas wie type cast, das geht ganz einfach :

signed(xxxx);

fügt aber keine zusätzlichen typen hinzu. musst noch die Bibliothek

std_logic_signed.all hinzulinken oder so ähnlich, der vector wird nun
halt als vorzeichenbehafteter Bit vector interpretiert, und man kann
damit gut rechnen.
Gast #252566
Lesenswert?

eigentlich hat man ja den Typ "signed" erfunden, damit
man Werte mit Vorzeichen nicht in std_logic_vector
speichern muss. Damit geht dann auch die VZ-Erweiterung
problemlos, man muss diese Typen einfach nur nutzen.
Gast #252567
Lesenswert?

Danke für eure Vorschläge. Den Type signed kenne ich schon, nur habe ich
da das gleiche Problem, ich weiss nicht wie man den erweitern kann.

@nimbus4
Intressanter Vorschlag. Ich suche eigentlich nach einer Möglichkeit die
sich parametrisieren lässt.
Gast #252569
Lesenswert?

Die Grössen der Vekoren liegen als Konstanten vor, daher muss ich die
fehlenden Bits berechnen.

value_long <= CONV_STD_LOGIC_VECTOR(0, LVEC - SVEC) & value_short;

Das muss auch mit Vorzeichen funktionieren.
Gast #252570
Lesenswert?

mal nur so ein vorschlag: vor "begin" in der Architectur
signal temp : std_logic_vector(x downto 0)
(x kann beliebig groß sein je nach anforderung)

nach begin

temp <= (others => '1');

value_long <= temp((value_long'high - value_short'high) - 1
                   downto 0)&value_short when (signed(value_short) <
0)
              else CONV_STD_LOGIC_VECTOR(0, LVEC - SVEC) &
value_short;

Bisschen holperig geschrieben, aber läßt sich sicher noch einfacher
ausdrücken.
Gast #252573
Lesenswert?

@seek

wie wärs denn damit (Beispiel) :

   signal vec_1 : std_logic_vector(11 downto 0);
   signal vec_2 : std_logic_vector(15 downto 0);

...

begin

...

   vec_2 <= SXT(vec_1, vec_2'LENGTH); -- use ieee.std_logic_arith.all

Sorry, ist mir heute erst eingefallen, musst die library (s.o.)
einbinden, dann ist die Sign-Extension für std_logic_vector (SXT)
verfügbar.

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