mikrocontroller.net

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


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
signal count : unsigned(width-1 downto 0);
signal en := std_ulogic;
constant cycles : natural := 24; --hier die anzahl der Zyklen eintragen
                                 --width muss natürlich dazu passen
...
process (clock, reset_n)
begin
    en <= '0'; --vorbelegen
    if reset_n = '0' then
        count <= to_unsigned(cycles-1, count'length);
    elsif rising_edge(clock) then
        if count = 0 then
            count <= to_unsigned(cycles-1, count'length);
            en <= '1';
        else
            count <= count - 1;
        end if;
    end if;
end process;

Autor: Kim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.