Forum: FPGA, VHDL & Co. std_logic_vector zu signed


von seek (Gast)


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

von Tobias O. (Gast)


Lesenswert?

Du hast schon die Lösung hingeschrieben, einfach die Leerzeichen neben
dem "&" weglassen, wenn ich mich nicht irre.

von seek (Gast)


Lesenswert?

Sollte auch mit dem Leerzeichen funktionieren. Was ich suche ist eine
Standard-Funktion aus std_logic_1164 oder so.

von Tobias O. (Gast)


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.

von nimbus4 (Gast)


Lesenswert?

ich würd einfach folgendes schreiben:

value_long <= value_short(7)&value_short(7)&value_short;

von FPGA-User (Gast)


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.

von seek (Gast)


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.

von Tobias O. (Gast)


Lesenswert?

@seek,

wenn du das mit dem parametrisieren etwas näher erläuterst, werden wir
schon eine Lösung finden. Ich weiss eigentlich nicht genau, worauf du
hinaus willst.

von seek (Gast)


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.

von Tobias O. (Gast)


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.

von seek (Gast)


Lesenswert?

Danke für deine Hilfe. Schade, dass es keine elegantere Lösung gibt.

von Tobias O. (Gast)


Lesenswert?

Wenn mich mein Taschenrechner nicht täuscht generiert auch
CONV_STD_LOGIC_VECTOR(-1, LVEC - SVEC) einen Vector mit der
entsprechenden Anzahl von "11" ..... , habe es allerdings noch nicht
in VHDL ausprobiert

von FPGA-User (Gast)


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.

von seek (Gast)


Lesenswert?

Ja das ist es. Danke für deine Hilfe.

gruss seek

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.