PS2-Tastatur Einbindung

Gast #3159922
Lesenswert?

Hallo,
ich hab da ein kleineres Problem:

Ich habe einen code für eine Bildschirmausgabe über VGA geschrieben, bis 
hierhin funktioniert auch alles. Allerdings würde ich jetzt gerne ein 
Viereck ("Spielfigur") steuerbar/verschiebbar und zwar mithilfe der 
Pfeiltasten auf der Tastatur machen. Mein code für das Steuerungsmodul:
1
--Steuerung
2

3
--**MAKE-Codes**
4
--Pfeiltaste Oben    63h  =  1100011
5
--Pfeiltaste Unten  60h  =  1100000
6
--Pfeiltaste Links  61h  =  1100001
7
--Pfeiltaste Rechts  6Ah  =  1101010
8

9
--**Break-Codes**
10
--Pfeiltaste Oben    F063h  =  1111000001100011
11
--Pfeiltaste Unten  F060h  =  1111000001100000
12
--Pfeiltaste Links  F061h  =  1111000001100001
13
--Pfeiltaste Rechts  F06Ah  =  1111000001101010
14

15
--**PS2 I/O**
16
--http://www.computer-engineering.org/ps2protocol/
17

18
--KBDATA            Pin  =  G19
19
--KBCLOCK        Pin  =  F20  [10 - 16,7 Khz]
20
--
21
--vert_pos      == Signal Oben
22
--vert_neg      == Signal Unten
23
--hor_neg      == Signal Links
24
--hor_pos      == Signal Rechts
25

26

27
--*************************************************--
28

29
ENTITY Steuerung IS
30

31
    PORT ( 
32
        
33
        KBclock_in   : in  STD_LOGIC;
34
        KBdata_in   : in  STD_LOGIC;
35
        vert_pos : out    STD_LOGIC;  
36
        vert_neg : out    STD_LOGIC;  
37
        hor_neg   : out    STD_LOGIC;  
38
        hor_pos   : out    STD_LOGIC    
39

40
        
41
      );
42
      
43
END Steuerung;
44

45

46
ARCHITECTURE Behavioral OF Steuerung IS
47

48
SIGNAL Oben   : STD_LOGIC := '0';
49
SIGNAL Unten   : STD_LOGIC := '0';
50
SIGNAL Links   : STD_LOGIC := '0';
51
SIGNAL Rechts   : STD_LOGIC := '0';
52

53

54

55
BEGIN
56
PROCESS (KBclock_in)
57
    BEGIN
58
    
59
    IF (KBclock_in'event AND KBclock_in='1') THEN
60
    
61
    
62
    --**Pfeiltaste oben**--
63
    
64
          --**Make**--
65
          IF (KBdata_in = "1100011") THEN 
66
        
67
          Oben <= "0000000101";
68
    
69
          END IF;
70
          
71
          --**Break**--
72
          IF (KBdata_in = "1111000001100011") THEN 
73
        
74
          Oben <= "0000000000";
75
    
76
          END IF;
77
          
78
          
79
    --**Pfeiltaste unten**--
80
    
81
          --**Make**--
82
          IF (KBdata_in = "1100000") THEN 
83
        
84
          Unten <= "0000000101";
85
    
86
          END IF;
87
          
88
          --**Break**--
89
          IF (KBdata_in = "1111000001100000") THEN 
90
        
91
          Unten <= "0000000000";
92
    
93
          END IF;
94
          
95
          
96
    --**Pfeiltaste links**--
97
    
98
          --**Make**--
99
          IF (KBdata_in = "1100001") THEN 
100
        
101
          Links <= "0000000101";
102
    
103
          END IF;
104
          
105
          --**Break**--
106
          IF (KBdata_in = "1111000001100001") THEN 
107
        
108
          Links <= "0000000000";
109
    
110
          END IF;
111
          
112
          
113
    --**Pfeiltaste rechts**--
114
    
115
          --**Make**--
116
          IF (KBdata_in = "1101010") THEN 
117
        
118
          Rechts <= "0000000101";
119
    
120
          END IF;
121
          
122
          --**Break**--
123
          IF (KBdata_in = "1111000001101010") THEN 
124
        
125
          Rechts <= "0000000000";
126
    
127
          END IF;
128
          
129
          
130
    END IF;
131
    
132
END PROCESS;
133

134

135
        vert_pos    <=    Oben;  
136
        vert_neg   <=    Unten;
137
        hor_neg     <=    Links;
138
        hor_pos     <=    Rechts;
139

140

141
END Behavioral;
142

143
--*************************************************--

Idee dahinter sollte sein das dass drücken einer Pfeiltaste den Wert von 
5 speichert und in ein anderes Modul übergibt, in welchem der Code für 
die Spielfigur ist. Dieser Wert wird also zu den vorhandenen 
"Koordinaten" (Hsync/Vsync) der Spielfigur hinzu addiert.

Nun zu meinen fragen:

1. KBCLOCK ist ein pin des PS2 Anschlusses, hat die Tastatur einen 
eigenen Frequenzgenerator oder muss ich die Frequenz mithilfe des FPGA's 
bereitstellen?

2. KBDATA: Kann es sein dass die Daten hier seriell reinkommen? Also 
müsste ich wenn ich so etwas machen will: KBdata_in = "1100011" erst 
einen Seriell->Parallelwandler nach dem Dateneingang einbauen?
Gast #3160088
Lesenswert?

Max schrieb:
> 1. KBCLOCK ist ein pin des PS2 Anschlusses, hat die Tastatur einen
>
> eigenen Frequenzgenerator

soweit mir bekannt, nein

> oder muss ich die Frequenz mithilfe des FPGA's
>
> bereitstellen?

daher, ja.

Max schrieb:
> Kann es sein dass die Daten hier seriell reinkommen?
allerdings! siehe deine entity

Max schrieb:
> erst
>
> einen Seriell->Parallelwandler

ein Schieberegister, ja
Moderator (Firma: Titel) Persönliche Seite #3161676
Lesenswert?

Markus Wagner schrieb:
> Lothar Miller schrieb:
>> Du solltest aber den Übergang zwischen den Taktdomänen im Auge
>> behalten...
> Gilt das Eintakten von 30kHz mit 30MHz FPGA Takt noch als
> Taktübergang???
Für eine amoklaufende Statemachine reicht ein einziger Taktimpuls aus. 
Und das eigentliche Problem ist nicht der PS2 Takt, sondern die Daten, 
die mit diesem Takt empfangen und asynchron weiter gegeben werden:
 http://www.lothar-miller.de/s9y/archives/64-State-Machine-mit-asynchronem-Eingang.html
#3161786
Lesenswert?

Markus Wagner schrieb:
> Max schrieb:
>> 1. KBCLOCK ist ein pin des PS2 Anschlusses, hat die Tastatur einen
>>
>> eigenen Frequenzgenerator
>
> soweit mir bekannt, nein

Doch. Bei PS/2 wird aller Takt von den Devices erzeugt, sollte wohl eben 
diese billiger machen (ein primitiver Tastatur-Mikrocontroller kann sich 
etwa einfach den Takt per Delay-Schleifen selber basteln).

Die Beschreibung auf http://www.computer-engineering.org/ ist sehr gut, 
abgesehen von ein paar Seltsamkeiten beim Timing: "Data sent from the 
device to the host is read on the falling edge of the clock signal; data 
sent from the host to the device is read on the rising edge." Ich weiß 
nicht wie der darauf kommt, alles andere was ich finden kann sagt 
erwartungsgemäß, dass alle Daten auf steigender Flanke abgetastet 
werden.

Wenn man keine Kommandos an die Tastatur senden will, reicht es Clock 
und Data einfach als Eingänge zu definieren. Pull-Ups auf 5V 
(Device-Versorgungsspannung) müssen aber auf beiden Leitungen vorhanden 
sein.
Gast #3225557
Lesenswert?

Lothar Miller schrieb:
> Für eine amoklaufende Statemachine reicht ein einziger Taktimpuls aus.
Schon klar, aber:

berndl schrieb:
> Jedes externe Signal, das nicht eine klare 'Beziehung' zu deinem
> FPGA-Takt hat, ist ein Taktuebergang!
unter einem Taktübergang verstehe ich das Übersetzen eines Taktes von 
einer Domain in eine andere.

Die 30kHz sind kein Takt sind Daten, auch wenn er sich Takt nennt.

Daten, die es einzusmpeln gilt.

Andreas B. schrieb:
> Doch. Bei PS/2 wird aller Takt von den Devices erzeugt,
war mir in der Tat neu

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