Hallo, hat jemand schon mal mit dem 5I25-FPGA-Board von Mesa Electronics gearbeitet? (kostet rund 100 Euro, sieht professionell aus, mit SPARTAN6 FPGA, wird in Deutschland von Lascar Electronics verkauft) Ich versuche z.Zt. den VHDL-Code der Motion-Control-Algorithmen zu entfernen, um Platz für meine Applikation zu schaffen. Es gibt da allerdings ein paar, für mich als Anfänger nicht direkt nachvollziehbare, Probleme .. z.B.: Die Parity-Routine wird mit IPar <= parity(AD&NCBE&'0'); gerufen. Warum hier mit '0' ver-undet wird ist mir nicht verständlich ... Der Code der Routine ist: package parity is function parity(data : std_logic_vector) return std_logic; end parity; package body parity is function parity(data: std_logic_vector) return std_logic is variable p : std_logic := '0'; begin for i in data'right to data'left loop p := p xor data(i); end loop; return(p); end; end parity; Es wird allerding beim Synthesize diese Warnung ausgegeben: Line 79: Range is empty (null range) und bezieht sich auf die Zeile "for i in data'right to data'left loop" Wie ist denn das zu interpretieren ? --Armin
Armin Steinhoff schrieb: > function parity(data: std_logic_vector) return std_logic is Ein unconstrained std_logic_vector ist definiert als 0 to x. Konkret hat ein 8-Bit-Vektor dann den range 0 to 7. Links steht die 0 und rechts die 7... > for i in data'right to data'left loop ... Blöd also, dass hier dann steht: for i in 7 to 0 loop ... Schreib das mal so: for i in data'range loop ... > parity(AD&NCBE&'0') > Warum hier mit '0' ver-undet wird Die '0' wird nicht verundet, sondern an die anderen Bits angehängt. Der Vektor wird damit ein Bit länger. Das ist eine Concatenation... In VHDL wird mit dem Schlüsselwort and verundet. > ist mir nicht verständlich ... Diese "Vektorverlängerung" mit der '0' ist unnötig. Die '0' ändert jedenfalls nichts am Ergebnis...
Lothar Miller schrieb: > Armin Steinhoff schrieb: [clip] > > Schreib das mal so: > for i in data'range loop ... Brilliant ... das löst das Problem. > >> parity(AD&NCBE&'0') >> Warum hier mit '0' ver-undet wird > Die '0' wird nicht verundet, sondern an die anderen Bits angehängt. > Der Vektor wird damit ein Bit länger. Das ist eine Concatenation... Muß ich wohl noch verinnerlichen :) Danke für die Kommentare. --Armin
Armin Steinhoff schrieb: >>> parity(AD&NCBE&'0') >>> Warum hier mit '0' ver-undet wird >> Die '0' wird nicht verundet, sondern an die anderen Bits angehängt. >> Der Vektor wird damit ein Bit länger. Das ist eine Concatenation... > Muß ich wohl noch verinnerlichen :) Nehmen wir mal so ein Signal:
1 | signal sig : std_logic_vector(7 downto 0); |
Das ist z.B. ein Linksshift um 1 Bit:
1 | sig <= sig(6 downto 0) & '0'; |
Das ist ein Rotate Left:
1 | sig <= sig(6 downto 0) & sig(7); |
So geht ein Rotate Right:
1 | sig <= sig(0) & sig(7 downto 1); |
Hier werden die Nibbles getauscht:
1 | sig <= sig(3 downto 0) & sig(7 downto 4); |
Lothar Miller schrieb: > Armin Steinhoff schrieb: >>>> parity(AD&NCBE&'0') >>>> Warum hier mit '0' ver-undet wird >>> Die '0' wird nicht verundet, sondern an die anderen Bits angehängt. >>> Der Vektor wird damit ein Bit länger. Das ist eine Concatenation... >> Muß ich wohl noch verinnerlichen :) > Nehmen wir mal so ein Signal: >
1 | > signal sig : std_logic_vector(7 downto 0); |
2 | >
|
> Das ist z.B. ein Linksshift um 1 Bit: >
1 | > sig <= sig(6 downto 0) & '0'; |
2 | >
|
> Das ist ein Rotate Left: >
1 | > sig <= sig(6 downto 0) & sig(7); |
2 | >
|
> So geht ein Rotate Right: >
1 | > sig <= sig(0) & sig(7 downto 1); |
2 | >
|
> Hier werden die Nibbles getauscht: >
1 | > sig <= sig(3 downto 0) & sig(7 downto 4); |
2 | >
|
Interessant ... hätte dem & Operator angewendet auf Vectoren nicht diese Semantik unterstellt. Danke --Armin
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.