mikrocontroller.net

Forum: FPGA, VHDL & Co. std_logic_vector zu signed


Autor: seek (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tobias O. (Gast)
Datum:

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

Autor: seek (Gast)
Datum:

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

Autor: Tobias O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: nimbus4 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich würd einfach folgendes schreiben:

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

Autor: FPGA-User (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: seek (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tobias O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: seek (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tobias O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: seek (Gast)
Datum:

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

Autor: Tobias O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: FPGA-User (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: seek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja das ist es. Danke für deine Hilfe.

gruss seek

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.