Hallo, guten Tag. Ich möchte bitte eine Typenumwandlung von einer Variable in Vector. Das unten funktioniert. Wie macht man es denn ohne die "8" hinten in der Klammer wenn die Variable zb so heisst: variable xx : integer range 0 to 45 := 0; Danke. GRuss ------------------------------------------- begin process(clk) variable xx : integer range 0 to 255 := 0; begin if rising_edge(clk) then if (c<12499999 ) then c <= c+1; else c <= 0; if (xx<255) then xx := xx+1; else xx :=0; end if; end if; end if; leds <= std_logic_vector(to_unsigned(xx,8)); end process; end Behavioral; ------------------------------------------------
peter schrieb: > Wie macht man es denn ohne die "8" hinten in der Klammer wenn die > Variable zb so heisst: variable xx : integer range 0 to 45 := 0; a) Die 8 hat in diesem Fall nichts mit der Variablen zu tun. b) Ich glaube, dass Stichwort hierzu heißt "VHDL Predefined Attributes" gruß
Jup danke. Ist also für meine led gedacht die mit : leds : out STD_LOGIC_VECTOR(7 downto 0); angelegt wurde. Gruss
es wird aber trotzdem wohl nicht so wie gedacht funktionieren, weil du fuer 'xx' eine Variable verwendest und auf '<255' abfragst. Warum Variable? Und wenn schon Variable, warum nicht mit 'range' Angabe? Sorry, aber ich habe den Eindruck, du kopierst dir von irgendwoher irgendwas zusammen ohne Sinn und Verstand...
ok, 'xx<255' funktioniert hier, aber erklaer mal in eigenen Worten warum?
Hmmm... variable xx : integer range 0 to 255 := 0; Range ist vorhanden. ok, 'xx<255' funktioniert hier, aber erklaer mal in eigenen Worten Ich brauche 0 bis 254 nicht die 255. GRuss
Ich wollte mal Testen wie sich eine Variable verhält wenn die zur led umgelenkt wird durch Typenwandlung. Ich wusste vorher auch nicht das Variable nur innerhalb vom Process Gültigkeit hat. Mit signal xx : integer range 0 to 255 := 0; habe ich auch schon getestet. Die befindet sich ausserhalb vom Process. Das mußte mir erst mal klar werden. GRuss
Ich habe jetzt ja auch mal rausgefunden das bei Range wieder bei "0" angefangen wird wenn das Ende erreicht ist. Ich dachte vorher das es ins ungewisse geht mit dem Zählen. GRuss
peter schrieb: > Ich habe jetzt ja auch mal rausgefunden das bei Range wieder bei "0" > angefangen wird Sag auch mit welcher Toolchain und welcher Version... > Ich dachte vorher das es ins ungewisse geht mit dem Zählen. Es ging noch nie bis ins Ungewisse, sondern immer nur bis zur nächsten Zweierpotenz...
:
Bearbeitet durch Moderator
peter schrieb: > Ich wusste vorher auch nicht das > Variable nur innerhalb vom Process Gültigkeit hat. Sollte Dein VHDL-Buch nicht langsam mal da sein? Falls ja, dann lies es auch! Duke
Mit QuartusSetupWeb-13.0.0.156 und ModelSimSetup-13.0.0.156 Gruss
peter schrieb: > Ich habe jetzt ja auch mal rausgefunden das bei Range wieder bei "0" > angefangen wird wenn das Ende erreicht ist. das glaube ich erstmal nicht! Range sagt nur dem Synthesizer, wieviel Bits er veranschlagen soll. Er baut dir aber bei range is 0 to 10 keinen Ueberlaufdetektor ein!
---------------------- das glaube ich erstmal nicht! Range sagt nur dem Synthesizer, wieviel Bits er veranschlagen soll. Er baut dir aber bei range is 0 to 10 keinen Ueberlaufdetektor ein! ------------------------ Kannst du halten wie ein Dachdecker....ämm Ueberlaufdetektor... Ich kann damit leben.... Gruss
peter schrieb: > Kannst du halten wie ein Dachdecker....ämm Ueberlaufdetektor... > Ich kann damit leben.... Gruss vom Dachdecker. Wollen wir wetten?
Dachdecker-Kollege schrieb: > Ich setze 10 Taler auf berndl ;-) Ich glaube es auch frühestens, wenn ich den RTL-Plan gesehen habe. Aber der Test ist einfach: Peter, lass diese Beschreibung mal auf 3 nebeneinander liegende LEDs laufen und mach ein kurzes Filmchen davon:
1 | library IEEE; |
2 | use IEEE.STD_LOGIC_1164.ALL; |
3 | use IEEE.NUMERIC_STD.ALL; |
4 | |
5 | entity RangeTest is |
6 | Port ( clk : in STD_LOGIC; |
7 | led1 : out STD_LOGIC; |
8 | led2 : out STD_LOGIC; |
9 | led3 : out STD_LOGIC); |
10 | end RangeTest; |
11 | |
12 | architecture Behavioral of RangeTest is |
13 | signal cnt1 : integer range 0 to 67108863 := 0; --> 26 Bits nötig |
14 | signal cnt2 : integer range 0 to 33554433 := 0; --> 26 Bits nötig |
15 | signal cnt3 : integer range 0 to 33554433 := 0; --> 26 Bits nötig |
16 | begin
|
17 | |
18 | process begin |
19 | wait until rising_edge(clk); |
20 | cnt1 <= cnt1 + 1; -- Überlauf implizit |
21 | |
22 | cnt2 <= cnt2 + 1; -- wie cnt1 oder wie cnt3? |
23 | |
24 | if cnt3 < 33554433 then -- Überlauf explizit |
25 | cnt3 <= cnt3 + 1; |
26 | else
|
27 | cnt3 <= 0; |
28 | end if; |
29 | end process; |
30 | |
31 | led1 <= to_unsigned(cnt1,26)(25); |
32 | led2 <= to_unsigned(cnt2,26)(25); |
33 | led3 <= to_unsigned(cnt3,26)(25); |
34 | |
35 | end Behavioral; |
Für die Xilinx ISE sind auf jeden Fall led1 und led2 das Selbe (siehe Screenshot vom Technology Schematic).
:
Bearbeitet durch Moderator
Und auch mit Synplify gibts keinen automatischen Überlauf am range...
:
Bearbeitet durch Moderator
Dachdecker-Kollege schrieb: > berndl schrieb: >> Wollen wir wetten? > > Ich setze 10 Taler auf berndl ;-) Hallo 'Kollege'. Danke fuer die moralische Unterstuetzung (gilt auch fuer Lothar) :o)
peter schrieb: > LED 1-2 blinkt Zeitgleich, LED 3 blinkt überhaupt nicht. Mit einem Oszi würde man an der LED 3 ganz kurze Peaks sehen (Tastverhältnis 2:33554431). Fazit: auch Quartus macht keinen automatischen Überlauf an den range Grenzen. Denn sonst müsste konsequenterweise so ein Überlauf hier auch gehen: ... range 10 to 20; ... range -10 to 10;
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.