www.mikrocontroller.net

Forum: FPGA, VHDL & Co. unsigned zu std_logic_vector typecast problem


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich bin hier am verzweifeln, deswegen bitte ich euch um Hilfe. Folgendes 
Problem:

in der Entity ist definiert:
data_out : out std_logic_vector(11 downto 0);

und als Signal:
result : unsigned(10 downto 0);

im Code kommt dann folgende Anweisung:
data_out <= std_logic_vector(resize(result(10 downto 2)),data_out'high));

Letzteres gibt mir immer falsche Ergebnisse. Wenn ich das resize 
wegnehme sehe ich, das dem Ausgang immer die komplette Vectorbreite vom 
Signal übergeben wird, obwohl ich die doch durch das (10 downto 2) 
eingegrenzt habe - die letzten beiden Bits werden immer mit 
"bearbeitet"!?

Wie kann ich das umgehen? Freue mich über jede Antwort!

Vielen Dank

Thomas

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du möchtest die oberen 9 bits von result in die unteren 9 bits von 
data_out geben und die oberen 3 Bit von data_out auf 0 setzen? Das 
kannst du so machen:

> data_out(8 downto 0) <= std_logic_vector(result);
> data_out(11 downto 9)<= "000";

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> data_out(8 downto 0) <= std_logic_vector(result);
> data_out(11 downto 9)<= "000";

oder noch einfacher so:

data_out <= "000" & std_logic_vector(result);


Gruß

Ich

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach, tut mir leid - ich habe vergessen zu schreiben, dass der unsigned 
Wert an anderer Stelle auf signed gecastet wird. Müsste dem
....result(10 downto 0)... 

auch in dem Fall nur ein ... "000" & ... vorangestellt werden?

Gruß

Thomas

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas schrieb:
>> data_out <= std_logic_vector(resize(result(10 downto 2)),data_out'high));
> Letzteres gibt mir immer falsche Ergebnisse.
Was ist falsch?
1. da sind zuviele Klammern: 3 auf, 4 zu...
std_logic_vector(((  ))));
2. die Klammer ist falsch: resize braucht die Breite, nicht der cast auf 
den Vektor...
3. 'high ist eins zu wenig. Du solltest 'length nehmen...
std_logic_vector(  resize(result(10 downto 2), data_out'lenght) );

> dass der unsigned Wert an anderer Stelle auf signed gecastet wird.
> Müsste dem
> ....result(10 downto 0)...
> auch in dem Fall nur ein ... "000" & ... vorangestellt werden?
Ja. Denn es ändert sich dabei nichts am Vorzeichen.

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.