Forum: FPGA, VHDL & Co. Shift von STD_LOGIC_VECTOR


von Lukas W. (lukas_w86)


Lesenswert?

Hallo

Ich weiss diese Frage ist schon einige male gestellt worden, aber ich 
versteh es immer noch nicht.

Ich möchte eigentlich nur ein STD_LOGIC_VECTOR um 16 Stellen nach links 
verschieben.

Das müsste doch so gehen:

SIGNAL ZEILE9E:STD_LOGIC_VECTOR (23 downto 0);
SIGNAL ZEILE9: STD_LOGIC_VECTOR (7 downto 0);


ZEILE9E<=ZEILE9 rol 16;

Ich benutze Quartus 2 12.0
Folgende Fehlermeldung erscheint:
Error (10327): VHDL error at Vhdl1.vhd(245): can't determine definition 
of operator ""rol"" -- found 0 possible definitions

Mit sll oder ähnlichem Funktioniert es genauso wenig.

Vielen Dank für eure Hilfe

von marco (Gast)


Lesenswert?

ZEILE9E<=ZEILE9(23 downto 16) & x"0000"

von Lukas W. (lukas_w86)


Lesenswert?

Hallo Marco

Das ergibt leider auch eine Fehlermeldung:

Error (10393): VHDL error at Vhdl1.vhd(247): left bound (23) of slice 
must belong to range (7 downto 0) of corresponding object

Error (10658): VHDL Operator error at Vhdl1.vhd(247): failed to evaluate 
call to operator ""&""

Ist das Problem das die beiden STD_Logic_Vector nicht dieselbe länge 
haben ?

von Bitflüsterer (Gast)


Lesenswert?

Die Idee von marco ist schon richtig, aber leider im Detail 
schiefgegangen.
Auf der rechten Seite steht ja der kurze Vektor. Die slices davon können 
natürlich nicht größer sein.
Und ja: Das "Problem" ist die unterschiedliche Größe.

Aber vom Ansatz her sollte:
1
ZEILE9E <= ZEILE9 (7 downto 10) & x"0000"

Die Fehlermeldung wegen dem undefinierten &-Operator ist möglicherweise 
ein Folgefehler. Falls das aber so nicht geht, gucke mal welche 
Libraries Du eingebunden hast. In der Dokumentation zu den Libraries 
steht auch welche Operatoren mit welchen Argumenten definiert sind.

von Lukas W. (lukas_w86)


Lesenswert?

Hallo Bitflüsterer

Jetzt habe ich folgende Fehlermeldung:

Error (10324): VHDL Expression error at Vhdl1.vhd(247): expression 
""0000000000000000"" has 16 elements ; expected 24 elements.

Die & Operator Fehlermeldung war anscheinend ein folgefehler.

Folgende Libraries habe ich verwendet:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_arith.all;

Wahrscheinlich eher zu viel als zu wenig. Kann das auch ein Problem sein 
?

von Bitflüsterer (Gast)


Lesenswert?

Leider habe ich zwei Tipfehler gemacht, die Du hoffentlich nicht so 
übernommen hast (die Dir also aufgefallen sind). Der rechte Index war 
falsch und das Semikolon hat auch gefehlt.
1
ZEILE9E <= ZEILE9 (7 downto 0) & x"0000";

von Lukas W. (lukas_w86)


Lesenswert?

Ich habe mich etwas gewundert über die 7 downto 10 :).

Vielen Dank

Jetzt funktioniert es.

von Bitflüsterer (Gast)


Lesenswert?

Bitte, gerne.

von Markus F. (mfro)


Lesenswert?

Das funzt durchaus auch mit "rol" (wie im ursprünglichen Ansatz). Das 
Problem ist, daß "rol" halt nur für bit_vector definiert ist:
1
signal ZEILE9E:std_logic_vector(31 downto 0);
2
3
vec_out <= to_stdlogicvector(to_bitvector(ZEILE9E) rol 16);

rol rotiert aber - aber wenn's Rotieren sein soll...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Lukas W. schrieb:
> Mit sll oder ähnlichem Funktioniert es genauso wenig.
Der Schlüssel sind die richtigen Datentypen, VHDL ist da sehr streng:
Beitrag "Links schieben geht nicht, warum?"

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.