Forum: FPGA, VHDL & Co. Wartezeit mit PROCEDURE realisiern


von Stefan (Gast)


Lesenswert?

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

von Frank (Gast)


Lesenswert?

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;

von Kim (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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!

von Frank (Gast)


Lesenswert?

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.

von TheMason (Gast)


Lesenswert?

@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
Noch kein Account? Hier anmelden.