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
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.
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);
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.
>> 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)
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ß
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.
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 !? :-!
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.
Jetzt verstehe ich es komplett und der Compiler beanstandend jetzt auch nichts mehr. Danke für die schnellen Antworten. Grüße Markus
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.