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.