Forum: FPGA, VHDL & Co. VHDL links- rechts Rotation


von Markus K. (hyperion)


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

von Jan M. (mueschel)


Lesenswert?

Nimm doch einfach die Suchfunktion: 
Beitrag "VHDL - addition, logische Operatoren und rol mit einem typ möglich?"

Also: Entweder jedesmal casten oder es gleich von Hand aufschreiben.

von Markus K. (hyperion)


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);

von Jan M. (mueschel)


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.

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


Lesenswert?

>>  std_logic_vector(1 to 28)
Mach das besser so, wie es der Rest der Welt auch macht:
Bitvektoren beginnen mit dem höchstwertigen Bit und gehen bis 0.
1
  std_logic_vector(27 downto 0)
(Ausnahmen bestätigen bestenfalls die Regel)

von Markus K. (hyperion)


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ß

von Jan M. (mueschel)


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.

von Markus K. (hyperion)


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 !? :-!

von Jan M. (mueschel)


Lesenswert?

Ups, da hatte ich wohl Unsinn gepostet...
1
I_O_LEFT <= I_O_LEFT(I_O_LEFT'left-x downto I_O_LEFT'right) &
2
            I_O_LEFT(I_O_LEFT'left downto I_O_LEFT'left-x+1);

Der zweite Teil muss natürlich genau der Teil sein, der beim ersten 
fehlt.

von Markus K. (hyperion)


Lesenswert?

Jetzt verstehe ich es komplett und der Compiler beanstandend jetzt auch 
nichts mehr.
Danke für die schnellen Antworten.

Grüße
Markus

von Nicolas (Gast)


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

von Duke Scarring (Gast)


Lesenswert?

Nicolas schrieb:
> Kann mir jemand sagen, was an diesem code falsch ist?
Da steht:
1
TX_Data <= TX_Data;
Wie soll da was rotieren?

> Es kommt kein Fehler aber es bewegt sich leider auch nichts.
Vertausche mal die beiden Terme rechts der Zuweisung.

Duke

von Nicolas (Gast)


Lesenswert?

Duke Scarring schrieb:
> Nicolas schrieb:
>> Kann mir jemand sagen, was an diesem code falsch ist?
> Da steht:
>
1
> TX_Data <= TX_Data;
2
>
> Wie soll da was rotieren?
>
>> Es kommt kein Fehler aber es bewegt sich leider auch nichts.
> Vertausche mal die beiden Terme rechts der Zuweisung.
>
> Duke

Danke für die Hilfe.
Das vertauschen der Terme hat geholfen :)

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.