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 ]
1Wstęp teoretyczny Poniżej jest przedstawiony wtyk PS/2: Male (Plug) Female (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 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. MAKE CODE to ramki wysyłane przy naciśnięciu 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 Q (15h) (MC). Chan A odpowiada zegarowi z klawiatury natomiast Chan B przedstawia ramkę wysyłaną w synchronizacji z tym zegarem: --- Należyzauważyć, że w przypadku przytrzymywania 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 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, jesttoukł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, 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: oraz wyjś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; 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 process coder; Wykonanie instrukcji warunkowej if powoduje zdekodowanie ciągu wejściowego, fizyczne puszczenie 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 od wciśnięcia i puszczenia. Puszczenie sygnalizuje zapalenie się diod.
Poniżej została zamieszczona tabela kodówascii. Symbol Kod 0 48 C 67 O 79 1 49 D 68 P 80 2 50 E 69 Q 81 3 51 F 70 R 82 4 52 G 71 S 83 5 53 H 72 T 84 6 54 I 73 V 85 7 55 J 74 U 86 8 56 K 75 W 87 9 57 L 76 X 88 A 65 M. 77 Y 89 B 66 N 78 Z 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ównawyjś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 --1 SEGY <= "0010010"; elsif (ASCIIY="0010")then --2 SEGY <= "1011101";. else --0 -- SEGY <= "1110111"; --with ASCIIY select end process coder1; end ascii2segy;
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.
FORMAT DANYCH Z KLAWIATURY: NOTKA INFORMACYJNA DEKODOWANIE ASCII KLAWISZY: 0 48 C 67 O 79 1 49 D 68 P 80 2 50 E 69 Q 81 3 51 F 70 R 82 4 52 G 71 S 83 5 53 H 72 T 84 6 54 I 73 V 85 7 55 J 74 U 86 8 56 K 75 W 87 9 57 L 76 X 88 A 65 M. 77 Y 89 B 66 N 78 Z 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 8bitów zramkiwysłanej przez klawiaturę Decision rozpoznanie rodzaju ramek: czy otrzymujemy MAKE CODE (naciśnięcie ) czy BREAK CODE (puszczenie ). Ps22ascii ramka standardu PS/2 zostaje zamieniona na kod ASCII Ascii2seg i Ascii2segy - dekodery zamieniające kody cyfr na sygnałysterują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