Forum: FPGA, VHDL & Co. PS2-Tastatur Einbindung


von Max (Gast)


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?

von Schlumpf (Gast)


Lesenswert?

Wikipedia erklärt es eigentlich ganz gut...

http://de.wikipedia.org/wiki/PS/2-Schnittstelle

von Michael W. (Gast)


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

von Max (Gast)


Lesenswert?

vielen dank!

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


Lesenswert?

Du solltest aber den Übergang zwischen den Taktdomänen im Auge 
behalten...

Wenn du dann mal auf die Nase gefallen bist (zu erkennen am "seltsamen 
Verhalten" deines Designs), dann kannst du dir mal die Lösung ansehen:
 http://www.lothar-miller.de/s9y/categories/55-PS2

von Josef G. (bome) Benutzerseite


Lesenswert?

Der Takt der PS/2-Schnittstelle ist aus der Sicht des FPGA
ein Eingang, jedenfalls dann, wenn man Zeichen einliest
und nicht Steuerbefehle zur Tastatur sendet. Man muss
den Takt per Über-Abtastung abfragen und auswerten.

von Michael W. (Gast)


Lesenswert?

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

von berndl (Gast)


Lesenswert?

Markus Wagner schrieb:
> Gilt das Eintakten von 30kHz mit 30MHz FPGA Takt noch als
> Taktübergang???

Jedes externe Signal, das nicht eine klare 'Beziehung' zu deinem 
FPGA-Takt hat, ist ein Taktuebergang!

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


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

von Andreas B. (andreas_b77)


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.

von Michael W. (Gast)


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

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.