Hallo, guten Tag. Ich habe diese PS2-VHDL von LM.
Nun möchte ich das Echo abfangen, weil immer ein Tastendruck
gesendet wird beim loslassen und es werden dann immer 2 Buchstaben auf
dem Screen gedruckt.
Wie kann man es durch eine Abfrage ändern, das nur der Tastendruck
angenommen wird oder nur das Echo ? Ändern in der eigentlichen PS2-VHDL
möchte ich nichts sondern in der VHDL die den Tastendruck annimmt.
1 | library ieee;
|
2 | use ieee.std_logic_1164.all;
|
3 | use ieee.numeric_std.all;
|
4 |
|
5 | entity ps2_keyboard1 is
|
6 | port (
|
7 | ps2_data : in std_logic;
|
8 | ps2_clk : in std_logic;
|
9 | rxdata : out std_logic_vector(7 downto 0);
|
10 | rxactive : out std_logic;
|
11 | dataready : out std_logic; -- handshake-signal: daten bereit
|
12 | datafetched : in std_logic; -- handshake-signal: daten übernommen
|
13 | clk : in std_logic
|
14 | );
|
15 | end ps2_keyboard1;
|
16 |
|
17 | architecture behavioral of ps2_keyboard1 is
|
18 | signal rxtimeout : integer range 0 to 500000 := 0;
|
19 | signal rxregister : std_logic_vector(10 downto 0) := (others=>'1');
|
20 | signal datasr : std_logic_vector(1 downto 0) := (others=>'1');
|
21 | signal clksr : std_logic_vector(1 downto 0) := (others=>'1');
|
22 |
|
23 | type ps2rxstatetype is (idle, receive, ready);
|
24 | signal ps2rxstate : ps2rxstatetype := idle;
|
25 |
|
26 | begin
|
27 | process begin
|
28 | wait until rising_edge(clk);
|
29 | rxtimeout <= rxtimeout+1;
|
30 | datasr <= datasr(0) & ps2_data;
|
31 | clksr <= clksr(0) & ps2_clk;
|
32 |
|
33 | if (clksr = "10") then -- fallende flanke am ps2_clk
|
34 | rxregister <= datasr(1) & rxregister(10 downto 1);
|
35 | end if;
|
36 |
|
37 | case ps2rxstate is
|
38 | when idle =>
|
39 | rxregister <= (others=>'1');
|
40 | rxactive <= '0';
|
41 | dataready <= '0';
|
42 | rxtimeout <= 0;
|
43 | if (datasr(1) = '0' and clksr(1) = '1') then
|
44 | ps2rxstate <= receive;
|
45 | rxactive <= '1';
|
46 | end if;
|
47 |
|
48 | when receive =>
|
49 | if (rxtimeout = 500000) then
|
50 | ps2rxstate <= idle;
|
51 | elsif (rxregister(0) = '0') then
|
52 | dataready <= '1'; -- scancode empfangen
|
53 | rxdata <= rxregister(8 downto 1);
|
54 | ps2rxstate <= ready;
|
55 | end if;
|
56 |
|
57 | when ready => -- warten, bis daten abgeholt sind
|
58 | if (datafetched='1') then
|
59 | ps2rxstate <= idle;
|
60 | dataready <= '0';
|
61 | rxactive <= '0';
|
62 | end if;
|
63 | end case;
|
64 |
|
65 | end process;
|
66 | end behavioral;
|
Danke.
Gruss