Forum: FPGA, VHDL & Co. Ecoo-Signal vom PS2 abfangen.


von Peter B. (funkheld)


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

: Bearbeitet durch User
von Lattice User (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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...   ;-)

: Bearbeitet durch Moderator
von Peter B. (funkheld)


Lesenswert?

Hmm..., also:

Tastencode-Break-Tastencode
und Break abfangen von deinem Programm oben ?

Wie macht man diese Abfrage, das der Code der nach dem F0 kommt 
wegschmeißt?
Es läuft ja in einer Abfrage die immer wiederholt wird.

Danke.
Gruss

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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...

von Peter B. (funkheld)


Lesenswert?

Jup, danke.

Da mich der Dauertastendruck auch stört , habe ich eine Abfrag gemacht 
damit der Ascii beim loslassen der Taste angenommen wird, also 
Drücken/Los.

Jetzt kann ich schonmal meinen VGA-Text (80x30) darstellen mit dem FPGA 
per PS2-Tastatur auf dem DE0-Board und DE1-Board.

Gruss

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.