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.
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!
@ 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
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.