Ich versuche, Daten von einer Tastatur über den PS/2-Anschluss des Papilio One Arcade Megawing zu empfangen. Irgendwann möchte ich das von Grund auf neu implementieren, aber ich dachte, ich würde zuerst einen öffentlichen Code als eine Art Rauchtest zum Laufen bringen.
Die drei Quellen, mit denen ich gespielt habe, waren
Ich habe jedes modifiziert, indem ich die UCF-Datei in geändert habe
NET "Clk" LOC="P89" | IOSTANDARD = LVCMOS25 | PERIOD=31.25ns;
NET "Reset" LOC="P67" | IOSTANDARD=LVTTL | PULLDOWN;
NET "PS2_Clk" LOC="P91" | IOSTANDARD=LVTTL | DRIVE=8 | SLEW=FAST | PULLUP;
NET "PS2_Data" LOC="P92" | IOSTANDARD=LVTTL | DRIVE=8 | SLEW=FAST | PULLUP;
NET "LED1" LOC="P57" | IOSTANDARD=LVTTL;
NET "LED2" LOC="P53" | IOSTANDARD=LVTTL;
NET "LED3" LOC="P40" | IOSTANDARD=LVTTL;
und ich fahre LED1
direkt von PS2_Clk
, LED2
von PS2_Data
und LED3
von einem Register, das von niedrig nach hoch gehen sollte (und hoch bleiben sollte), wenn der erste vollständige Scancode gelesen wird.
Das Problem ist bei allen drei Implementierungen, was ich stattdessen bekomme
LED1
und LED2
sind durchgehend anLED3
schaltet sich nie einDie Tastatur, die ich verwende, ist eine Microsoft Natural Keyboard 4000 über einen USB-zu-PS/2-Dongle. Die Funktionstastensperr-LED auf der Tastatur leuchtet auf, wenn ich sie mit dem Papilio verbinde, damit ich zumindest weiß, dass sie Saft bekommt.
Vollständige Xilinx ISE-Projekt-Dumps sind verfügbar unter http://forum.gadgetfactory.net/index.php?/topic/1917-ps2-ports-on-arcade-megawing/
@Leor erwähnte unten, dass der PS/2-Anschluss eine Taktfrequenz von 10 KHz verwendet. Bedeutet das nicht, dass ich eine blinkende LED (mit einer Frequenz von etwa 1,6 Sekunden) mit dem folgenden Code sehen sollte:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity main is
Port ( CLK : in STD_LOGIC;
PS2_CLK : in STD_LOGIC;
LED : out STD_LOGIC);
end main;
architecture Behavioral of main is
signal counter: unsigned(13 downto 0) := (others => '0');
signal PS2_CLK_PREV : std_logic := '1';
signal LED_clamped : std_logic := '0';
begin
LED <= LED_clamped;
process(CLK) is
begin
if rising_edge(CLK) then
if not (PS2_CLK = PS2_CLK_PREV) then
counter <= counter + 1;
end if;
if counter = 0 then
LED_clamped <= not LED_clamped;
end if;
PS2_CLK_PREV <= PS2_CLK;
end if;
end process;
end Behavioral;
Denn wenn ich das versuche, leuchtet die LED immer noch dauerhaft.
PS/2 verwendet einen 10-kHz-Takt, sodass das Anschließen einer LED an die Takt- oder Datenleitungen nur dazu führt, dass die LED immer mit einer Helligkeit leuchtet, die dem Tastverhältnis des Signals entspricht.
Haben Sie versucht, den Beispielcode mit dem ISE-Simulator zu simulieren? Das würde Ihnen zumindest sagen, dass die Takt- und Datenausgänge etwas Vernünftiges tun.
Update Wenn ich den zweiten Code richtig verstehe:
Das CLK-Signal ist ein 32-MHz-Takt. Das PS2_CLK-Signal ist ein 10-kHz-Signal (PS2 erlaubt anscheinend zwischen 10 und 16 kHz - wissen Sie genau, was dieses Signal ist?), das ... irgendwo erzeugt wird?
Das zweite Stück Code, das Sie gepostet haben, geht zu:
Der von Ihnen definierte Prozess erhöht den Zähler immer dann, wenn sich PS2_CLK geändert hat.
Somit wird der Zähler einmal für jeden positiven und negativen Taktübergang auf PS2_CLK (dh bei 20 KHz) inkrementiert.
Der Zähler wird inkrementiert, bis er überläuft und auf 0 zurückgeht. Da es 14 Bit sind, bedeutet dies, dass 16384 Inkremente benötigt werden, was bei einer Inkrementrate von 20 KHz (zweimal pro Taktzyklus) 0,819 Sekunden beträgt.
Ihre LED ist nur 1, wenn der Zähler 0 ist, was alle 0,819 Sekunden für 5 uS geschieht. Das ist nicht lange genug, um zu bemerken, dass es eingeschaltet ist, und daher ist die LED im Wesentlichen 0.
Wenn die LED ständig eingeschaltet zu sein scheint, bedeutet dies, dass der Zähler konstant auf 0 steht. Das deutet darauf hin, dass PS2_CLK immer gleich PS2_CLK_PREV ist, was darauf hindeutet, dass Ihr PS2_CLK möglicherweise nichts tut. Ich würde vorschlagen, sich anzusehen, was dieses Taktsignal antreibt (ist es ein DCM, das Sie instanziiert haben? Ein einfacher Taktteiler?)
Es stellte sich heraus, dass das Problem die Kombination aus der Microsoft Natural 4000-Tastatur war, die ich zum Testen verwendete, und dem USB-zu-PS/2-Dongle. Nachdem ich eine richtige PS/2-Tastatur bekommen habe, funktionieren die Testkonfigurationen wie erwartet.
Kaktus
Kaktus