Ich entwerfe eine Tastatur in VHDL. Alles funktioniert gut, wenn nur eine einzige Taste gedrückt wird. Ich scanne jede Spalte nach einem Tastendruck in einer Zustandsmaschine und wenn keine Taste gedrückt wird, schalte pin4pin6pin7pin2 = "0000"
ich zum Scannen der nächsten Spalte in den nächsten Zustand um. So stelle ich die Spalten der pin3pin1pin5
Reihe nach "001"
, "010"
und "100"
.
Beim Scannen pin3pin1pin5
wie "001"
und wenn pin4pin6pin7pin2
ist "0100"
dann „9“ einfach gedrückt wird . Ich deklariere in VHDL pin4pin6pin7pin2
als Eingabe- und pin3pin1pin5
als Ausgabeports. Wenn ich drücken 6 und 9 zugleich pin6
und pin7
sind high
. Die erste gedrückte Taste wird gelesen, die zweite wird ignoriert. Wenn ich 3 und 7 gleichzeitig drücke, gewinnt der erste, der einige ms vor dem Sieg gedrückt wurde, und die erste Taste wird gelesen, die zweite Taste wird ignoriert pin2
und pin4
ist high
.
Hier ist der schwierige Teil. Wenn ich gleichzeitig 4 und 6 drücke, erwarte ich pin7
es, high
aber es wird low
und pin4pin6pin7pin2 = "0000"
, was ich nicht verstehe, wie und warum. Da "0000"
erkannt wird, dass keine Taste gedrückt wurde, springt die Zustandsmaschine von Zustand zu Zustand. Wenn man 4 und 6 gedrückt hält, wenn man 4 mehrmals drückt und verlässt, wird erkannt, dass 6 mehrmals gedrückt wird, was ein großer Fehler ist . Ich würde mich freuen, wenn Sie mir beim Debuggen helfen können!
Dasselbe passiert mit "1" und "2", dasselbe mit "7" und "8" nur für die Schlüssel in derselben Zeile. Da dies ein laufendes Projekt ist, kann ich meinen VHDL-Code nicht online stellen :( Ich würde mich freuen, wenn Sie mir Tipps geben können, um dies zu überwinden!
Unten lade ich meinen Code nicht auf das Board hoch, es wird kein Code ausgeführt. Bei Pin5
einmaligem Drücken auf Masse wird durch einmaliges Drücken von 1,2,4,5,7,8, *, 0 die Pin3
LED nicht eingeschaltet, aber wenn ich 6 und dann 4 gleichzeitig drücke, leuchtet die Pin3
LED und die Pin7
LED leuchtet weiterhin Wenn mein Code ausgeführt wird, geschieht dies nicht. Vielleicht habe ich etwas falsch angeschlossen und zum Glück Pin7
ist es an, ich weiß nicht ...
Unten finden Sie die Schaltpläne der Tastaturplatine:
quelle
Antworten:
Die kurze Antwort:
Kehren Sie Ihre Logik um. Fahren Sie die Spaltenauswahlzeilen mit Open-Drain- Logik (oder Open-Collector- Logik), wobei die ausgewählte Spalte nach unten gezogen wird und die nicht ausgewählten Spalten schweben. Wenn Sie sich eine Zeile ansehen, wird ein Tastendruck durch eine '0' erkannt. Nicht gedrückte Tasten werden durch eine '1' erkannt.
Nun die Details:
Wie EEIngenuity hervorhebt, führt das Drücken von 2 Tasten in derselben Zeile zu einem Kurzschluss zwischen den entsprechenden Spalten. Dieses (und andere Probleme mit mehreren Tastendrücken) wird normalerweise in einer Tastaturmatrix durch Hinzufügen einer Diode in Reihe mit jedem Schalter überwunden .
Da das Hinzufügen von Dioden für Sie keine Option ist, müssen Sie die Ausgänge Ihrer inaktiven Spaltenauswahl schweben lassen, um zu vermeiden, dass Sie versuchen, sie auf die entgegengesetzte Polarität wie Ihre aktive Spaltenauswahl zu bringen. Dies erfolgt mithilfe der Open-Drain-Logik. Wenn Ihre Spaltenauswahl direkt an eine CPLD oder ein FPGA gebunden ist, sollten Sie dies in Ihrem VHDL-Code erreichen können.
Das Foto in Ihrer Frage zeigt, dass Sie in jeder Spalte und in jeder Zeile einen Pull-up-Widerstand haben. Die Klimmzüge an den Säulen sind unnötig, schaden aber nichts. Die Klimmzüge in jeder Reihe stellen einen hohen Zustand sicher, es sei denn, sie werden vom Open-Drain-Treiber auf der Säule ausgewählt (über einen geschlossenen Schalter).
Ich musste einige Annahmen über Ihre Schaltung treffen, da Sie keinen vollständigen Schaltplan oder Ihren VHDL-Code angegeben haben. Du sagst
Auf dem von Ihnen bereitgestellten Foto sind jedoch Pull-up-Widerstände dargestellt. Dies bedeutet, dass Sie bereits irgendwo eine logische Inversion haben, möglicherweise in Ihrem VHDL-Code oder (weniger wahrscheinlich) Invertern zwischen Ihren Zeilen und Ihrem logischen Gerät (CPLD oder FPGA).
Bearbeiten:
Gemäß Ihrem Kommentar verwenden Sie in Ihren Beschreibungen eine negative Logik: "0000" zeigt an, dass alle vier Pins hoch sind usw. Dies ist der Fall, vorausgesetzt, die Spaltenauswahl und die Zeilensignale gehen direkt von Anschluss 2 Ihres Schaltplans zum FPGA Befolgen Sie meine Anweisungen oben, indem Sie die Open-Drain-Logik für die Spaltenauswahlausgänge in Ihrem FPGA verwenden.
Ich bin kein VHDL-Experte, aber ich habe dies von Xilinx gefunden :
Beachten Sie auch, dass in Ihrem Schaltplan alle LEDs rückwärts verdrahtet dargestellt sind. Die Anoden gehen zu den Strombegrenzungswiderständen und die Kathoden gehen zu den Signalleitungen. Die LEDs leuchten, wenn die Signalleitungen niedrig sind.
quelle
pin4pin6pin7pin2 = "0000"
kein Tastendruck tatsächlich erfolgt1111
. In meiner Frage 1s sollte 0 sein, 0s sollte 1s sein, ich habe versucht, die Frage ein wenig zuout <= 'pin3' when din='1' else '0';
Da Sie VHDL verwenden und eine asynchrone Eingabe haben, schreibe ich diese Antwort, um sicherzustellen, dass Sie Vorsichtsmaßnahmen getroffen haben. Ich bin mir nicht sicher, ob dies Ihr Problem ist, aber es könnte sehr gut sein.
Siehe eine Frage, die ich vor einiger Zeit gestellt habe: VHDL: Empfangsmodul schlägt beim Zählen von Bits zufällig fehl
Jetzt sagst du das:
Welches ist etwas ähnlich zu dem, was ich konfrontiert war. Ich hatte ein Problem, bei dem meine Zustandsmaschine Zustände übersprang, was unmöglich schien.
Wenn Sie die Antworten auf die oben verlinkte Frage lesen, werden Sie feststellen, dass empfohlen wird, der Eingabezeile einen Synchronisierer hinzuzufügen, bevor dieser in Ihre Zustandsmaschine eingespeist wird. Dies wird normalerweise mit zwei D-Flip-Flops in Reihe erreicht:
Wenn Ihre Tasteneingabe nicht mit Ihrer Hardware synchronisiert wird, treten sehr bizarre Probleme auf, die ich bei meinem N64-Projekt festgestellt habe. Das Hinzufügen dieses kleinen Stücks HW war fast wie Magie.
Überprüfen Sie daher zunächst, ob Ihre Eingänge synchronisiert werden.
quelle
async_in
mit 3 Taktzyklen verzögert ist, aber sein Wert und alles gleich ist?Das ist eine interessante Frage! Der Grund, warum Sie beim Drücken von Taste 4 und Taste 6 einen Tiefpunkt an Pin7 sehen, liegt an Pin3 und Pin5.
Um es weiter zu erklären, werden Pin3 und Pin5 niemals gleichzeitig hoch sein - einer von ihnen wird immer ein Weg zur Erde sein (gemäß Ihrem Design). Wenn Sie also die Tasten 4 und 6 drücken, erstellen Sie einen Erdungspfad für Pin7.
Siehe Bild:
quelle