VHDL links- rechts Rotation

OP #1094211
Lesenswert?

Hallo zusammen,

ich versuche eine links- und rechts Rotation auf einen 
std_logic_vector(1 to x) durchzuführen. Habe auch mittlerweile gelesen 
das es für ein bit_vector(1 to x) den rol/ror Operator gibt. Leider 
funktionieren diese nicht bei std_logic_vector. Bin ein VHDL Anfänger 
und komme einfach nicht drauf. Hoffe das mir hier jemand auf die Sprünge 
helfen kann.

Danke euch schon mal.
Grüße Markus
OP #1094242
Lesenswert?

Hi,

bei diesem Thread war ich auch schon. Muss aber zugeben, dass ich es 
nicht so umsetzen konnte damit es bei mit funktioniert. :(
Für x hab ich 28 eingesetzt. (std_logic_vector(1 to 28))
Den folgend Error bekomme ich bei ModelSim.

# ** Warning: [3] ...vhd(39): (vcom-1246) Range -27 downto 28 is null.
# ** Warning: [3] ...vhd(40): (vcom-1246) Range 1 downto 56 is null.
# ** Warning: [14] ...vhd(39): (vcom-1012) Slice range direction 
(downto) does not match slice prefix direction (to).
# ** Warning: [14] ...vhd(40): (vcom-1012) Slice range direction 
(downto) does not match slice prefix direction (to).
# ** Warning: [14] ...vhd(40): (vcom-1272) Length of expected is 28; 
length of actual is 0.

Ops.. hab noch vergessen den Code an zuhängen..

signal : std_logic_vector(1 to 28);
...
signal <= signal(signal'left-28 downto signal'right) &
          signal(signal'left downto signal'right+28);
#1094267
Lesenswert?

Du benutzt std_logic_vector(1 to 28), die übliche Schreibweise, für die 
auch mein Code ist, ist (28 downto 1). So hast du das höchstwertige Bit 
ganz links stehen wie es allgemein üblich ist.

Genau das sagt dir ja auch diese Meldung:
# ** Warning: [14] ...vhd(39): (vcom-1012) Slice range direction
(downto) does not match slice prefix direction (to).


Wenn du bei "to" bleiben willst, musst du left und right vertauschen und 
downto durch to ersetzen.
OP #1094336
Lesenswert?

Danke für die schnelle Antwort. Habe es gleich ausprobiert und
auch mein Code an den Rest der Welt angepasst ;)

Jetzt kommt nur noch ein Fehler, dass die Größen nicht ganz passen.
Das liegt aber noch daran das ich noch ein wenig von der Syntax verwirrt
bin oder jetzt total auf dem Schlauch stehe.

Um das jetzt endlich zu kapieren, hab ich mir ein 8bit Vektor
aufgezeichnet. Nach einem links shift müsste das Ergebnis so aussehen.

*****************msb*************lsb
bit Stelle       | 7 6 5 4 3 2 1 0
----------------------------------
vor left rotate  | 1 0 0 1 1 1 0 1
nach left rotete | 0 0 1 1 1 0 1 1
**********************************

Syntax für ein std_logic_vector(x downto 1).
signal <= signal(signal'left-8 downto signal'right) &
          signal(signal'left downto signal'right+8);

signal'left müsste die bit Stelle 8 (msb) sein. Dementsprechend
signal'right das 1te (lsb) bit.
mit "-" ab signal'left würde ich Richtung lsb gehen und mit "+" von
signal'right zum msb!?
Habe ich vielleicht das falsch verstanden ?

Gruß
#1094340
Lesenswert?

Die 8 im Code steht für die Zahl der Bitstellen um die verschoben wird. 
Die Breite deines Vektors ergibt sich ja automatisch aus 'left und 
'right.
Und einen x Bit breiten Vektor kann man mit diesem Code nur um maximal 
x-1 Bits verschieben, sonst gibt es einen Fehler, da signal'left-8 ja -1 
(bei einem 8 Bit breiten Vektor wie in deinem Beispiel) und somit 
kleiner als signal'right=0 ist. -1 downto 0 macht natürlich keinen Sinn 
mehr und erzeugt einen Fehler.
OP #1094376
Lesenswert?

Jetzt weiß ich was ich missverstanden hab.
Bei einem Rotate um 1 bit nach links müsste ich es dementsprechende
wie folgt eintippen.
1
signal I_O_LEFT : std_logic_vector (27 downto 0);
2
...
3
I_O_LEFT <= I_O_LEFT(I_O_LEFT'left-1 downto I_O_LEFT'right) &
4
            I_O_LEFT(I_O_LEFT'left downto I_O_LEFT'right+1);

# ** Warning: [14] ...vhd(40): (vcom-1272) Length of expected is 28; 
length of actual is 54.

So wie ich aber die Meldung verstehe, hängt ModelSim es irgendwie 
hintereinander !? :-!
Gast #3368459
Lesenswert?

Sorry für das pushen eines alten Threads, aber ich habe noch eine kleine 
Frage zur "rechts" rotation.
Ich komme einfach nicht mehr weiter... ._.
1
TX_Data <= TX_Data(TX_Data'left downto TX_Data'right+24) &   
2
                 TX_Data(TX_Data'right+24-1 downto TX_Data'right);

Kann mir jemand sagen, was an diesem code falsch ist?
Es kommt kein Fehler aber es bewegt sich leider auch nichts.

mfg Nicolas

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren