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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.