Hallo Ich hätte ein LED steuern mit eine Druck Taste, d.h. wenn ich auf der Taste drucke, sollte mein LED leuchten auch wenn ich mein Finger auf der Druck Taste weg läßt. . ich habe so etwas geschrieben aber funktioniert natürlich nicht. process (clock) if rising_edge(clock) then if push = ‚1‘ then led <= ‚1‘; end if; end if;
Dann ziehe am besten die Testbench Handschuhe an. Mal im Ernst, was erwartest du bei deinem Code. Du schaltest led auch auf H , wenn die Taste gedrückt ist. process (clock) if rising_edge(clock) then if push = '1' then led <= not led; end if; end if; Mit dem code, solltest du die LED toggeln können. Es ist dann aber zufällig, in welchem Zustand die LED bleibt, je nach dem wann du los läßt. Was du brauchst ist ein Latch. Oder machst das ganze per Flag.
marco: Der Code ist in Ordnung. Wenn "push" bei einer Taktflanke '1' ist, dann wird das FlipFlop "led" für immer und ewig gesetzt. Der Fehler muss woanders liegen. Zeige doch mal den gesamten Code. Gast: Getoggelt werden soll doch gar nicht (dazu müsste man eine Entprellung implementieren). Und was ein Latch bei der ganzen Sache helfen soll verstehe ich nicht.
Probier doch mal folgendes aus:
1 | process
|
2 | begin
|
3 | |
4 | wait until rising_edge(clock); -- in dem Fall nicht wirklich noetig |
5 | |
6 | led <= push; |
7 | |
8 | end process; |
Damit bekommst Du auch die Polarität Deines Tasters raus. Rick P.S.: Das ucf-File stimmt auch schon?
Rick Dangerus wrote: > Damit bekommst Du auch die Polarität Deines Tasters raus. Leider nur relativ zur Polarität der LED ;)
grüss alle, hier mein programm: Allgemein soll mein rotary_press für Aktivierung der „Slot“ oder der Channel dienen. Wenn rotary_press gleich null d.h. nicht gedrückt soll „slot laufen und wenn gedrückt dann „ channel“. nachher soll im Zustand „channel wieder gedruckt um „channel“ zu bestätigen und wieder im Zustand "Slot„ zurückkehren. ----Entprellung mein taste rotary_press PROCESS(clock, count) BEGIN IF(count=250000) THEN count<=0; ELSIF(clock'event AND clock ='1') THEN if(count=0) THEN buttonclk <= not buttonclk; END IF; count<=count+1; END IF; END PROCESS; PROCESS(clock, rotary_press, buttonclk) BEGIN IF(buttonclk'event AND buttonclk='1') THEN state(3 downto 1) <= state(2 downto 0); state(0) <= rotary_press; IF( state = "0000") THEN hit <= '1'; ELSE hit <= '0'; END IF; END IF; END PROCESS; ---- validierung: process (clock, hit_p) begin if rising_edge(clock) then if hit = '1' then set <= '1'; else set <= '0'; end if; if set = '1' then merke5 <= '1'; output_control <= '1';-- control LED else merke5 <= '0'; output_control <= '0'; end if; end if; end process; . . . . . . process begin if set = '0' then--slot aktiv state_lcd <= data1; merke4 <= '0'; elsif set = '1' then--Channel aktiv state_lcd <= data7; merke4 <= '1'; end if; . . . . . end process
Ich sag es nochmal: Schreib Dir Testbenches und simuliere die Einzelteile bzw. Teilsysteme. Und wenn Du Fragen hast, kannst Du die Simulationsergebnisse hier posten. Rick
Ja, schreib dir einen oder mehrere Testbenches. Der Code ist mir zu unübersichtlich um den mal schnell durchzudenken. Folgendes solltest du korrigieren: > IF(count=250000) THEN > count<=0; > ELSIF(clock'event AND clock ='1') THEN Sowas macht man nicht. Entweder ist das ein getakteter Prozess oder ein kombinatorischer, aber nicht so ein Kuddelmuddel. Steck die Abfrage count=250000 in den getakteten Teil. > PROCESS(clock, rotary_press, buttonclk) > validierung: process (clock, hit_p) Bei getakteten Prozessen gehört NUR clk und ggf. der asynchrone Reset in die sensitivity list, sonst nichts. Außerdem würde ich mal eine ordentliche Einrückung vornehmen.
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.