mikrocontroller.net

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


Autor: Markus K. (hyperion)
Datum:

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

Autor: Jan M. (mueschel)
Datum:

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

Autor: Markus K. (hyperion)
Datum:

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

Autor: Jan M. (mueschel)
Datum:

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

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

Bewertung
0 lesenswert
nicht 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.
  std_logic_vector(27 downto 0)
(Ausnahmen bestätigen bestenfalls die Regel)

Autor: Markus K. (hyperion)
Datum:

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

Autor: Jan M. (mueschel)
Datum:

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

Autor: Markus K. (hyperion)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt weiß ich was ich missverstanden hab.
Bei einem Rotate um 1 bit nach links müsste ich es dementsprechende
wie folgt eintippen.
signal I_O_LEFT : std_logic_vector (27 downto 0);
...
I_O_LEFT <= I_O_LEFT(I_O_LEFT'left-1 downto I_O_LEFT'right) &
            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 !? :-!

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups, da hatte ich wohl Unsinn gepostet...
I_O_LEFT <= I_O_LEFT(I_O_LEFT'left-x downto I_O_LEFT'right) &
            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.

Autor: Markus K. (hyperion)
Datum:

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

Grüße
Markus

Autor: Nicolas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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... ._.
TX_Data <= TX_Data(TX_Data'left downto TX_Data'right+24) &   
                 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

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicolas schrieb:
> Kann mir jemand sagen, was an diesem code falsch ist?
Da steht:
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

Autor: Nicolas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Duke Scarring schrieb:
> Nicolas schrieb:
>> Kann mir jemand sagen, was an diesem code falsch ist?
> Da steht:
>
> 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

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

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.