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
Du hast schon die Lösung hingeschrieben, einfach die Leerzeichen neben dem "&" weglassen, wenn ich mich nicht irre.
Sollte auch mit dem Leerzeichen funktionieren. Was ich suche ist eine Standard-Funktion aus std_logic_1164 oder so.
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.
ich würd einfach folgendes schreiben: value_long <= value_short(7)&value_short(7)&value_short;
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.
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.
@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.
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.
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.
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
@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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.