Hallo! ich krieg folgendes einfach nicht hin! bitte um Hilfe... Entwicklungsumgebung Xilinx ISE (VHDL) Möchte in einen PROCESS immer wieder mal ne kurze Zeit warten! "Wait for" funktioniert nicht, da es sich um ein behaviour model handelt. nun möchte ich einfach mithilfe einer Procedure einen Zaehler hochzählen und bei überlauf fortsetzen. da ich noch ziemlicher anfänger bin, krieg ich das einfach nicht hin... Kann mir vielleicht jemadn ein kleines Codebeispiel posten? mein bisheriger Versuch sieht folgendermaßen aus: Procedure Wait_Time(SIGNAL tmp: INOUT std_logic) is begin IF rising_edge(CLK) AND (tmp = '0') THEN time_count <= time_count + 1; IF (time_count = X"FFF") THEN tmp <= '1'; END IF; END IF; end Wait_Time; Ich dachte mir ich kann das Signal tmp aus '0' setzen und dann solange warten bis es auf eins gesetzt wird. der aufruf würde also folgendermaßen aussehen: Wait_Time('0'); Aber wie kann ich jetzt abfragen, ob das Signal wieder auf '1' gesetzt wird. Ich hoffe ihr helft mir weiter, auch wenn die fragestellung für euch sehr simpel scheint (ich quäle mich damit schon stundenlang rum...)! Gruß und Dank Stefan
1 | signal count : unsigned(width-1 downto 0); |
2 | signal en := std_ulogic; |
3 | constant cycles : natural := 24; --hier die anzahl der Zyklen eintragen |
4 | --width muss natürlich dazu passen |
5 | ... |
6 | process (clock, reset_n) |
7 | begin |
8 | en <= '0'; --vorbelegen |
9 | if reset_n = '0' then |
10 | count <= to_unsigned(cycles-1, count'length); |
11 | elsif rising_edge(clock) then |
12 | if count = 0 then |
13 | count <= to_unsigned(cycles-1, count'length); |
14 | en <= '1'; |
15 | else |
16 | count <= count - 1; |
17 | end if; |
18 | end if; |
19 | end process; |
Hi ich hoffe mal da sich das Verstanden habe ^^ Also du willst einfach nur das wenn deiner Zähler überläuft das der Zähler stoppt und das signal tmp eins wird ?? wenn ja siehe unten ;) process CLK begin IF rising_edge(CLK) THEN if tmp = '0' then time_count <= time_count + 1; end if; IF (time_count = X"FFF") THEN tmp <= '1'; END IF; END IF; end process; ps. niemals clock abfrage und ne andedere Abfrage zusammen !!!! Dafür eine zweites if Anweisung nehmen
Danke erst mal für eure antworten! Ich möchte das ganze aber in einer Procedure realisieren, diese soll nähmlich mehrmals aufgerufen werden... ich versuchs weiter, schon mal danke!
Du weißt schon, dass es "aufrufen" in einer hdl eigentlich nicht gibt? Es gibt zwar die Möglichkeit, sequentiellen code ausführen zu lassen, allerdings bleibt das in Hardware doch wieder parallel. Wenn du also eine gewisse Zeit (= vielfaches einer Taktperiode) waretn willst, dann über eine state machine oder einen Zähler, der ein Signal setzt, wenn die Zeit vorbei ist. Wenn du eine procedure in einer architecture "aufrufst", wird jedesmal Hardware draus. In einem process funktioniert das so nicht.
@stefan das "warten" kannst du nur realisieren wenn du den logikteil der warten soll über ein enable signal stoppst. also : if rising_edge (clk) then if enable = '1' then ... ... hier steht dann deine logik die warten soll ... end if; end if; dein tmp signal ist dann genau invertiert zum enable signal. mußt allerdings darauf achten das du dein enable-signal irgendwann auch wieder auf 1 bekommst, sonst wartet der betreffende logik-teil u.u. etwas länger :-) du mußt dir nur klar machen das das "aufrufen" von "prozeduren" nicht gleichbedeutend mit dem prozedur-aufrufen von mikrocontrollern identisch ist, da der fpga parallel und nicht sequentiell arbeitet. das sequentielle abarbeiten muß man ihm erst noch beibringen (durch logik, statemachines oder aber einem mikrocontroller der in vhdl realisiert ist wie z.B. der picoblaze).
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.