Forum: FPGA, VHDL & Co. Debounce-Entity und Architecture in Zusammenhang mit Sate-Machine nutzen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Ulrich R. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin noch ein Neuling im VHDL programmieren.
Ich besitze ein ARTY A7 mit ARTIX-7 35T.

Ich versuch mir aus Code-Beispielen gerade ein kleines Programm zu 
schreiben, das beim ersten Mal Schalter schieben eine LED einschaltet 
und nach 3 mal Schiebeschalter betätigen diese LED wieder ausschaltet.

Ich wollte zum Spaß den Debounce-Code von Lothar Miller nutzen um den 
Schiebeschalter zu entprellen.

Mir ist klar, dass es sicher deutlich einfacher geht, aber ich würde 
gerne mal prototypenhaft eine andere Entity und Architecture in der 
Haupt-Architecture nutzen.


Die LED leuchtet zwar, aber deutlich schwächer als sonst, daher kommen 
sich da wohl ein paar Signale in die Quere.


Ich gebe zu, dass ich offenbar die Nutzung von Components nicht so ganz 
überrissen habe, wie müsste ich denn den Code umschreiben, um die 
Debounce-Entity und Architecture quasi als Modul nutzen zu können?


Beste Grüße
Ulrich

Anbei mein Code
----------------------------------------------------------------------------------


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;

entity Debounce is
    Port ( clk    : in  STD_LOGIC;
           keyin  : in  STD_LOGIC;
           keyout : out  STD_LOGIC);
end Debounce;

architecture Behavioral_Debounce of Debounce is
signal keydeb : std_logic := '0';
signal debcnt : integer range 0 to 1000 := 0;
begin
   process begin
      wait until rising_edge(clk);
      -- XOR
      if (keyin=keydeb) then debcnt <= 0;
      else                   debcnt <= debcnt+1;
      end if;
      -- Latch
      if (debcnt=1000) then keydeb <= keyin; 
      end if;
   end process;
   keyout <= keydeb;

end Behavioral_Debounce;




----------------------------------------------------------------------------------

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.std_logic_unsigned.all;


entity ArtyA7Controller is
    Port ( 
           SW       : in  STD_LOGIC_VECTOR (3 downto 0);
           CLK       : in  STD_LOGIC;
           LED       : out STD_LOGIC_VECTOR (3 downto 0)
        );
end ArtyA7Controller;



architecture Behav of ArtyA7Controller is

    type state_t is ( Tasteneingabe, Pulszaehler); 
    signal Zustandsmaschine : state_t := Tasteneingabe; 
    --signal DebounceIn    : STD_LOGIC := '0';
    signal DebounceOut    : STD_LOGIC := '0';
    
    signal Zaehler         : integer RANGE 0 to 1000000000; 
    

    component Debounce
    Port ( clk    : in  STD_LOGIC;
           keyin  : in  STD_LOGIC := '0';
           keyout : out  STD_LOGIC := '0');
    end component;

begin

debounce1: Debounce 
Port Map (
    clk => clk,
    keyin => SW(0),
    keyout => DebounceOut
);



Prozess1:  process(CLK) begin
if rising_edge (CLK) then

    case Zustandsmaschine is

    when Tasteneingabe =>
        
        if DebounceOut = '1' then
            LED(0) <= '1';
            Zustandsmaschine <= Pulszaehler;
        else
            Zustandsmaschine <= Tasteneingabe;
        end if;
       
    when Pulszaehler =>
        
        Zaehler <= Zaehler +1;
        if Zaehler > 2 then
            LED(0) <= '0';
            Zustandsmaschine <= Tasteneingabe;
       else
            Zustandsmaschine <= Tasteneingabe;
       end if;
       
       when others =>
            LED(3) <= '1';
         
       
    end case;
end if;
end process;

end architecture;

von Duke Scarring (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Welche Frequenz hat den Dein Takt?

Ulrich R. schrieb:
> use IEEE.std_logic_unsigned.all;
Bitte verwende nur die ieee.numeric_std.all, auch wenn diverse Bücher 
und Codebeispiele was anderes suggerieren. Außer Du weisst genau, was Du 
tust.

Möglicherweise hast Du auch noch einen logischen Fehler in Debounce.
Hast Du mal eine Testbench dazu, damit man das in der Simulation 
nachvollziehen kann?

Duke

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Ulrich R. schrieb:
> Die LED leuchtet zwar, aber deutlich schwächer als sonst
Und zwar nur, wenn du die Taste drückst? Das wäre ganz einfach 
erklärbar, man sieht es in einer Simulation sicher schnell, wie der bei 
gedrückter Taste ständig zwischen den Zuständen hin- und herspringt.

Noch ein Wort zum überflüssigen "when others", das dir der Synthesizer 
sicher als "nicht erreichbar" vor den Latz knallt:
http://www.lothar-miller.de/s9y/categories/25-when-others

Duke Scarring schrieb:
> Bitte verwende nur die ieee.numeric_std.all, auch wenn diverse Bücher
> und Codebeispiele was anderes suggerieren.
Immerhin meidet Peter Ashenden in seinen Büchern die alten Synopsys Libs 
wie der Teufel das Weihwasser.

: Bearbeitet durch Moderator

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.

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