www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Testbench für zwei Events bei steigender Flanke


Autor: Freddy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

folgendes Problem, wie bekomme ich es hinn für folgenden Code die 
Testbench zuschreiben:

Code ((Ausschnitt)):

if ( Taster'event and Taster = '1' ) then
    while (QI > x"0000000") loop
  if (clk'event and clk = '1') then   -- steigende Taktflanke
          QI := QI - '1';
  end if;
    end loop;

    i := i + 1;
end if;

Dazu die Testbench (Ausschnitt):

DUT: Zaehler
  port map(Taster => Taster_T, LED => LED_T, CLK => CLK_T);

  -- Takteriergenung
  CLK_T <= not CLK_T after T/2;

  Taster_T <= not Taster_T after 50 ms;

Wenn nun das Taster event ausgelöst wird hängt sich das Programm auf, da 
es sich in einer Endlosschleife befidnet. Irgendwie scheint der Takt 
während dem Taster Event nicht weiter zu laufen und somit wird die 
Variable QI nicht runtergezählt.
Hoffe ihr könnt mir helfen.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
autsch...
ohne den rest gesehen zu haben: vhdl ist keine programmiersprache wie c!
Du wirst wahrscheinlich einen grossteil neu schreiben muessen ::)

Lass die variablen weg, nimm signale!
Und was macht das while loop statement da ? das soll doch nicht etwa 
runterzaehlen oder ???
Das wird alles parallel in Hardware umgesetzt ! (wenn das ueberhaupt 
klappt)
So verwendet man while loops nicht in vhdl!

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Freddy (Gast)

>if ( Taster'event and Taster = '1' ) then
>    while (QI > x"0000000") loop
>  if (clk'event and clk = '1') then   -- steigende Taktflanke
>          QI := QI - '1';
>  end if;
>    end loop;>
>
>    i := i + 1;
>end if;


Das macht man so ÜBERHAUPT nicht.

1.) zwei 'events in einem prozess ist völlig falsch
2.) Taster mit 'event abfragen ist auch falsch, da wird ausserdem eine 
Entprellung benötigt

http://www.mikrocontroller.net/articles/VHDL_Schni...

MfG
Falk

Autor: Freddy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank schonmal.
Bin noch Anfänger ;-)

Also die while Schleife sollte runterzählen (Tastenentprellung)
Das geht wie ihr sagt anscheinend nicht :-(

Werd aus dem Link nicht ganz schlau:

clk_en <= signal_rising;

 process(CLK)
  begin
  if rising_edge(CLK) then
   if RESET = '1' then
    output <= '0';
   elsif clk_en = '1' then
    output <= '1';
   end if;
  end if;
  end process;

Was ist da nun mein Eingang (Taster) und die restlichen Variablen sind 
das Signale oder Variablen?

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du solltest Dir mal den Unterschied zwischen Signalen und Variablen 
genauer ansehen. Ein Signal hat immer einen Wert und einen zeitlichen 
Verlauf. Eine Variable nur einen Wert. Der Unterschied ist das die 
Variable einen zugewiesenen Wert sofort übernimmt und Du mit diesem 
weiterarbeiten kann. Bei einem Signal wird ein neuer Wert erst nach 
einer kurzen Zeit übernommen.

Dein Code oben wird Dir so nicht weiterhelfen. Du musst wie im ersten 
Codeschnipsel eine Flanke erkennen. Wenn Du die erkannt hast, dann 
startest Du den Zähler und wartest bis der abgelaufen ist. Dann 
vergleichst Du den alten Wert mit dem aktuellen Wert. Wie in Software. 
Nur musst Du dir den zeitlichen Verlauf noch stärker ins Bewusstsein 
rufen.

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Code oben sollte schon in der Simulation laufen, wenn er auch 
natürlich nicht synthetisierbar ist.

Der Grund, warums nicht klappt liegt m.E. in der Testbench:
CLK_T <= not CLK_T after T/2;

Was ist CLK_T zu Anfang? Richtig, 'U'. Und was ist NOT('U')? Richtig, 
immer noch 'U'. Und wann wird dann CKT_T='1'?

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.