www.mikrocontroller.net

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


Autor: marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du auch eine Testbench dazu?

Rick

Autor: marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, mein LED leuchtet nur wenn mein Finger auf Taste ist.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier doch mal folgendes aus:
process
begin

  wait until  rising_edge(clock); -- in dem Fall nicht wirklich noetig
  
  led <= push;

end process;
Damit bekommst Du auch die Polarität Deines Tasters raus.

Rick

P.S.: Das ucf-File stimmt auch schon?

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

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

Leider nur relativ zur Polarität der LED ;)

Autor: marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.