VHDL - Debounce-Taste Drücken
Habe ich die folgende Schaltfläche drücken Sie die Logik in meinem code. Ich habe versucht entprellung es mit einer wait-Verzögerung, aber der compiler wird nicht zulassen. Ich habe vier Taster auf meinem FPGA, das den "Schlüssel" array unten reflektiert:
process(clock)
begin
if rising_edge(clock) then
if(key(3)/='1' or key(2)/='1' or key(1)/='1' or key(0)/='1') then --MY ATTEMPT AT DEBOUNCING
wait for 200 ns; ----MY ATTEMPT AT DEBOUNCING
if (key(3)='1' and key(2)='1' and key(1)='0' and last_key_state="1111" and key(0)='1') then
...
elsif (key(3)='1' and key(2)='1' and key(1)='1' and key(0)='0' and last_key_state="1111") then
...
elsif (key(3)='0' and key(2)='1' and key(1)='1' and key(0)='1' and last_key_state="1111") then
...
elsif (key(3)='1' and key(2)='0' and key(1)='1' and key(0)='1' and last_key_state="1111") then
...
end if;
last_key_state<=key;
end if;
end if;
end process;
Kann jemand geben einige wirklich einfache Beispiel-code zeigt, wie konnte ich debounce-ein setup, wie ich Sie schon oben?
InformationsquelleAutor John Roberts | 2013-01-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erhalten Sie die Fehlermeldung wegen warten ... warten ist nicht synthesizeable.
Ich würde es mit einem einfachen Zähler. So können Sie den gleichen code für verschiedene Takt-Geschwindigkeiten durch die Anpassung der Zähler.
Ihren code produzieren kann, ein weiteres problem.
Was wird passieren, wenn Sie eine Taste freigegeben wird, so dass Ihre Eingabe ist .. key = "0000" .. Recht haben Sie nie bekommen Sie Ausgang. Vielleicht wird es funktionieren 99 von 100 mal, aber man kann einen wirklich schwer zu finden Fehler.
wait for rising_edge(clk)
zum Beispiel istKönntest du erklären, was du damit meinst "Was wird passieren, wenn Sie eine Taste freigegeben wird, so dass Ihre Eingabe ist .. key = "0000" .."? Mein Knopf ist so angelegt, dass ein Wert von 0 bedeutet, dass es gedrückt wird, und 1 bedeutet, es ist nicht gepresst.
du hast Recht Martin die "nicht" fehlt
die last_key_state<=key Zuordnung ist in Ihrem if(Taste(3)... dann, auch warten xxxns funktionieren würde, kann es passieren, dass die Zuordnung kann nicht gemacht werden, weil die if-Anweisung false ist
InformationsquelleAutor gatherer
Gut, wenn Sie darüber nachdenken, wie würden Sie tun dies mit realen Elektronik, die Sie verwenden wahrscheinlich ein Kondensator.. die hat eine Ladezeit. Gleiche Idee gilt hier, herauszufinden, die Zeit, die dein Schalter Prellen (in der Regel eine Funktion der Taktfrequenz) und dann tatsächlich legen die register.
Einfaches Beispiel Mit einem 4-Bit-Schieberegister
Also Sie würde setzen Sie diese zwischen Ihrem switch und einer anderen Logik-Blöcke
Seine im Grunde verzögert sich das signal 4 Takte (was Sie versucht haben zu tun mit dem warten).
Das ist nur eine andere syntax für die Uhr steigenden und Uhr fallen. Mit deiner Schaltung könnte man nur verwenden die steigende Flanke syntax wenn Sie möchten, besser, ich werde aktualisieren, die Antwort.
Vielen Dank für diese. Ein paar Fragen: durch die vor-prallte signal, meinst du die Taste signal zunächst abgetastet, wenn die Taktflanke steigt? Auch, denken Sie, es würde mehr Sinn machen in meinem Fall zu machen "PB_DEBOUNCED" eine variable eher als ein signal? So kann ich etwas wie "wenn(PB_DEBOUNCED='1') then ...den rest von meinem code... end if;" sofort nach dem code, den Sie gerade gebucht.
PB ist die prebounced signal, ja. Sie könnten das tun, aber Sie können auch einfach überprüfen, ist der logische Pegel vom signal als auch.
InformationsquelleAutor Zach Leighton
Andere haben gezeigt, dass der Weg mit den Zähler... müssen Sie auch synchronisieren das signal um die Uhr vor der Fütterung es an der Theke, ansonsten gelegentlich, das signal erhalten, um verschiedene Teile des Zählers, die zu verschiedenen Zeiten, und der Zähler zählt falsch.
Ob das geht, hängt von der Anwendung - wenn die richtige Bedienung ist wichtig, es ist wichtig, synchronisieren Sie richtig!
InformationsquelleAutor Martin Thompson