Testbench für zwei Events bei steigender Flanke

Gast #752183
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.
Gast #752212
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!
#752223
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_Schnipsel_Flankenerkennung

MfG
Falk
Gast #752258
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?
Gast #752550
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.
Gast #753641
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:
1
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren