DOKUMENTACJA PROJEKTU

Transkrypt

DOKUMENTACJA PROJEKTU
AKADEMIA GÓRNICZO-HUTNICZA w Krakowie
KATEDRA ELEKTRONIKI
DOKUMENTACJA
PROJEKTU
Projekt z przedmiotu Sprzętowa Implementacja Algorytmów:
„Dekoder klawiatury na PS/2”
Prowadzący:
Dr inż. Paweł Russek
Wykonali:
Bogdan Tabor
Piotr Stawiarski
Elektronika, IV rok AGH
]
1 Wstęp teoretyczny
Poniżej jest przedstawiony wtyk PS/2:
Male
Female
(Plug)
(Socket)
6-pin Mini-DIN (PS/2):
1 - Data
2 - Not Implemented
3 - Ground
4 - +5v
5 - Clock
6 - Not Implemented
Przy czym częstotliwość przebiegu zegarowego z klawiatury zawiera się w przedziale
10-16.7 kHz.
Naciśnięcie klawisza na klawiaturze lub też jego puszczenie jest sygnalizowane
poprzez wysłanie do Hosta (w naszym przypadku komputer klasy PC) sekwencji
odpowiednich ramek. Sekwencje te zostały przedstawione w dołączonej do dokumentacji
tabeli. Zawiera ona pary MAKE CODE oraz BREAK CODE dla każdego klawisza. MAKE
CODE to ramki wysyłane przy naciśnięciu klawisza a BREAK CODE przy jego puszczeniu.
Poniżej przedstawiony jest sposób wysyłania ramki DATA do Host’a, w
synchronizacji z opadającym zboczem zegara CLOCK (z klawiatury):
Poniższe przebiegi obrazują wysłanie kodu klawisza „Q” (15h) (MC). Chan A
odpowiada zegarowi z klawiatury natomiast Chan B przedstawia ramkę wysyłaną w
synchronizacji z tym zegarem:
--Należy zauważyć, że w przypadku przytrzymywania klawisza ciągle jest wysyłany jest
jego MAKE CODE.
2. Opis układu zaimplementowanego w module XCV300PQ240.
Głównym plikiem projektu jest little.bde, jest to tzw. top, zawiera on wszystkie pliki
składające się na cały program. Little.bde posiada cztery wejścia, są to: KBDATA, KBCLK,
CLK i RST. Dwa pierwsze wejścia to sygnały pochodzące wprost z klawiatury, która po
naciśnięciu klawisza wysyła bity w ramce, transmisja ta jest synchronizowana jej własnym
zegarem. Wyjściem elementu tworzą dwie magistrale wysyłające równolegle siedmiobitowe
ramki sterujące wyświetlaczami segmentowymi oraz dziesięciobitowe wyjście LEDY, które
ma za zadanie zapalać linijkę dziesięciu diod świecących.
Pierwszy stopień to kbdecoder, jest to układ, który czyta szeregowo podawane bity z
klawiatury, bity składane są w jedenastobitowe ramki. Z jedenastobitowej ramki osiem bitów,
które tworzą właściwy kod klawisza, zostają równolegle wyprowadzane. Odczytywanie
bitów z wejścia KBDATA jest synchronizowane zegarem generowanym także przez
klawiaturę, podawanym na wejście KBCLK.
RST : in STD_LOGIC;
--sygnal zerujacy
KBDATA : in STD_LOGIC; --dana wysylana z klawiatury
KBCLK : in STD_LOGIC; --zewn. zegar z klawiatury
DATA : out STD_LOGIC_VECTOR(7 downto 0) --8 bitowe dane wyslane z klaw.
Drugi stopień: decision odbiera ośmiobitową ramkę DATAIN, sprawdza czy ramka
jest różna od F0 lub E0, następnie w zależności od wyniku komparacji zapisuje ramkę do
rejestru FRAME1 lub FRAME2. Jeżeli ramka jest równa E0 lub F0 zapisujemy ją do
odpowiedniego rejestru Frame (traktujemy jako BREAK CODE), gdy jest różna do E0 i F0
(traktujemy jako MAKE CODE). Sygnał wyjściowy OK sygnalizuje ważność danych na
wyjściach FRAME1, FRAME2, aktywny jest stanem wysokim.
DATAIN : in STD_LOGIC_VECTOR(7 downto 0); --8 bitowe dane wyslane z klaw.
FRAME_1 : inout STD_LOGIC_VECTOR(7 downto 0);
FRAME_2 : inout STD_LOGIC_VECTOR(7 downto 0);
OK : inout STD_LOGIC
Oprócz tego do pamiętania ramki poprzedniej w przypasku otrzymywania BREAK
CODE (2 – ie ramki) wykorzystywane są sygnały:
signal WAIT_FOR : STD_LOGIC;
signal TEMP : STD_LOGIC_VECTOR(7 downto 0);
Trzeci blok ps22ascii posiada wejścia:
CLK : in STD_LOGIC;
FRAME1 : in STD_LOGIC_VECTOR(7 downto 0);
FRAME2 : in STD_LOGIC_VECTOR(7 downto 0);
OK : in STD_LOGIC;
RST :in STD_LOGIC;
oraz wyjścia:
ASCIIO : out STD_LOGIC_VECTOR(3 downto 0);
ASCIIY : out STD_LOGIC_VECTOR(3 downto 0);
LEDY : out STD_LOGIC_VECTOR(9 downto 0)
Na podstawie wejść FRAME1, FRAME2 i OK analizuje on swoją tablice
przekodowań i na jej podstawie wysyła na swoje wyjścia ASCII,ASCII i LEDY odpowiedni
ciąg binarny. Ramka standardu PS/2 zostaje zamieniona na kod ASCII, duże litery i cyfry w
kodzie ASCII mają odpowiedniki w postaci liczb dwucyfrowych, więc można łatwo je
wizualizować na wyświetlaczach segmentowych w jakie jest wyposażony zestaw
uruchomieniowy. Przekodowanie nie jest jednak typowym zapisem kodu ASCII w postaci
binarnej, każda z dwóch cyfr kodowana jest oddzielnie na czterech bitach, daje to w sumie 8
bitów, cztery starsze bity podawane są na wejście dekodera ascii2seg, a młodsze cztery bity
na wejścia dekodera ascii2segy.
Przekodowanie realizuje proces coder, którego część zamieszczona została poniżej:
coder:process(CLK,RST,FRAME1,FRAME2,OK)
begin
if (RST='1') then
ASCIIO <= "0000";-- enter your statements here -ASCIIY <= "0000";
LEDY <= "0000000000";
elsif (CLK'event and CLK='0') then --dane sa wysylane wraz z opadajacym zboczem KBCLK
if(FRAME1=x"1C" and FRAME2=x"00" and OK='1') then
--A
ASCIIo <="0110";
ASCIIY <="0101";
--65 CZTERY BITY NA 6 I CZTERY BITY NA 5
LEDY <= "0000000000";
itd dekodujemy wszystkie klawisze liter i cyfr.……..
elsif(FRAME1=x"E0" or FRAME2=x"F0")then
LEDY <="1111111111";--diody zapalone
end if;
end if;
end process coder;
Wykonanie instrukcji warunkowej if powoduje zdekodowanie ciągu wejściowego,
fizyczne puszczenie klawisza klawiatury powoduje pojawienie się ramki F0 lub E0, zdarzenie
to jest sygnalizowane zapaleniem linijki diodowej. Tym sposobem zostało rozróżnione
wciśnięcie + trzymanie klawisza od wciśnięcia i puszczenia. Puszczenie sygnalizuje zapalenie
się diod.
Poniżej została zamieszczona tabela kodów ASCII
.
Symbol
Kod
Symbol
Kod
klawisza
klawisza
0
48
C
67
1
49
D
68
2
50
E
69
3
51
F
70
4
52
G
71
5
53
H
72
6
54
I
73
7
55
J
74
8
56
K
75
9
57
L
76
A
65
M.
77
B
66
N
78
Symbol
O
P
Q
R
S
T
V
U
W
X
Y
Z
Kod
klawisza
79
80
81
82
83
84
85
86
87
88
89
90
Wyjścia SEGO i SEGY są podłączone do dekoderów sterujących wyświetlaczami
segmentowymi, wyjście LEDY do linijki diodowej
Ascii2seg i ascii2segy to bliźniacze dekodery zamieniające kody cyfr na sygnały
sterujące pracą wyświetlaczy segmentowych. Na podstawie wejścia ASCIIY wyprowadza
sekwencje bitów na wyjście SEGY. Zaimplementowane jest to w procesie coder1.
entity ascii2segy is
port(
CLK : in STD_LOGIC;
RST : in STD_LOGIC;
ASCIIY : in STD_LOGIC_VECTOR(3 downto 0);
SEGY : out STD_LOGIC_VECTOR(6 downto 0)
);
end ascii2segy;
architecture ascii2segy of ascii2segy is
begin
coder1:process(CLK,RST,ASCIIY)
begin
if (RST='1') then
SEGY <= "0000000";
elsif (CLK'event and CLK='0') then
if (ASCIIY="0001")then
SEGY <= "0010010";
elsif (ASCIIY="0010")then
SEGY <= "1011101";
……….
else
--0
-SEGY <= "1110111";
end if;
end if;
--with ASCIIY select
end process coder1;
end ascii2segy;
--1
--2
Sposób sterowania wyświetlaczem segmentowym został przedstawiony poniżej:
Sygnał SEGY został doprowadzony do wejść S0-S6 tak, że najstarszy bit ramki na wyjściu
SEGY odpowiada S0 itd.
Drugi wyświetlacz segmentowy sterowany jest w identyczny sposób przez identyczny
dekoder.
NOTKA INFORMACYJNA
FORMAT DANYCH Z KLAWIATURY:
DEKODOWANIE ASCII KLAWISZY:
Symbol
0
1
2
3
4
5
6
7
8
9
A
B
Kod
klawisza
48
49
50
51
52
53
54
55
56
57
65
66
Symbol
C
D
E
F
G
H
I
J
K
L
M.
N
Kod
klawisza
67
68
69
70
71
72
73
74
75
76
77
78
Symbol
O
P
Q
R
S
T
V
U
W
X
Y
Z
Kod
klawisza
79
80
81
82
83
84
85
86
87
88
89
90
NA WYŚWIETLACZACH WYŚWIETLANY JEST KOD NACIŚNIETEGO KLAWISZA W
ASCII. LINIJKA DIÓD GAŚNIE W MOMENCIE PUSZCZENIA KLAWISZA.
IMPLEMENTACJA NA XSV300PQ240
BLOKI:
Kbdecoder – „wyłapywanie” 8 bitów z ramki wysłanej przez klawiaturę
Decision – rozpoznanie rodzaju ramek: czy otrzymujemy MAKE CODE (naciśnięcie
klawisza) czy BREAK CODE (puszczenie klawisza).
Ps22ascii – ramka standardu PS/2 zostaje zamieniona na kod ASCII
Ascii2seg i Ascii2segy - dekodery zamieniające kody cyfr na sygnały sterujące pracą
wyświetlaczy segmentowych
SYGNAŁY:
CLK
- wejście, główny sygnał zegarowy
RST
- wejście, sygnał zerujący
KBCLK
- wejście, zegar z klawiatury (10-16.7 kHz)
KBDATA
- wejście, ramki wysyłane z klawiatury, synchronicznie z KBCLK
SEGO(6:0)
- wyjście, sterowanie pierwszym wyświetlaczem
SEGY(6:0)
- wyjście, sterowanie pierwszym wyświetlaczem
LEDY(9:0)
- wyjście, sterowanie linijką diód

Podobne dokumenty