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