Wartezeit mit PROCEDURE realisiern

Gast #603662
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
Gast
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;
Gast
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
Gast
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!
Gast
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.
Gast
@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).

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.