Forum: FPGA, VHDL & Co. LED steuern mit Druck-Taste


von marco (Gast)


Lesenswert?

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;

von Rick Dangerus (Gast)


Lesenswert?

Hast Du auch eine Testbench dazu?

Rick

von marco (Gast)


Lesenswert?

Nein, mein LED leuchtet nur wenn mein Finger auf Taste ist.

von Gast (Gast)


Lesenswert?

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.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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.

von Rick Dangerus (Gast)


Lesenswert?

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?

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Rick Dangerus wrote:
> Damit bekommst Du auch die Polarität Deines Tasters raus.

Leider nur relativ zur Polarität der LED ;)

von marco (Gast)


Lesenswert?

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

von Rick Dangerus (Gast)


Lesenswert?

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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.