Ecoo-Signal vom PS2 abfangen.

#3869630
Lesenswert?

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
Moderator (Firma: Titel) Persönliche Seite #3869647
Lesenswert?

Peter Bierbach schrieb:
> Nun möchte ich das Echo abfangen, weil immer ein Tastendruck gesendet
> wird beim loslassen
Und voraus der Break-Code. Du musst dir also nur merken, dass/wenn ein 
F0 gekommen ist, und dann den folgenden Scancode verwerfen.

> oder nur das Echo ?
Was machst du eigentlich bisher mit dem Break-Code?

Lattice User schrieb:
> Wenn du Lothars Seite zu PS2 ganz gelesen hättest, wäre dir aufgefallen
> dass er ganz unten noch weitere Varianten hat, auch eine mit Auswertung
> von Make/Break.
Echt? Muss ich mir mal wieder ansehen...   ;-)
Moderator (Firma: Titel) Persönliche Seite #3869846
Lesenswert?

Peter Bierbach schrieb:
> von deinem Programm
Schon wieder dabei, mit VHPL zu programmieren?

> Wie macht man diese Abfrage, das der Code der nach dem F0 kommt
> wegschmeißt?
So, wie ich es dort gemacht habe: 
http://www.lothar-miller.de/s9y/archives/75-PS2-Tastatur.html in 
PS2_Simple.zip

> Es läuft ja in einer Abfrage die immer wiederholt wird.
Nimm ein Dateivergleicher-Tool und vergleiche die Datei im gerade 
genannten Archiv mit der im PS2_Simplest.zip. Du wirst den Unterschied 
ganz klar erkennen...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren