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


von Freddy (Gast)


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.

von gast (Gast)


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!

von Falk B. (falk)


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

von Freddy (Gast)


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?

von Mathi (Gast)


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.

von der mechatroniker (Gast)


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'?

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.